ProxyCommand wird für mehrere Hops und für die sofortige Authentifizierung verwendet

17

Wie kann ich den folgenden Befehl mit umschreiben ProxyCommand?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

Das geht nicht

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

Ich bin mir seiner Verwendung mit bewusst nc, suche aber nach einer Möglichkeit, es mit Hopfen der Klasse 3+ zu verwenden, und verwende diese Option auch mit scp. Ich habe die ssh_configManpage überprüft , aber die Informationen sind zumindest für mich recht knapp.

BEARBEITEN

Ich habe versucht, ProxyCommandgeschachtelt in einer anderen zu verwenden, ProxyCommandwie unten vorgeschlagen, aber ich erhalte immer etwas in der folgenden Richtung

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.

Zum Glück, da 7.3 -Joder ProxyJumpdient mein Zweck - obwohl ich immer noch meine Tasteneinstellung umgehen muss.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server
1.61803
quelle

Antworten:

25

Die ncVersion wird nicht mehr empfohlen. Verwenden Sie den -WSchalter, der in neueren Versionen von OpenSSH enthalten ist. Außerdem müssen Sie die Konfiguration nicht auf andere Hosts kopieren! Die gesamte Konfiguration muss auf Ihrem Host durchgeführt werden und stört scpin keiner Weise. Erstellen Sie einfach eine Datei ~/.ssh/configmit:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

Und dann verbinden mit ssh serveroder verwenden scp file server:path/. Wenn Sie auf Oneliner bestehen (oder nicht sicher sind, was Sie mit ProxyCommandNesting meinen ), dann ist es, wie bereits erwähnt, die Hölle der Flucht:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

Sie müssen im Grunde von innen gehen.

Jakuje
quelle
Vielen Dank. Versuchte den Einzeiler, funktionierte nicht. Ich weiß nicht, ob es nur die Flucht ist. Können Sie das bitte noch einmal überprüfen? Können Sie auch erklären, warum Verschachtelung erforderlich ist und Verkettung nicht funktioniert?
1.61803
1
Naja, was heißt "geht nicht!" bedeuten? Verkettung funktioniert, aber nicht mit scp, da SCP SCP-Steuermeldungen erwartet, stattdessen SSH-Steuermeldungen erhält und fehlschlägt. Auf der anderen Seite ProxyCommandmacht das es transparent und daher bekommt das äußerste ssh(oder scp) die Nachrichten direkt vom anderen Ende.
Jakuje
Ich erhalte die > Aufforderung, wo auf die Unterbrechung der Zeilenfortsetzung gewartet wird - dh der Befehl wird nie ausgeführt.
1.61803
1
@ TrevorBoydSmith Da Sie ein externes Programm (nc) auf allen Proxy-Hosts installieren müssen. Für die E / A-Umleitung mit -W ist dies nicht erforderlich, und es muss lediglich der openssh-Client auf Ihrem Computer installiert sein.
Jakuje,
2
@ RomanDodin Doppel %sollte funktionieren: %%hin Ihrem Fall
Jakuje
-1

Ich habe das mit zwei Hops gemacht, aber es sollte für drei funktionieren. Am einfachsten ist es, die ~/.ssh/configDatei auf jedem Host festzulegen. Wenn Sie also aktiv sein hostaund zu hostdvia hostbund hostc gelangen möchten, können Sie Ihre Konfigurationen folgendermaßen festlegen:

In hosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

In hostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

In hostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

Sie können dann ssh hostdauf jedem der Hosts in der Kette und Sie werden Ihren Weg zu machen hostd.

Die Verwendung von Netcat für den Proxy stört nicht scp.

Wenn Sie aus irgendeinem Grund wirklich keine lokalen ~/.ssh/configDateien verwenden möchten , können Sie dies folgendermaßen tun hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd
DopeGhoti
quelle
Wie gesagt, ich bin mir der ncVerwendung bewusst . Können Sie den Befehl, mit dem ich gepostet habe, tatsächlich ProxyCommandals Option neu schreiben ?
1.61803
Sie erwähnen "Sie sind sich seiner Verwendung bewusst, möchten sie aber verwenden scp". Es stört nicht scp. Aber ich werde Ihnen in Kürze den komisch langen Befehl als Schnitt geben.
DopeGhoti
Vielen Dank. Könnten Sie Ihre Antwort einfach umschreiben und sich auf das ProxyCommandVerschachteln konzentrieren? Wenn Sie meinen Beitrag noch einmal lesen, werden Sie sehen, dass dies das Wesentliche ist. Ich dachte, ich könnte, anstatt wie Sie zu nisten, alle mittleren Knoten in einer Kette aneinanderreihen ProxyCommand. Ich frage mich immer noch, ob das irgendwie möglich ist.
1.61803
Das wird tatsächlich getan; Es ist viel schwieriger zu lesen als in situ- Konfigurationen, da alle geschachtelten (und zunehmend ausgeblendeten) Anführungszeichen vorhanden sind. Sie müssen dies so tun, weil Sie alle ProxyCommandAnweisungen zum nächsten Host in der Kette mitnehmen.
DopeGhoti
Das ist falsch. Die Konfiguration befindet sich nur auf Ihrem lokalen Computer und wird nicht auf die Hosts verteilt, während Sie versuchen, dies vorzuschlagen.
Jakuje