SSH in SSH schlägt mit "stdin: is not a tty" fehl

58

Ich versuche, mit ssh eine Verbindung zu Maschine 1 herzustellen und dann mit ssh eine Verbindung zu einer anderen Maschine 2 herzustellen, aber ich erhalte diesen Fehler.

ssh [email protected] 'ssh [email protected]'

stdin: is not a tty

Warum?

Jhonathan
quelle
1
Ich glaube nicht, dass Sie diese einfachen Anführungszeichen in der Sekunde brauchen ssh!
coffeMug

Antworten:

70

Wenn Sie einen Befehl mit ssh auf dem Remotecomputer ausführen, wird der Remotesitzung standardmäßig kein TTY zugewiesen. Auf diese Weise können Sie Binärdaten usw. übertragen, ohne sich mit TTY-Macken befassen zu müssen. Dies ist die Umgebung, in der der Befehl ausgeführt wird computerone.

Wenn Sie jedoch ssh ohne einen Remote-Befehl ausführen, weist es TTY zu, da Sie wahrscheinlich eine Shell-Sitzung ausführen. Dies wird vom ssh [email protected]Befehl erwartet , aber aufgrund der vorherigen Erklärung ist für diesen Befehl kein TTY verfügbar.

Wenn Sie eine Shell aktivieren möchten computertwo, verwenden Sie stattdessen diese Option, die die TTY-Zuweisung während der Remote-Ausführung erzwingt:

ssh -t [email protected] 'ssh [email protected]'

Dies ist normalerweise sinnvoll, wenn Sie am Ende der SSH-Kette eine Shell oder einen anderen interaktiven Prozess ausführen. Wenn Sie Daten übertragen -tmöchten , ist das Hinzufügen weder angebracht noch erforderlich , aber dann würde jeder ssh-Befehl einen datenerzeugenden oder -verbrauchenden Befehl enthalten, wie zum Beispiel:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
mrb
quelle
9

Es gibt eine bessere Möglichkeit, SSH als Relais zu verwenden: Verwenden Sie die ProxyCommandOption. Auf dem Client-Computer muss ein Schlüssel vorhanden sein, mit dem Sie sich beim zweiten Computer anmelden können (unter den meisten Umständen ist der öffentliche Schlüssel die empfohlene Methode zur Verwendung von SSH). Legen Sie dies in Ihre ~/.ssh/configund rennen ssh computertwo.

Host computerone
HostName computerone.com
UserName user

Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p

ncist netcat . Jede der verschiedenen verfügbaren Versionen ist geeignet.

Gilles 'SO - hör auf böse zu sein'
quelle
Müssen wir bei 'authorized_keys' auf computerone nicht eine "Proxy" -bezogene Zeile hinzufügen? Ich habe immer noch vor, die "Proxy" -Power von openSSH zu untersuchen, bin aber noch nicht dazu gekommen.
Felipe Alvarez
7

Es erwartet ein interaktives Terminal auf einem tty-Gerät auf dem Zwischenserver.

Wenn Sie diesen Befehl versuchen, sollte es funktionieren:

ssh user@computer1 -t "ssh otheruser@computer2"

Siehe man sshfür die -tOption.

roknir
quelle
2

Ich habe dieses Problem gelöst, indem ich RequestTTY Yes zu meiner ssh-Konfigurationsdatei unter ~ / .ssh / config hinzugefügt habe ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
John
quelle
1

Sie können die Option PROXY Jump in ssh verwenden

-J [user@]host[:port]
 Connect to the target host by first making a ssh connection to the jump host and then establishing a TCP forwarding to the ultimate destination from there.  Multiple jump hops may be specified
 separated by comma characters.  This is a shortcut to specify a ProxyJump configuration directive.

Wenn ich also eine Verbindung zu hostB herstellen muss, aber erst hostA durchlaufen muss, um dorthin zu gelangen. Normalerweise würde ich

 ssh hostA
 [user@hostA ~]$ ssh hostB

Ich mache das jetzt

ssh -J hostA hostB
[user@hostB ~]$
Nelaaro
quelle
0

Sie können eine SSH-Konfigurationsoption "RequestTTY" über die Befehlszeile überschreiben.

Mein Arbeitsbeispiel cd-serv-one.shstartet /bin/bashin der SSH-Sitzung, nachdem mehrere Befehle ausgeführt wurden:

#!/bin/bash

ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"

Und jetzt renne ich einfach los, ./cd-serv-one.shum eine benötigte SSH-Sitzung zu starten.

xorDiv
quelle