【问题标题】:SSH command within a script terminates prematurely脚本中的 SSH 命令过早终止
【发布时间】:2015-11-03 14:07:22
【问题描述】:

从 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 命令时,会下载完整的文件。怎么回事?

【问题讨论】:

  • 注意:你可以用ssh repo.mydomain.com "cat /path/to/file.gz" > data.gz实现同样的效果也许你的脚本更复杂,但也许有人忽略了简单的解决方案。

标签: shell unix command-line ssh netcat


【解决方案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 是同步的,所以第二次调用(发送数据)应该只在所有数据都发送并刷新后才返回。

【讨论】:

  • 我无法通过 ssh(或 scp)流式传输所有数据,因为发送方可用的计算能力较低。简单地 netcat 它更快(在我的情况下至少是 4-5 倍)。也没有管道破裂。我将第二个命令调整为:ssh repo.mydomain.com "nc myhost.mydomain.com 9999
  • 4KB 表示nc 在停止之前只能填充一次发送缓冲区(即 4KB)。尝试在命令前后将nc 包装在运行date 1>&2(将stdout 与stderr 连接)的脚本中,以查看它运行了多长时间。也可以试试nc -v;这可能会为您提供更多信息,写入/接收了多少字节。至于速度:加速可能是因为ssh 加密了连接。请参阅serverfault.com/questions/116875/… 了解优化方法
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2015-04-24
  • 2012-11-17
  • 2015-05-08
相关资源
最近更新 更多