脚本中的 SSH 命令提前终止

问题描述 投票:0回答:2

从 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 命令(即不作为脚本的一部分)时,会下载完整的文件。发生什么事了?

shell unix command-line ssh netcat
2个回答
1
投票

我认为您的脚本中还发生了其他事情导致了这种效果。例如,如果您也在后台运行第二个命令并终止脚本,则您的操作系统可能会在脚本清理期间终止后台命令。

还要查找

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

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

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

ssh
将远程的标准输出与本地连接)。这样写就更清楚了:

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

这样,你就可以摆脱

nc
。据我所知,
nc
是同步的,因此第二次调用(发送数据)应该仅在所有数据发送并刷新后才返回。


0
投票

我遇到了类似的问题,最后发现登录守护进程的配置被设置为在注销时终止所有进程。

您可以为 KillUserProcesses 进行系统守护进程登录配置(退出时),这会覆盖 nohup、disown a.s.o

该文件名为 /etc/systemd/logind.conf

# See logind.conf(5) for details.
[Login]
#NAutoVTs=6
#ReserveVT=6
KillUserProcesses=no

在我的情况下,KillUserProcesses - 选项默认设置为 yes。

© www.soinside.com 2019 - 2024. All rights reserved.