O SSH dentro do SSH falha com "stdin: is not tty"

58

Estou tentando conectar a uma máquina com ssh e depois a outra máquina com ssh, mas recebo esse erro.

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

stdin: is not a tty

Por quê?

Jhonathan
fonte
1
Eu não acho que você precise dessas aspas simples por volta do segundo ssh!
fácil fazer o download

Respostas:

70

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 precisar lidar com peculiaridades do TTY. Este é o ambiente fornecido para o comando executado 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 de shell. Isso é esperado pelo ssh [email protected]comando, mas devido à explicação anterior, não há TTY disponível para esse comando.

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

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

Isso geralmente é apropriado quando você está executando um shell ou outro processo interativo no final da cadeia ssh. Se você estava indo para transferir dados, não é apropriado nem necessário adicionar -t, mas todos os comandos ssh conteriam um comando de produção ou consumo de dados, como:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
mrb
fonte
9

Existe uma maneira melhor de usar o SSH como um relé: use a ProxyCommandopção Você precisará ter uma chave na máquina cliente que permita efetuar login no segundo computador (chave pública é a maneira recomendada de usar SSH na maioria das circunstâncias). Coloque isso no seu ~/.ssh/confige 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 servirá.

Gilles 'SO- parar de ser mau'
fonte
Não somos obrigados a adicionar uma linha relacionada ao "proxy" nas 'chaves_computadas' no computador? Eu continuo tentando entender o poder 'proxy' do openSSH, mas ainda não cheguei a isso.
Felipe Alvarez
7

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

Se você tentar este comando, ele deverá funcionar:

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

Veja man ssha -topção.

roknir
fonte
2

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

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
John
fonte
1

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

Portanto, se eu precisar me conectar ao hostB, mas preciso passar pelo hostA primeiro para chegar lá. Normalmente eu faria

 ssh hostA
 [user@hostA ~]$ ssh hostB

Agora faço isso

ssh -J hostA hostB
[user@hostB ~]$
nelaaro
fonte
0

Você pode substituir uma opção de configuração SSH "RequestTTY" na linha de comando.

Meu exemplo de trabalho cd-serv-one.shcomeça /bin/bashna sessão SSH após executar vários comandos:

#!/bin/bash

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

E agora eu apenas corro ./cd-serv-one.shpara iniciar uma sessão SSH necessária.

xorDiv
fonte