Respuestas:
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.com
comando 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"'
Hay una mejor manera de usar SSH como un relé: use la ProxyCommand
opció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/config
y corre ssh computertwo
.
Host computerone
HostName computerone.com
UserName user
Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p
nc
es netcat . Cualquiera de las varias versiones disponibles servirá.
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 ~]$
Puede anular una opción de configuración SSH "RequestTTY" desde la línea de comandos.
Mi ejemplo de trabajo cd-serv-one.sh
comienza /bin/bash
en 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.sh
para comenzar una sesión SSH necesaria.
ssh
!