脚本中的SSH命令会过早终止

时间:2015-08-11 11:12:41

标签: shell unix command-line ssh netcat

从myhost.mydomain.com开始,我启动了一个nc监听器。然后登录到另一台主机以启动netcat推送到我的主机:

nc -l 9999 > data.gz &
ssh repo.mydomain.com "cat /path/to/file.gz | nc myhost.mydomain.com 9999"

这两个命令是脚本的一部分。只有32K字节被发送到主机并且ssh命令终止,nc监听器获得EOF并且它也终止。

当我在myhost.mydomain.com上的命令行上运行ssh命令(即不作为脚本的一部分)时,将下载完整的文件。发生了什么事?

1 个答案:

答案 0 :(得分:1)

我认为您的脚本中还会发生其他因素导致此效果。例如,如果您在后台运行第二个命令并终止脚本,那么您的操作系统可能会在脚本清理期间终止后台命令。

同时查找set -o pipebreak,当其中一个命令以!= 0返回时,它终止管道中的所有命令。

第二点,这种方法看起来过于复杂。尝试将其减少到

ssh repo.mydomain.com "cat /path/to/file.gz" > data.gz

ssh将远程的stdout与本地连接起来。当你这样写时,它会更清楚:

ssh > data.gz repo.mydomain.com "cat /path/to/file.gz"

这样,你可以摆脱nc。据我所知,nc是同步的,所以第二次调用(发送数据)只应在所有数据发送和刷新后返回。