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 user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

Por quê?


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 otheruser@computertwo.comcomando, 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 user@computerone.com 'ssh otheruser@computertwo.com'

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 user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'

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á.


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.


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

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 ~]$

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.