我正在尝试从 GitHub 部署,我想按数组顺序执行多个命令。我现在使用的代码包含在下面。
async.series([
...
// Deploy from GitHub
function (callback) {
// Console shizzle:
console.log('');
console.log('Deploying...'.red.bold);
console.log();
console.log();
var deployFunctions = [
{
command: 'cd ' + envOptions.folder + ' && pwd',
log: false
},
{
command: 'pwd'
},
{
command: 'su ' + envOptions.user,
log: false
},
{
command: 'git pull'
},
{
command: 'chmod 0777 * -R',
log: false
}
];
async.eachSeries(deployFunctions, function (item, callback) {
deployment.ssh2.exec(item.command, function (err, stream) {
deployment.logExec(item);
stream.on('data', function (data, extended) {
console.log(data.toString().trim());
console.log();
});
function done() {
callback(err);
}
stream.on('exit', done);
stream.on('end', done);
});
}, function () {
callback();
});
},
...);
但是,在我CD到正确的目录后,它会忘记它的位置并重新开始。
$ cd /some/folder && pwd
/some/folder
$ pwd
/root
@robertklep关于为什么你的cd
没有持续存在是正确的。每个命令调用一个不同的 shell 实例,该实例从其初始状态启动。您可以在每个命令前面加上cd /home/jansenstok/domains/alcoholtesterwinkel.com/public_html/ &&
作为快速解决方案,但实际上您正在为痛苦做好准备。你想要的是一个具有多行所有功能的 shell 脚本,而不是单个断开连接的命令列表。
查看使用 ssh2 的 sftp
函数将完整的 shell 脚本传输到远程机器作为步骤 1,通过 exec
( /bin/bash /tmp/your_deploy_script.sh
) 执行它作为步骤 2,然后删除脚本作为步骤 3。
这是一个超级古老的问题,但是我在尝试通过Node服务器管理ACE时遇到了这个问题。答案对我不起作用,但后来的几次搜索使我找到了对我非常有效的包装器。只是想在这里分享,因为这是我谷歌搜索中的顶部链接。它被称为ssh2shell,可以在这里找到:https://www.npmjs.com/package/ssh2shell
它使用起来非常简单,只需传递一个命令数组,它们就会一个接一个地运行,等待每个命令完成,然后再继续下一个命令。
一个实际的例子:
const client = new Client();
const cmds = [
'ls -lah n',
'cd /mnt n',
'pwd n',
'ls -lah n',
'exit n',
];
client.on('ready', () => {
console.log('Client :: ready');
client.shell((err, stream) => {
stream.on('close', (code) => {
console.log('stream :: closen', { code });
}).on('data', (myData) => {
console.log('stream :: datan', myData.toString());
}).on('exit', (code) => {
console.log('stream :: exitn', { code });
client.end();
}).on('error', (e) => {
console.log('stream :: errorn', { e });
rej(e);
});
for (let i = 0; i < cmds.length; i += 1) {
const cmd = cmds[i];
stream.write(`${cmd}`);
}
});
}).connect({
host: '127.0.0.1',
port: 22,
username: 'root',
password: 'root',
});
文档中的所有示例都使用stream.end()
导致创建新会话而不是使用当前会话。
你不会在程序上使用"shell",因为"Shell"命令会调用系统上的新终端并执行jop。您需要使用"exec"命令而不发出"退出"。默认的"exec"命令在执行您给出的命令后发出"exit"命令。