Избегайте сообщений «Общий доступ к <хосту> закрыт»

11

Я управляю множеством друпальных сайтов и пытаюсь автоматизировать некоторые вещи с помощью drush. Drush run локально вызывает drush на удаленном хосте через ssh, используя параметры, указанные в конфигурации для псевдонима сайта. Я делаю довольно много этих вызовов, поэтому для ускорения я использую постоянные ssh-соединения с ssh config следующим образом:

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.

Сообщение об общем подключении находится на stdout вместе с желаемым выводом (серьезно? Почему не stderr?), Поэтому возникают проблемы при попытке записать вывод в моих сценариях:

directory=$(drush @$alias drupal-directory $module)

Я ожидаю, что мастер-соединение будет тем, которое у меня уже было открыто, и оно не выглядит как закрытое. Так может быть, drush явно делает это новое соединение основным и закрывает его? В любом случае, есть ли способ подавить сообщение о закрытии соединения?

[Эта проблема в контексте drupal / drush, но я думаю, что это в основном ssh. Это правильный сайт тогда?]

РЕДАКТИРОВАТЬ:

Похоже, проблема связана с тем, где используется -tопция ssh. Я использую это, потому что svn-пароли необходимо вводить в разных точках, а без них -tзапросы пароля не отображаются. Может быть, есть еще один способ остановить потерю этих подсказок?

mc0e
источник
1
1) Да, это звучит так, как будто вы находитесь в правильном месте. 2) будет ли достаточно уродливого хака directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")?
Terdon
Это примерно то, что я делаю в настоящее время. Только это противнее, чем с переводами строк и тому подобным, и во многих местах, так что я действительно надеюсь, что есть какой-то способ заставить ssh просто молчать об этом.
mc0e
«Совместное подключение к 12.34.56.78 закрыто». вывод сообщения на самом деле на stderr, а не на stdout.
Дерексон
@Dereckson - нет, если кто-то не починил это.
mc0e

Ответы:

9

Условия сообщения

Согласно этой части переносимого исходного кода OpenSSH , для печати этого сообщения необходимы два условия:

  • псевдо-tty распределение включено (-t), как вы уже заметили
  • уровень журнала должен отличаться от уровня QUIET

Решение для подавления сообщения

  • Добавьте -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сообщениями).

Dereckson
источник
2
Согласно этому источнику, сообщение отправляется в stderr - возможно, это изменение по сравнению с версией, используемой спрашивающим? Если это так, возможно, стоит подумать об обновлении.
Тоби Спейт
Я не хочу, чтобы сообщения «Общее подключение к <хосту> закрыто», но обычно я хочу видеть сообщения об ошибках на stderr. Проблема не в ssh, а в drush при удаленной работе. Команда stderr удаленной команды очистки завершается в стандартный вывод локальной команды очистки.
mc0e
-o LogLevel=QUIETэто стандартная практика автоматизации удаленных инструментов.
Дерексон