从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命令(即不作为脚本的一部分)时,将下载完整的文件。发生了什么事?
答案 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
是同步的,所以第二次调用(发送数据)只应在所有数据发送和刷新后返回。