ssh LocalCommand 奇怪 - 为什么我必须在后台运行 rsync?

ssh LocalCommand 奇怪 - 为什么我必须在后台运行 rsync?

当我使用 ssh 连接到目标服务器时,我使用 rsync 将文件复制到目标服务器。为此,我的 ssh 配置文件中有以下内容:-

ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
...
...
host dns
   LocalCommand rsync --update -a -e "ssh -o PermitLocalCommand=no" ~/.cfg/ dns:.cfg/ &
...
...

ControlMaster 位意味着在一次 ssh 到服务器后,后续的 ssh 连接不会要求输入密码。因此,rsync 运行时无需询问密码。

奇怪的是,如果配置文件中 LocalCommand 行末尾没有 & ,它就无法工作。为什么需要这个?如果没有 &,登录只会在输入密码后挂起,如果您按 CTRL/C,则会收到 rsync 错误,因为它已被 CTRL/C 中断,并且连接失败。 rsync 复制只需要几分之一秒,挂起是不是由于rsync需要很长时间。

我花了很长时间才找到如何使这项工作正常进行,最初没有 & 它只是挂起,正如我所说。然后我将 rsync 命令放入脚本中并调用它,它仍然挂起。我发现从脚本启动终端并运行 rsync 可以正常工作。然后我向后退一步,将 & 放在脚本中的 rsync 之后,这样就成功了,最后我得到了上面的内容。

这不是一个大问题,我对它的工作方式很满意,但我很想知道为什么需要 & 。

这都是在 Linux 上进行的,两端都运行 xubuntu/ubuntu。

答案1

可能会回答这篇博文:

最后,ControlMaster 有一些令人烦恼的地方,当您第一次遇到它时,它可能会让您感到非常困惑。由于所有 SSH 会话都通过第一个 SSH 会话发起的单个 TCP 连接进行多路复用,因此第一个会话必须保持活动状态,直到所有其他会话完成。当您注销充当主服务器的远程会话时,此问题将表现为明显的“挂起”,SSH 将只是​​坐在那里,而不是恢复本地提示符。如果您按 Ctrl-C 或以其他方式终止此会话,则您在该服务器上设置的所有其他会话都将丢失,因此请勿这样做。相反,当您注销所有其他会话时,主服务器将返回到本地提示符。

我通过添加 -S none 来列出 ssh 选项解决了类似的问题:

LocalCommand rsync --update -a -e "ssh -o PermitLocalCommand=no -S none" ~/.cfg/ dns:.cfg/

相关内容