gpt4 book ai didi

javascript - NodeJS PTY 计时命令

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:24 28 4
gpt4 key购买 nike

我正在尝试使用 Node 进程来启动交互式 docker session ,然后自动执行一些命令:

var spawn = require('pty.js').spawn;

var proc = spawn('docker', [ 'run', '-i', '-t', 'mycontainer' ], {
name: 'test',
rows: 30,
cols: 200,
cwd: process.env.HOME,
env: process.env
});

proc.on('data', function (data) {
console.log(data);
});

proc.write('cd /tmp');
proc.write('nvm install 0.10\r');
proc.write('npm install');

这似乎有效,唯一的问题是它似乎只是写入所有命令并触发它们。我似乎无法控制捕获单个命令的输出或错误。

我很好奇是否有更好的方法来解决这个问题?

最佳答案

您可以通过管道将流传输到此进程,但不建议这样做。

const { pipeline } = require('stream');
const { spawn } = require('node-pty')

const proc = spawn('docker', ['run', '--rm', '-ti', 'alpine', '/bin/sh'], {
name: 'xterm-color',
cwd: process.env.HOME,
env: process.env,
encoding: null,
});

pipeline(process.stdin, proc, (err) => err && console.warn(err.message))
pipeline(proc, process.stdout, (err) => err && console.warn(err.message))

maintainer have suggested不要像流一样使用 pty。只需要改变类似这样的管道即可。

(async (stream) => {
for await (const chunk of stream) {
proc.write(chunk.toString())
}
})(process.stdin).catch(console.warn)

要点是我们应该将字符串传递到 write 函数中。我们还应该期望字符串作为其输出。因此,我们不应该在对象中设置任何编码,使其默认输出utf8字符串。

关于您最初的问题。 proc.write('ls\r') 是正确的方法。请注意尾随的 \r 以虚拟地按 Enter 键。就像在普通终端中一样,当您执行命令时,不能同时触发第二个命令。命令将排队并一个接一个地运行。

输入:

const { spawn } = require('node-pty')

const proc = spawn('docker', ['run', '--rm', '-ti', '--network=host', 'node', '/bin/sh'], {
name: 'xterm-color',
cwd: process.env.HOME,
env: process.env,
});

proc.write('npm init -y\r')
proc.write('npm i eslint\r')
proc.write('ls node_modules /\r')

const disposable = proc.onData((text) => process.stdout.write(text))

const exitDisposable = proc.onExit(() => {
disposable.dispose()
exitDisposable.dispose()
})

输出:

npm i eslint
ls node_modules /
# Wrote to /package.json:

{
"name": "",
"version": "1.0.0",
"description": "",
"main": "index.js",
"directories": {
"lib": "lib"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}


npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN @1.0.0 No description
npm WARN @1.0.0 No repository field.

+ eslint@7.1.0
added 136 packages from 82 contributors and audited 136 packages in 9.461s

9 packages are looking for funding
run `npm fund` for details

found 0 vulnerabilities

# /:
bin etc lib64 node_modules package.json run sys var
boot home media opt proc sbin tmp
dev lib mnt package-lock.json root srv usr

node_modules:
@babel is-extglob
@types is-fullwidth-code-point
...
...
#

您会看到它在 npm install 完成之前写入了 ls,但随后又运行了。

另请注意,我使用 -ti 而不是仅使用 -t 作为 docker 参数。

关于javascript - NodeJS PTY 计时命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542530/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com