SSH dentro de SSH falla con "stdin: no es un tty"


58

Estoy tratando de conectarme a la máquina uno con ssh y luego conectarme a otra máquina dos con ssh, pero aparece este error.

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

stdin: is not a tty

¿Por qué?


1
¡No creo que necesites esas comillas simples alrededor del segundo ssh!
coffeMug

Respuestas:


70

De forma predeterminada, cuando ejecuta un comando en la máquina remota utilizando ssh, no se asigna un TTY para la sesión remota. Esto le permite transferir datos binarios, etc. sin tener que lidiar con caprichos de TTY. Este es el entorno proporcionado para el comando ejecutado en computerone.

Sin embargo, cuando ejecuta ssh sin un comando remoto, SÍ asigna un TTY, porque es probable que esté ejecutando una sesión de shell. El ssh otheruser@computertwo.comcomando espera esto , pero debido a la explicación anterior, no hay TTY disponible para ese comando.

Si desea un shell activado computertwo, use esto en su lugar, lo que forzará la asignación de TTY durante la ejecución remota:

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

Esto suele ser apropiado cuando finalmente está ejecutando un shell u otro proceso interactivo al final de la cadena ssh. Si iba a transferir datos, no es apropiado ni necesario agregarlos -t, pero cada comando ssh contendría un comando productor o consumidor de datos, como:

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

9

Hay una mejor manera de usar SSH como un relé: use la ProxyCommandopción. Deberá tener una clave en la máquina del cliente que le permita iniciar sesión en la segunda computadora (la clave pública es la forma recomendada de usar SSH en la mayoría de las circunstancias de todos modos). Pon esto en tu ~/.ssh/configy corre ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

nces netcat . Cualquiera de las varias versiones disponibles servirá.


¿No estamos obligados a agregar una línea relacionada con "proxy" en 'autorizado_keys' en computerone? Sigo teniendo la intención de investigar el poder 'proxy' de openSSH, pero todavía no lo he logrado.
Felipe Alvarez

7

Se espera una terminal interactiva en un dispositivo tty en el servidor intermedio.

Si prueba este comando, debería funcionar:

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

Ver man sshpara la -topción.


2

Resolví esto agregando RequestTTY Sí a mi archivo de configuración ssh ubicado en ~ / .ssh / config de esta manera ...

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

1

Puede usar la opción PROXY Jump en 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.

Entonces, si necesito conectarme a hostB pero primero tengo que pasar por hostA para llegar allí. Normalmente lo haría

 ssh hostA
 [user@hostA ~]$ ssh hostB

Ahora hago esto

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

0

Puede anular una opción de configuración SSH "RequestTTY" desde la línea de comandos.

Mi ejemplo de trabajo cd-serv-one.shcomienza /bin/bashen la sesión SSH después de ejecutar varios comandos:

#!/bin/bash

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

Y ahora solo corro ./cd-serv-one.shpara comenzar una sesión SSH necesaria.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.