SSH隧道可防止我生成的脚本退出

时间:2020-01-12 20:04:22

标签: node.js bash ssh ssh-tunnel

我正在像这样在Node.js中执行bash脚本:

const script = child_process.spawn('local_script.sh');

const stdout = fs.createWriteStream('stdout');
const stderr = fs.createWriteStream('stderr');

script.stdout.pipe(stdout);
script.stderr.pipe(stderr);

script.on('close', function(code) {
  console.log('Script exited with code', code);
});

我的local_script.sh将脚本上传到我的远程服务器并执行:

#!/bin/bash

FILE=/root/remote_script.sh
HOST=123.456.78.9

scp remote_script.sh root@${HOST}:${FILE}
ssh root@${HOST} bash ${FILE}

最后,我的remote_script.sh应该打开SSH隧道(并执行与此问题无关的其他一些操作):

#!/bin/bash

REDIS_HOST=318.353.31.3

ssh -f -n root@${REDIS_HOST} -L 6379:127.0.0.1:6379 -N &

问题在于,即使我在后台打开SSH隧道,似乎我的remote_script.sh也从未退出过,因为从未调用过Node.js close事件。如果我打开SSH隧道,它将退出并按预期发出事件。

如何确保打开SSH隧道后脚本干净退出?请注意,我希望隧道在脚本完成后继续存在。

2 个答案:

答案 0 :(得分:0)

我还没有测试过,但是我的猜测是后台ssh会话(远程-> REDIS)使远程tty保持活动状态,从而阻止了本地->远程会话关闭。尝试将remote_script.sh更改为此:

#!/bin/bash

redis_host=318.353.31.3

nohup ssh -f -n "root@${redis_host}" -L 6379:127.0.0.1:6379 -N >/dev/null 2>&1 &

顺便说一句,请注意,我将变量名切换为小写;有许多具有特殊含义的全大写变量(包括HOST),并且重复使用其中的任何一个都会产生怪异的效果,因此脚本使用小写或大小写混合的变量是首选。另外,我将变量引用双引号,在这种情况下这并不重要,但是对于那些确实重要的情况来说,这是一个很好的一般习惯。

答案 1 :(得分:0)

我设法解决此问题的方法是在vh,px中使用ssh -a root${HOST} bash ${FILE}。请注意local_script.sh标志,该标志禁用我的转发ssh代理

重要的提示是,当我直接在远程计算机上运行-a时,它将完成所有预期的工作,包括干净的退出,但是当我尝试注销时,它将挂起。

很明显,当仍然有活动的连接时,ssh不想终止。当我输入remote_script.sh(显示有效的ssh连接)时,确实显示了我的转发ssh代理。