Estou gerenciando muitos sites drupal e tentando automatizar algumas coisas usando o drush. O drush run chama localmente o drush no host remoto via ssh usando as opções especificadas na configuração para o alias do site. Estou fazendo muitas dessas chamadas, para acelerar, uso conexões ssh persistentes com a configuração ssh da seguinte maneira:
Host *
# see http://www.revsys.com/writings/quicktips/ssh-faster-connections.html
ControlMaster auto
ControlPath ~/tmp/%r@%h:%p
ControlPersist 3600
Recebo uma aceleração, mas também recebo mensagens assim:
$ drush @alias drupal-directory webform
/var/local/www/example.com/htdocs/sites/all/modules/contrib/webform
Shared connection to 12.34.56.78 closed.
A mensagem sobre a conexão compartilhada está no stdout, junto com a saída que eu quero (sério? Por que não o stderr?); Portanto, está causando problemas quando tento capturar a saída nos meus scripts:
directory=$(drush @$alias drupal-directory $module)
Espero que a conexão principal seja aquela que eu já tinha aberto, e não parece que ela esteja fechada. Então talvez o drush esteja explicitamente fazendo dessa nova conexão uma conexão mestre e fechando-a? De qualquer forma, existe uma maneira de suprimir a mensagem sobre o fechamento da conexão?
[Esta questão está em um contexto drupal / drush, mas acho que é fundamentalmente sobre ssh. Este é o site certo, então?]
EDITAR:
Parece que o problema é específico de onde a -t
opção para ssh está em uso. Estou usando isso porque as senhas svn precisam ser inseridas em vários pontos e -t
, sem elas , as solicitações de senha não são exibidas. Talvez haja outra maneira de impedir que essas solicitações sejam perdidas?
fonte
directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")
?Respostas:
Condições da mensagem
De acordo com esta parte do código-fonte portátil OpenSSH , são necessárias duas condições para imprimir esta mensagem:
Solução para suprimir a mensagem
-o LogLevel=QUIET
à suassh
linha de comando.LogLevel QUIET
nosHost
blocos relevantes .Por exemplo, eu uso essa linha em um script sh conectado a vários servidores para executar comandos do Docker, alguns potencialmente interativos:
SSH = "ssh -t -o LogLevel=QUIET"
Aviso: qualquer erro é descartado
Uma desvantagem deste método é que isso também suprime erros fatais do SSH.
Alternativa: registrar a saída stderr em vez de imprimi-la
Se o stderr ainda é considerado importante para obter, uma alternativa é redirecionar o stderr para o syslog, com
ssh -t -y
(mas você inundaria seu log com todas essasShared connection to <host> closed
mensagens).fonte
-o LogLevel=QUIET
é uma prática padrão em ferramentas remotas de automação.