Lo pseudo-terminale non verrà allocato perché stdin non è un terminale


14

Sto cercando di impostare l'hsh SSH automatico attraverso un server che non ha nc.

Funziona dalla riga di comando:

ssh -A gateway ssh steve@target

(Ho aggiunto la mia chiave pubblica all'agente SSH).

Tuttavia, aggiungendolo a ~ / .ssh / config non:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Tentare di forzare il problema con -tè divertente ma inutile.

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Di più -t? Non buono.

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

È possibile? La maggior parte dei tutorial (ad es. Http://www.arrfab.net/blog/?p=246 ) suggerisce l'utilizzo nc.


La conclusione è che netcat è richiesto?
MountainX-for-Monica,

Sembra così. In questo caso, sono stato in grado di installarlo, risolvendo il mio problema, ma non sempre ho quel lusso.
Steve Bennett,

Vedi la mia risposta qui sotto per due modi in cui sono stato in grado di farlo senza netcat.
MountainX-for-Monica,

Risposte:


13

SSH ProxyCommand senza netcat

Il ProxyCommand è molto utile quando gli host sono accessibili solo indirettamente. Con netcat è relativo stretto in avanti:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

Qui {gw} e {host} sono segnaposto per il gateway e l'host.

Ma è anche possibile quando netcat non è installato sul gateway:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

/ Dev / tcp è una funzione integrata di bash standard. I file non esistono. Per verificare se bash ha questa funzione integrata usa run:

cat < /dev/tcp/google.com/80 

... sul gateway.

Per assicurarsi che venga utilizzato bash, utilizzare:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

E funziona anche insieme a ControlMaster.

(Aggiornato il 22 ottobre per includere kill per ripulire il gatto in background) (Aggiornato il 3 marzo 2011 per rendere più chiari i segnaposto e spiegare / dev / tcp)

Credito al 100% a roland schulz. Ecco la fonte:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
vedi ulteriori informazioni utili nei commenti lì.

C'è anche altro qui:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

AGGIORNAMENTO : ecco qualcosa di nuovo da Marco

In riferimento a un ProxyCommand in ~ / .ssh / config dove si ha una linea come questa:

ProxyCommand ssh gateway nc localhost %p

Marco dice:

Non hai bisogno di netcat se usi una versione recente di OpenSSH. Puoi sostituire nc localhost% p con -W localhost:% p.

Il risultato sarebbe simile al seguente:

ProxyCommand ssh gateway -W localhost:%p

8

Grande T, non piccola t.

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

Il mio script usato per restituire quel messaggio, e non lo fa più.

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

Uso authorized_keyon the other_system per fare in modo che questo esegua un comando:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 

3

Prova questo:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip

Aspetta, come è diverso da quello che ho provato?
Steve Bennett,

@SteveBennett La differenza è che questo non tenta solo di allocare un TTY sul secondo sistema, ma anche sul primo.
Hauke ​​Laging

è esattamente lo stesso comando che ho citato con il risultato "divertente ma inutile"?
Steve Bennett,

@SteveBennett L'ho letto male, anzi. Il mio obiettivo era di avere -tentrambe le connessioni e l'ho visto in quello sbagliato. Ho modificato la mia risposta.
Hauke ​​Laging,

Ah. Bene, ancora non va bene. Ho provato tutte le combinazioni.
Steve Bennett,

-3

Potresti provare la seguente tecnica di ssh'ing in server1 seguita da ssh'ing in server2.

$ ssh -t user1@server1 ssh -t user2@server2 

Farlo in questo modo funziona per me.


1
Spiega di più ... Cosa fa questo comando e come è utile risolvere la risposta.
Tejas,
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.