Problema comum de manipulação de arquivos de conexões SSH

3

muitas vezes eu tenho que baixar um arquivo que não é diretamente acessível através da primeira conexão SSH. Por exemplo, eu estou em uma máquina Windows e quero acessar outra máquina que só pode ser acessada pela lan. Isso significa que primeiro preciso conectar a uma máquina intermediária e o SSH à próxima.

Seria fácil usar o pscp para obter o arquivo, se estivesse disponível para a primeira máquina. O encaminhamento de porta SSH poderia ser usado neste cenário?

    
por Uku Loskit 06.04.2011 / 11:15

6 respostas

3

Sim, o encaminhamento de porta SSH pode ser usado neste caso, mas você também pode receber avisos sobre chaves de host inválidas ou incorretas ao tentar fazer isso. Alguns clientes SSH, como o OpenSSH, rastreiam chaves de host SSH apenas por domínio ou IP e não incluem o número da porta com ele. O PuTTY parece gravar o número da porta com a chave do host e não deve sofrer com esse problema, contanto que seja consistente com os números de porta que você usa para cada host. Eu recomendaria adicionar os encaminhamentos de porta a uma sessão salva no PuTTY. Você também pode salvar as sessões adicionais para os vários hosts remotos como sessões salvas e usá-las com pscp / psftp. Você pode começar com qualquer porta de número alto para o encaminhamento, como 2220, e subir de uma para cada host que precisar encaminhar através de um host intermediário. Adicione à sessão salva de intermediate porta local encaminhada como porta 2220 e destino remote1:22 e porta 2221 com destino remote2:22 para hosts remotos remote1 e remote2 Em seguida, crie sessões para remote1 com destino localhost e porta SSH 2220 e uma sessão de remote2 com destino localhost e porta SSH 2221 . Para usar sessões com pcsp / psftp, use @session-name para o host.

O problema ocorre quando você de alguma forma associou uma chave de host SSH ao localhost e tentou se conectar a uma porta local que está sendo encaminhada para um computador diferente. Com o OpenSSH, resolvi esse problema usando HostKeyAlias . Eu adicionei entradas ao meu ~/.ssh/config assim:

Host intermediate
HostName intermediate.example.org
LocalForward 2220 remote1.example.org:22
LocalForward 2222 remote2.example.org:22

Host remote1
HostName localhost
Port 2220
HostKeyAlias remote1.example.org

Host remote2
HostName localhost
Port 2221
HostKeyAlias remote2.example.org

Minha correção preferida, porém, foi quando eu implantei o IPv6 em minha rede doméstica e de trabalho e não precisei mais me preocupar em me conectar a um servidor intermediário primeiro para chegar ao meu destino final.

    
por 06.04.2011 / 12:52
5

Eu adiciono à definição de .ssh/config :

Host SERVER-A
    ProxyCommand ssh SERVER-B nc -q0 %h %p 2> /dev/null

e, em seguida, use apenas ssh ou scp da maneira normal:

ssh user@SERVER-A

ou

scp file.tar.gz user@SERVER-A:~

Durante a configuração da conexão com SERVER-A , a biblioteca ssh encontra essas configurações. Ele diz que o ssh deve usar algum comando de proxy para se conectar. Os comandos proxy se conectam com SERVER-B e, em seguida, executam o comando nc (netcat) que encaminha todas as saídas do comando proxy para determinado servidor para determinada porta, sendo definido pelos parâmetros %h e %p .

Essa construção também permite que você use autenticação de chave. você acabou de copiar seu público da máquina cliente nos dois servidores: SERVER-A e SERVER-B .

Essa configuração também é compatível com outros aplicativos que usam a biblioteca ssh, por exemplo rsync , sftp ou clientes GUI.

    
por 11.05.2011 / 21:49
2

Você pode usar a máquina intermediária como um proxy. Certifique-se de que o netcat ( nc ) esteja instalado. Coloque as seguintes linhas no seu ~/.ssh/config ( foo é um apelido para a máquina inacessível, foo.example.com é seu nome visto da máquina intermediária e gateway.example.com é a máquina intermediária):

Host foo
HostName foo.example.com
ProxyCommand ssh gateway.example.com nc %h %p

Então ssh foo se conectará (em dois saltos, mas isso é completamente transparente) à máquina inacessível.

    
por 07.04.2011 / 01:30
1

Você pode usar o encaminhamento de porta SSH:

ssh server-a -L2022:server-b:22

Depois disso, você terá a porta 2022 na máquina cliente encaminhada para a porta 22 do servidor-b. E você pode se conectar a ele com:

ssh 127.0.0.1 -p 2022
    
por 11.05.2011 / 20:35
1

Seguindo a resposta do gelraen.

Você pode usar o encaminhamento de porta muito bem quando em conjunto com o .ssh/config . isto é, você configura um comando de proxy para um hostname imaginário específico que não faz nada além de tcp-forward através de um túnel já aberto:

Host imag
ProxyCommand socat - tcp-connect:localhost:2022

Então você pode usar apenas ssh imag para se conectar ao servidor-b: 22 quando o túnel estiver ativo.

socat é exatamente o que eu usei, netcat deveria fazer bem;)

Uma coisa interessante sobre ProxyCommand é que ele interpola variáveis de ambiente - então ... experimente.

    
por 11.05.2011 / 21:25
0
ssh server1 'ssh server2'

parece um pouco mais simples para mim. Pode-se até copiar arquivos como este:

ssh server1 "ssh server2 'cat myFile'" >myFile

ou

ssh server1 "ssh server2 'cat >myFile'" <myFile
    
por 11.05.2011 / 21:17