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' -t
option 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?
la source
directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")
suffirait?Réponses:
Conditions du message
Selon cette partie du code source portable OpenSSH , deux conditions sont nécessaires pour imprimer ce message:
Solution pour supprimer le message
-o LogLevel=QUIET
à votressh
ligne de commande.LogLevel QUIET
sous lesHost
blocs 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.
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 cesShared connection to <host> closed
messages).la source
-o LogLevel=QUIET
est une pratique standard dans les outils d'automatisation à distance.