Évitez les messages «Connexion partagée à <hôte> fermé»

11

Je gère de nombreux sites Drupal et j'essaie d'automatiser certaines choses à l'aide de Drush. Drush exécuté localement appelle drush sur l'hôte distant via ssh à l'aide des options spécifiées dans la configuration de l'alias de site. Je fais beaucoup de ces appels, donc pour l'accélérer, j'utilise des connexions ssh persistantes avec ssh config comme ceci:

Host *
  # see http://www.revsys.com/writings/quicktips/ssh-faster-connections.html
  ControlMaster auto
  ControlPath ~/tmp/%r@%h:%p
  ControlPersist 3600

Je reçois une accélération, mais je reçois aussi des messages comme ça:

$ drush @alias drupal-directory webform 

/var/local/www/example.com/htdocs/sites/all/modules/contrib/webform
Shared connection to 12.34.56.78 closed.

Le message sur la connexion partagée est sur stdout, avec la sortie que je veux (sérieusement? Pourquoi pas stderr?), Donc cela pose des problèmes lorsque j'essaie de capturer la sortie dans mes scripts:

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

Je m'attends à ce que la connexion principale soit celle que j'avais déjà ouverte, et cela ne semble pas fermé. Alors peut-être que le drush fait explicitement de cette nouvelle connexion une connexion principale et la ferme? Dans tous les cas, existe-t-il un moyen de supprimer le message concernant la fermeture de la connexion?

[Ce problème est dans un contexte drupal / drush, mais je pense qu'il s'agit fondamentalement de ssh. Est-ce que c'est le bon site alors?]

ÉDITER:

Il semble que le problème soit spécifique à l'endroit où l' -toption ssh est utilisée. J'utilise cela parce que les mots de passe svn doivent être entrés à différents points, et sans -t, les invites de mot de passe ne s'affichent pas. Peut-être existe-t-il un autre moyen d'empêcher la perte de ces invites?

mc0e
la source
1
1) Oui, il semble que vous soyez au bon endroit. 2) Un vilain hack comme ça directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")suffirait?
terdon
C'est à peu près ce que je fais actuellement. Seulement, c'est plus méchant que cela avec des sauts de ligne et des trucs à gérer également, et c'est dans beaucoup d'endroits, donc j'espère vraiment qu'il y a un moyen de faire en sorte que ssh reste silencieux à ce sujet.
mc0e
La "Connexion partagée au 12.34.56.78 est fermée." la sortie du message est en fait sur stderr, pas stdout.
Dereckson
@Dereckson - pas à moins que quelqu'un ne le répare.
mc0e

Réponses:

9

Conditions du message

Selon cette partie du code source portable OpenSSH , deux conditions sont nécessaires pour imprimer ce message:

  • l'allocation pseudo-tty est activée (-t), comme vous l'avez déjà remarqué
  • le niveau de journalisation doit être différent de QUIET

Solution pour supprimer le message

  • Ajoutez -o LogLevel=QUIETà votre sshligne de commande.
  • Editez ~ / .ssh / config et ajoutez LogLevel QUIETsous les Hostblocs appropriés .

Par exemple, j'utilise cette ligne dans un script sh se connectant à plusieurs serveurs pour exécuter des commandes Docker, certaines potentiellement interactives:

SSH = "ssh -t -o LogLevel=QUIET"

Avertissement: toute erreur est supprimée

Un inconvénient de cette méthode est qu'elle supprime également les erreurs fatales SSH.

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

Alternative: enregistrer la sortie stderr au lieu de l'imprimer

Si stderr est toujours considéré comme important à obtenir, une alternative est de rediriger stderr vers syslog à la place, avec ssh -t -y(mais alors vous inonderiez votre journal avec tous ces Shared connection to <host> closedmessages).

Dereckson
la source
2
Selon cette source, le message est envoyé à stderr - c'est peut-être un changement par rapport à la version utilisée par le questionneur? Si oui, cela vaut peut-être la peine d'envisager une mise à niveau.
Toby Speight
Je ne veux pas vraiment les messages "Connexion partagée à <hôte> fermé", mais généralement je veux voir des messages d'erreur sur stderr. Le problème n'est pas avec ssh, c'est avec drush lors d'un fonctionnement à distance. Le stderr de la commande drush à distance se termine sur la sortie standard de la commande drush locale.
mc0e
-o LogLevel=QUIETest une pratique standard dans les outils d'automatisation à distance.
Dereckson