O pseudo-terminal não será alocado porque stdin não é um terminal


14

Estou tentando configurar o salto automático de SSH através de um servidor que não tem nc.

Isso funciona na linha de comando:

ssh -A gateway ssh steve@target

(Eu adicionei minha chave pública ao agente SSH).

No entanto, adicioná-lo a ~ / .ssh / config não:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Tentar forçar o problema -té divertido, mas não ajuda.

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Mais -t? Nada de bom.

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

Isso é possível? A maioria dos tutoriais (por exemplo, http://www.arrfab.net/blog/?p=246 ) sugere o uso nc.


É a conclusão de que o netcat é necessário?
MountainX-for-Monica

Parece que sim. Nesse caso, consegui instalá-lo, resolvendo meu problema - mas nem sempre tenho esse luxo.
91113 Steve Bennett

Veja minha resposta abaixo para duas maneiras pelas quais consegui fazer isso sem o netcat.
MountainX-for-Monica

Respostas:


13

ProxyCommand SSH sem netcat

O ProxyCommand é muito útil quando os hosts são acessíveis apenas indiretamente. Com o netcat, é relativamente direto:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

Aqui {gw} e {host} são espaços reservados para o gateway e o host.

Mas também é possível quando o netcat não está instalado no gateway:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

O / dev / tcp é um recurso interno do bash padrão. Os arquivos não existem. Para verificar se o bash possui esse recurso, use:

cat < /dev/tcp/google.com/80 

... no gateway.

Para garantir que o bash seja usado, use:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

E ainda funciona em conjunto com o ControlMaster.

(Atualizado em 22 de outubro para incluir kill para limpar o gato de segundo plano) (Atualizado em 3 de março de 2011 para tornar os espaços reservados mais claros e explicar / dev / tcp)

100% de crédito para Roland Schulz. Aqui está a fonte:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
veja mais informações úteis nos comentários.

Também há mais aqui:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

ATUALIZAÇÃO : aqui está algo novo de Marco

Em referência a um ProxyCommand em ~ / .ssh / config, em que se tem uma linha como esta:

ProxyCommand ssh gateway nc localhost %p

Marco diz:

Você não precisa do netcat se usar uma versão recente do OpenSSH. Você pode substituir nc localhost% p por -W localhost:% p.

O resultado ficaria assim:

ProxyCommand ssh gateway -W localhost:%p

8

T grande, não t pequeno.

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

Meu script costumava retornar essa mensagem e não o faz mais.

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

Eu uso o authorized_keyno other_system para fazer com que isso execute um comando:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 

3

Faça uma tentativa:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip

Espera, como isso é diferente do que eu tentei?
9788 Steve Bennett

@SteveBennett A diferença é que isso não apenas tenta alocar um TTY no segundo sistema, mas também no primeiro.
Hauke ​​Laging

é exatamente o mesmo comando que eu mencionei com o resultado "divertido, mas inútil"?
9788 Steve Bennett

@SteveBennett Eu interpretei isso errado. Meu objetivo era ter as -tduas conexões e eu a vi na errada. Eu editei minha resposta.
Hauke ​​Laging

Ah Bem, ainda não é bom. Tentei todas as combinações.
9133 Steve Bennett

-3

Você pode tentar a seguinte técnica de ssh'ing no servidor1, seguida de ssh'ing no servidor2.

$ ssh -t user1@server1 ssh -t user2@server2 

Fazer assim funciona para mim.


1
Por favor, explique mais ... O que esse comando faz e como é útil resolver a resposta.
Tejas
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.