SSH dentro do SSH falha com “stdin: não é um tty”

54

Estou tentando conectar-me à máquina um com ssh e, em seguida, conecto a outra máquina dois com ssh, mas recebo esse erro.

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

stdin: is not a tty

Por quê?

    
por Jhonathan 18.09.2012 / 17:41

5 respostas

67

Por padrão, quando você executa um comando na máquina remota usando ssh, um TTY não é alocado para a sessão remota. Isso permite transferir dados binários, etc., sem ter que lidar com as peculiaridades do TTY. Este é o ambiente fornecido para o comando executado em computerone .

No entanto, quando você executa o ssh sem um comando remoto, ele aloca um TTY, porque é provável que você esteja executando uma sessão do shell. Isso é esperado pelo comando ssh [email protected] , mas devido à explicação anterior, não há TTY disponível para esse comando.

Se você quiser um shell em computertwo , use isso, o que forçará a alocação de TTY durante a execução remota:

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

Isso é normalmente apropriado quando você está executando um shell ou outro processo interativo no final da cadeia ssh. Se você fosse transferir dados, não seria apropriado nem necessário adicionar -t , mas todo comando ssh conteria um comando de produção ou consumo de dados, como:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
    
por 18.09.2012 / 17:57
9

Existe uma maneira melhor de usar o SSH como retransmissão: use a opção ProxyCommand . Você precisará ter uma chave na máquina do cliente que permita efetuar login no segundo computador (a chave pública é a maneira recomendada de usar o SSH na maioria das circunstâncias). Coloque isso no seu ~/.ssh/config e execute 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 . Qualquer uma das várias versões disponíveis serve.

    
por 19.09.2012 / 02:56
6

Ele está esperando um terminal interativo em um dispositivo tty no servidor intermediário.

Se você tentar este comando, deve funcionar:

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

Veja man ssh para a opção -t .

    
por 18.09.2012 / 17:56
1

Eu resolvi isso adicionando RequestTTY Yes ao meu arquivo de configuração ssh localizado em ~ / .ssh / config assim ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
    
por 09.05.2016 / 17:43
1

Você pode usar a opção PROXY Jump em 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.

Então, se eu precisar conectar-me ao hostB, mas tenho que passar pelo hostA primeiro para chegar lá. Normalmente eu faria

 ssh hostA
 [user@hostA ~]$ ssh hostB

Eu agora faço isso

ssh -J hostA hostB
[user@hostB ~]$
    
por 31.01.2018 / 10:29