Я управляю множеством друпальных сайтов и пытаюсь автоматизировать некоторые вещи с помощью 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
запросы пароля не отображаются. Может быть, есть еще один способ остановить потерю этих подсказок?
источник
directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")
?Ответы:
Условия сообщения
Согласно этой части переносимого исходного кода OpenSSH , для печати этого сообщения необходимы два условия:
Решение для подавления сообщения
-o LogLevel=QUIET
к своейssh
командной строке.LogLevel QUIET
под соответствующиеHost
блоки.Например, я использую эту строку в скрипте sh, подключающемся к нескольким серверам, для запуска команд Docker, некоторые из которых могут быть интерактивными:
SSH = "ssh -t -o LogLevel=QUIET"
Предупреждение: любая ошибка отбрасывается
Недостатком этого метода является то, что он также подавляет фатальные ошибки SSH.
Альтернатива: записывать вывод stderr вместо печати
Если stderr по-прежнему считается важным для получения, альтернативой является перенаправление stderr в syslog, вместо этого
ssh -t -y
(но тогда вы переполните свой журнал всеми этимиShared connection to <host> closed
сообщениями).источник
-o LogLevel=QUIET
это стандартная практика автоматизации удаленных инструментов.