Administro muchos sitios de drupal e intento automatizar algunas cosas usando drush. Drush ejecuta localmente llama a drush en el host remoto a través de ssh usando las opciones especificadas en la configuración para el alias del sitio. Estoy haciendo muchas de estas llamadas, así que para acelerarlo uso conexiones ssh persistentes con ssh config de esta manera:
Host *
# see http://www.revsys.com/writings/quicktips/ssh-faster-connections.html
ControlMaster auto
ControlPath ~/tmp/%r@%h:%p
ControlPersist 3600
Me acelera, pero también recibo mensajes como este:
$ drush @alias drupal-directory webform
/var/local/www/example.com/htdocs/sites/all/modules/contrib/webform
Shared connection to 12.34.56.78 closed.
El mensaje sobre la conexión compartida está en stdout, junto con la salida que quiero (en serio, ¿por qué no stderr?), Por lo que está causando problemas cuando intento capturar la salida en mis scripts:
directory=$(drush @$alias drupal-directory $module)
Sin embargo, espero que la conexión maestra sea una que ya tenía abierta, y no parece que esté cerrada. Entonces, ¿quizás drush está haciendo explícitamente esta nueva conexión y la está cerrando? En cualquier caso, ¿hay alguna forma de suprimir el mensaje sobre el cierre de la conexión?
[Este problema está en un contexto drupal / drush, pero creo que se trata fundamentalmente de ssh. ¿Es este el sitio correcto entonces?]
EDITAR:
Parece que el problema es específico de dónde -t
está en uso la opción de ssh. Estoy usando esto porque las contraseñas svn deben ingresarse en varios puntos y -t
, sin ellas , las solicitudes de contraseña no se muestran. ¿Quizás haya otra forma de evitar que esas indicaciones se pierdan?
fuente
directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")
sería suficiente un truco feo ?Respuestas:
Condiciones del mensaje.
Según esta parte del código fuente portátil de OpenSSH , se necesitan dos condiciones para imprimir este mensaje:
Solución para suprimir el mensaje
-o LogLevel=QUIET
a sussh
línea de comando.LogLevel QUIET
debajo de losHost
bloques relevantes .Por ejemplo, uso esta línea en un script sh que se conecta a varios servidores para ejecutar comandos Docker, algunos potencialmente interactivos:
SSH = "ssh -t -o LogLevel=QUIET"
Advertencia: cualquier error se descarta
Un inconveniente de este método es que también suprime los errores fatales de SSH.
Alternativa: salida de log stderr en lugar de imprimirla
Si todavía se considera importante obtener stderr, una alternativa es redirigir stderr a syslog en su lugar, con
ssh -t -y
(pero luego inundaría su registro con todos esosShared connection to <host> closed
mensajes).fuente
-o LogLevel=QUIET
es una práctica estándar en herramientas remotas de automatización.