SSH dentro SSH fallisce con "stdin: non è un tty"


58

Sto provando a connettermi alla macchina uno con ssh e quindi connettermi a un'altra macchina due con ssh, ma ottengo questo errore.

ssh user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

Perché?


1
Non penso che tu abbia bisogno di quelle virgolette singole intorno alla seconda ssh!
coffeMug

Risposte:


70

Per impostazione predefinita, quando si esegue un comando sul computer remoto utilizzando ssh, un TTY non viene allocato per la sessione remota. Ciò consente di trasferire dati binari, ecc. Senza dover gestire le stranezze TTY. Questo è l'ambiente fornito per il comando eseguito su computerone.

Tuttavia, quando si esegue ssh senza un comando remoto, esso alloca un TTY, perché è probabile che si stia eseguendo una sessione di shell. Ciò è previsto dal ssh otheruser@computertwo.comcomando, ma a causa della spiegazione precedente, non è disponibile TTY per quel comando.

Se vuoi una shell attiva computertwo, usa questa opzione, che forzerà l'allocazione TTY durante l'esecuzione remota:

ssh -t user@computerone.com 'ssh otheruser@computertwo.com'

Questo è in genere appropriato quando alla fine si esegue una shell o un altro processo interattivo alla fine della catena SSH. Se avessi intenzione di trasferire dati, non è né appropriato né richiesto aggiungere -t, ma ogni comando ssh conterrebbe un comando di produzione o di consumo di dati, come:

ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'

9

C'è un modo migliore per usare SSH come relè: usare l' ProxyCommandopzione. Dovrai disporre di una chiave sul computer client che ti consenta di accedere al secondo computer (la chiave pubblica è comunque il modo consigliato di utilizzare SSH nella maggior parte dei casi). Metti questo nel tuo ~/.ssh/confige corri ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

ncè netcat . Qualsiasi delle diverse versioni disponibili lo farà.


Non è necessario aggiungere una riga correlata al "proxy" in "authorized_keys" su computerone? Continuo a cercare il potere "proxy" di openSSH, ma non ci sono ancora riuscito.
Felipe Alvarez,

7

Si aspetta un terminale interattivo su un dispositivo tty sul server intermedio.

Se provi questo comando, dovrebbe funzionare:

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

Vedi man sshper l' -topzione.


2

Ho risolto questo aggiungendo RequestTTY Sì al mio file di configurazione ssh situato in ~ / .ssh / config in questo modo ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes

1

È possibile utilizzare l'opzione PROXY Jump in ssh

-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.

Quindi, se ho bisogno di connettermi a hostB ma devo prima passare attraverso hostA per arrivarci. Normalmente lo farei

 ssh hostA
 [user@hostA ~]$ ssh hostB

Adesso lo faccio

ssh -J hostA hostB
[user@hostB ~]$

0

È possibile ignorare un'opzione di configurazione SSH "RequestTTY" dalla riga di comando.

Il mio esempio di lavoro cd-serv-one.shinizia /bin/bashnella sessione SSH dopo aver eseguito più comandi:

#!/bin/bash

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

E ora corro solo ./cd-serv-one.shper iniziare una sessione SSH necessaria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.