我正在管理很多 drupal 站点,并尝试使用 drush 自动化一些东西。 Drush 在本地运行,使用站点别名配置中指定的选项,通过 ssh 调用远程主机上的 drush。我进行了大量此类调用,因此为了加快速度,我使用带有 ssh 配置的持久 ssh 连接,如下所示:
Host *
# see http://www.revsys.com/writings/quicktips/ssh-faster-connections.html
ControlMaster auto
ControlPath ~/tmp/%r@%h:%p
ControlPersist 3600
我得到了加速,但我也收到了这样的消息:
$ drush @alias drupal-directory webform
/var/local/www/example.com/htdocs/sites/all/modules/contrib/webform
Shared connection to 12.34.56.78 closed.
有关共享连接的消息位于标准输出上,以及我想要的输出(说真的?为什么不是标准错误?),因此当我尝试在脚本中捕获输出时,它会导致问题:
directory=$(drush @$alias drupal-directory $module)
我希望主连接是我已经打开的连接,但它看起来并没有关闭。那么也许 drush 明确地将这个新连接设为主连接并关闭它?无论如何,有没有办法抑制有关连接关闭的消息?
[这个问题是在 drupal / drush 上下文中,但我认为它本质上是关于 ssh 的。那么这是正确的网站吗?]
编辑:
看起来问题是特定于-t
使用 ssh 选项的地方。我使用它是因为需要在各个点输入 svn 密码,如果没有-t
,则不会显示密码提示。也许还有另一种方法可以阻止这些提示丢失?
答案1
消息的条件
根据这部分是OpenSSH移植源码,在 OpenSSH 8.7 之前打印此消息需要两个条件:
- 正如您已经注意到的,伪 tty 分配已启用 (-t)
- 日志级别必须不同于 QUIET
从 OpenSSH 8.8 开始,条件是:
- 与之前一样,启用伪 tty 分配 (-t)
- 日志级别必须更大
看这次提交OpenSSH 便携版的变化。
抑制消息的解决方案
- 升级到 OpenSSH 8.8 或更高版本
- 添加
-o LogLevel=QUIET
到您的ssh
命令行。 - 编辑 ~/.ssh/config 并添加到
LogLevel QUIET
相关Host
块下。
例如,我在连接到多个服务器的 sh 脚本中使用此行来运行 Docker 命令,其中一些命令可能是交互式的:
SSH = "ssh -t -o LogLevel=QUIET"
警告:任何错误都会被丢弃
此方法的缺点是这也会抑制 SSH 致命错误。
$ ssh -t -o LogLevel=QUIET notexisting.notld ssh anotherone.notld
$
替代方案:记录 stderr 输出而不是打印它
如果 stderr 仍然被认为很重要,另一种方法是将 stderr 重定向到 syslog ssh -t -y
(但是这样你就会用所有这些消息淹没你的日志Shared connection to <host> closed
)。