2014-03-25 4 views
5

ich ein paar Blogs über .ssh/config gesehen haben und proxycommandWas ist der Unterschied zwischen ssh Proxycommand -W ist, nc, exec nc

jetzt, was der Unterschied zwischen

den nächsten Befehlen

ProxyCommand ssh proxyserver -W [%h]:%p

ProxyCommand ssh proxyserver nc -q0 %h %p 2> /dev/null

ProxyCommand ssh proxyserver exec nc -q0 %h %p 2> /dev/null

Einige davon Befehle funktionieren auf einigen Computern und funktionieren nicht auf anderen Computern.

+0

“.. "Arbeite nicht an anderen" ist eher leer ... – twalberg

Antwort

10

Hier ist, wie ich es verstehe:


  1. ProxyCommand ssh proxyserver -W [%h]:%p

    • Die -W Option in neue (er) Versionen von OpenSSH gebaut wird, so wird dies nur auf Maschinen arbeiten, die haben Sie die Mindestversion (5.4, es sei denn, Ihre Distribution hat irgendwelche Funktionen zurückportiert, zB RHEL6 OpenSSH 5.3p1 enthält diese Funktion). Per dem Release Notes: http://www.openssh.com/txt/release-5.4

      Added a 'netcat-Modus' auf ssh (1): "ssh -W host: port ..." Dies verbindet stdio auf dem Client an einem einzigen Port-Weiterleitung auf dem Server. Dies ermöglicht beispielsweise die Verwendung von ssh als ProxyCommand zum Routen von Verbindungen über zwischengeschaltete Server.

  2. ProxyCommand ssh proxyserver nc -q0 %h %p 2> /dev/null

    • Bevor die -W Option verfügbar war, haben wir den nc (oder netcat) Dienstprogramm. nc können Sie TCP & UDP-Pakete an angegebene (alternative) Standorte weiterleiten und verhält sich im Wesentlichen genauso wie ssh -W (wie ssh -W wurde nach nc modelliert). Damit diese Variante funktioniert, müssen die Zwischenhosts nc installiert sein und die Option AllowTcpForwarding muss im sshd_config des Hosts aktiviert sein (Standard: ja). Die Option -q0 bis nc soll (angeblich) für Beruhigungsfehler sorgen, aber ich kann nicht finden, welche Version diese eingeführt wurde. (Anmerkung: 2> /dev/null wahrscheinlich ist ziemlich ssh Fehler, aber man kann ssh -q stattdessen verwenden.)
  3. ProxyCommand ssh proxyserver exec nc -q0 %h %p 2> /dev/null

    • Dies ist sehr ähnlich wie die zweite Variante, außer Sie anrufen Die integrierte Funktion der Shell exec. Ich bin mir nicht sicher, aber ich glaube, es gibt keinen Unterschied zwischen dem Einschließen oder Ausschließen exec von dem ProxyCommand; Diese Variation sollte überall funktionieren, wo die obige Variation ist.Zum Beispiel sagt die Bash Handbuch etwas wie folgt aus:

      exec [-cl] [-a name] [Befehl [Argumente]]

      Wenn Befehl angegeben ist, es die Shell ersetzt. Kein neuer Prozess wird erstellt. Die Argumente werden zu den Argumenten für den Befehl. Wenn die Option -l angegeben wird, fügt die Shell einen Bindestrich in den Anfang des nullten Arguments ein, das an den Befehl übergeben wird. Das ist es, was login (1) tut. Die Option -c bewirkt, dass der Befehl mit einer leeren Umgebung ausgeführt wird. Wenn -a angegeben wird, übergibt die Shell den Namen als das nullte Argument an den ausgeführten Befehl. Wenn der Befehl aus Gründen nicht für ausgeführt werden kann, wird eine nicht interaktive Shell beendet, es sei denn, die Shell-Option execfail ist aktiviert, in diesem Fall gibt sie einen Fehler zurück. Eine interaktive Shell gibt einen Fehler zurück, wenn die Datei nicht ausgeführt werden kann. Wenn Befehl nicht angegeben ist, werden alle Umleitungen Wirkung in der aktuellen Shell nehmen und der Rückgabestatus ist 0. Wenn es eine Umleitung Fehler ist, ist der Rückgabestatus 1.

+0

Ich habe deinen Kommentar für eine Weile verpasst und danke für die Erläuterung. Aber es gibt einen Unterschied zwischen 2. und 3. weil beide nicht immer gleichzeitig an einigen Maschinen arbeiten (einer arbeitet, während der andere nicht). Der Unterschied zwischen -W und nc wurde erwartet, aber ich habe keine Ahnung, warum ich Unterschiede zwischen "exec nc" und nur "nc" sehe. – zidarsk8

+2

'exec' beendet die Shell und ersetzt sie durch den 'nc'-Prozess, anstatt' nc' in einem Unterprozess auszuführen. Es ist eine gute Übung, da die Shell an diesem Punkt nicht benötigt wird und der Prozessbaum ohne eine unnötige Shell in der Kette sauberer ist, aber es sollte nicht beeinflussen, ob der Server-Sprung funktioniert oder nicht. In einigen Fällen, wie beim Ausführen von Diensten in einem Supervisor, ist es wichtig, dass die Signalisierung ordnungsgemäß funktioniert, aber das ist hier kein Faktor. – clacke

Verwandte Themen