Evite los mensajes de "Conexión compartida a <host> cerrado"

11

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 -testá 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?

mc0e
fuente
1
1) Sí, ciertamente parece que estás en el lugar correcto. 2) ¿ directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")sería suficiente un truco feo ?
terdon
Eso es más o menos lo que estoy haciendo en este momento. Solo que es más desagradable que eso con los saltos de línea y otras cosas con las que lidiar, y está en muchos lugares, así que realmente espero que haya alguna forma de hacer que ssh se quede callado al respecto.
mc0e
La "Conexión compartida a 12.34.56.78 cerrada". La salida del mensaje está realmente en stderr, no en stdout.
Dereckson el
@Dereckson, no a menos que alguien lo haya arreglado.
mc0e

Respuestas:

9

Condiciones del mensaje.

Según esta parte del código fuente portátil de OpenSSH , se necesitan dos condiciones para imprimir este mensaje:

  • la asignación de pseudo-tty está habilitada (-t), como ya ha notado
  • el nivel de registro debe ser diferente de QUIET

Solución para suprimir el mensaje

  • Añadir -o LogLevel=QUIETa su sshlínea de comando.
  • Edite ~ / .ssh / config y agregue LogLevel QUIETdebajo de los Hostbloques 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.

$ ssh -t -o LogLevel=QUIET notexisting.notld ssh anotherone.notld
$

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 esos Shared connection to <host> closedmensajes).

Dereckson
fuente
2
Según esa fuente, el mensaje va a stderr, ¿tal vez sea un cambio en comparación con la versión utilizada por el interrogador? Si es así, quizás valga la pena considerar una actualización.
Toby Speight
Realmente no quiero los mensajes "Conexión compartida a <host> cerrado", pero generalmente quiero ver mensajes de error en stderr. El problema no es con ssh, es con drush cuando se opera de forma remota. El stderr del comando drush remoto está terminando en stdout del comando drush local.
mc0e
-o LogLevel=QUIETes una práctica estándar en herramientas remotas de automatización.
Dereckson