Respostas:
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.com
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 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"'
Existe uma maneira melhor de usar o SSH como um relé: use a ProxyCommand
opçã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/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 servirá.
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 ~]$
Você pode substituir uma opção de configuração SSH "RequestTTY" na linha de comando.
Meu exemplo de trabalho cd-serv-one.sh
começa /bin/bash
na 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.sh
para iniciar uma sessão SSH necessária.
ssh
!