Vermeiden Sie Nachrichten über die gemeinsame Nutzung von <Host> geschlossen

11

Ich verwalte viele Drupal-Sites und versuche, einige Dinge mit Drush zu automatisieren. Drush run local ruft drush auf dem Remote-Host über ssh auf, wobei die in der Konfiguration für den Site-Alias ​​angegebenen Optionen verwendet werden. Ich mache ziemlich viele dieser Aufrufe. Um dies zu beschleunigen, verwende ich dauerhafte SSH-Verbindungen mit der SSH-Konfiguration wie folgt:

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

Ich bekomme eine Beschleunigung, aber ich bekomme auch Nachrichten wie folgt:

$ drush @alias drupal-directory webform 

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

Die Nachricht über die gemeinsam genutzte Verbindung befindet sich zusammen mit der gewünschten Ausgabe auf stdout (ernsthaft? Warum nicht stderr?). Daher verursacht sie Probleme, wenn ich versuche, die Ausgabe in meinen Skripten zu erfassen:

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

Ich erwarte, dass die Master-Verbindung eine ist, die ich bereits geöffnet hatte, und sie sieht nicht so geschlossen aus. Vielleicht macht drush diese neue Verbindung explizit zu einer Master-Verbindung und schließt sie? Gibt es in jedem Fall eine Möglichkeit, die Meldung über das Schließen der Verbindung zu unterdrücken?

[Dieses Problem befindet sich in einem Drupal / Drush-Kontext, aber ich denke, es geht im Wesentlichen um ssh. Ist das dann die richtige Seite?]

BEARBEITEN:

Es sieht so aus, als ob das Problem spezifisch dafür ist, wo die -tOption für ssh verwendet wird. Ich verwende dies, weil SVN-Passwörter an verschiedenen Stellen eingegeben werden müssen und ohne sie -tdie Passwortabfragen nicht angezeigt werden. Vielleicht gibt es eine andere Möglichkeit, um zu verhindern, dass diese Eingabeaufforderungen verloren gehen?

mc0e
quelle
1
1) Ja, es hört sich sicher so an, als wären Sie am richtigen Ort. 2) Wäre ein hässlicher Hack wie directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")genug?
Terdon
Das ist ungefähr das, was ich derzeit mache. Nur ist es schlimmer als das mit Line-Feeds und anderen Dingen, mit denen man sich befassen muss, und es gibt viele Orte, also hoffe ich wirklich, dass es eine Möglichkeit gibt, ssh dazu zu bringen, einfach nur ruhig darüber zu sein.
mc0e
Die "Gemeinsame Verbindung zu 12.34.56.78 geschlossen." Die Nachrichtenausgabe erfolgt tatsächlich auf stderr, nicht auf stdout.
Dereckson
@Dereckson - nicht, wenn jemand es behoben hat.
mc0e

Antworten:

9

Bedingungen der Nachricht

Gemäß diesem Teil des tragbaren OpenSSH-Quellcodes sind zwei Bedingungen erforderlich, um diese Nachricht zu drucken:

  • Die Pseudo-tty-Zuordnung ist aktiviert (-t), wie Sie bereits bemerkt haben
  • Die Protokollstufe muss sich von QUIET unterscheiden

Lösung zum Unterdrücken der Nachricht

  • Fügen Sie -o LogLevel=QUIETIhrer sshBefehlszeile hinzu.
  • Bearbeiten Sie ~ / .ssh / config und fügen Sie sie LogLevel QUIETunter den entsprechenden HostBlöcken hinzu.

Zum Beispiel verwende ich diese Zeile in einem sh-Skript, das eine Verbindung zu mehreren Servern herstellt, um Docker-Befehle auszuführen, von denen einige möglicherweise interaktiv sind:

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

Warnung: Jeder Fehler wird verworfen

Ein Nachteil dieser Methode ist, dass dadurch auch schwerwiegende SSH-Fehler unterdrückt werden.

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

Alternative: Protokollieren Sie die stderr-Ausgabe, anstatt sie zu drucken

Wenn stderr immer noch als wichtig erachtet wird, besteht eine Alternative darin, stderr stattdessen mit auf syslog umzuleiten ssh -t -y(aber dann würden Sie Ihr Protokoll mit all diesen Shared connection to <host> closedNachrichten überfluten ).

Dereckson
quelle
2
Laut dieser Quelle geht die Nachricht an stderr - vielleicht ist das eine Änderung gegenüber der vom Fragesteller verwendeten Version? Wenn ja, lohnt es sich vielleicht, ein Upgrade in Betracht zu ziehen.
Toby Speight
Ich möchte nicht wirklich, dass die Meldung "Gemeinsame Verbindung zu <Host> geschlossen" angezeigt wird, aber im Allgemeinen möchte ich Fehlermeldungen auf stderr sehen. Das Problem liegt nicht bei ssh, sondern bei drush bei Remote-Betrieb. Das stderr des Remote-Drush-Befehls wird auf dem Standard des lokalen Drush-Befehls beendet.
mc0e
-o LogLevel=QUIETist eine Standardpraxis in Remote-Tools für die Automatisierung.
Dereckson