避免“共享连接到已关闭”消息

避免“共享连接到已关闭”消息

我正在管理很多 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)。

相关内容