Quero copiar um arquivo da minha máquina A para o servidor C, mas só tenho acesso ao servidor C através do servidor B.
Em vez de primeiro transferir para o servidor B, faça login e depois transfira para o servidor C. É possível transferir o arquivo diretamente com o SCP ou programas similares?
(O modo tramp do Emacs possui esse recurso para editar arquivos remotamente).
Responder1
Você pode adicionar -o
opções em scp
em vez de .ssh/config
.
scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path
$jump_host
é o seu "servidor B" neste caso.
Responder2
Assumindo OpenSSH, adicione à sua configuração SSH em .ssh/config
Host distant
ProxyCommand ssh near nc distant 22
Isso fará com que o SSH seja capaz de se conectar "diretamente" à máquina chamada distante, fazendo proxy através da máquina chamada próxima. Ele pode então usar aplicativos como scp e sftp para a máquina distante.
Para que isso funcione, você precisa de 'nc', também conhecido como netcat, instalado na máquina chamada próxima. Mas muitos sistemas modernos já o terão.
A solução tar do towo é mais eficaz para problemas únicos, desde que você tenha memorizado a sintaxe e as regras de operação do tar.
Responder3
Com versões mais recentes do ssh no servidor próximo à máquina (B), o seguinte funcionará sem o netcat:
Host distant
ProxyCommand ssh near -W distant:22
No entanto, será necessário que AllowTcpForwarding seja sim (o padrão) na máquina próxima (B)
editar: requer OpenSSH 5.4+ em B
Responder4
É possível e relativamente fácil, mesmo quando você precisa usar certificados para autenticação (típico em ambientes AWS).
O comando abaixo copiará os arquivos de remotePath
on server2
diretamente para sua máquina em localPath
. Internamente, a solicitação scp é proxy via server1
.
scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
O contrário também funciona (fazer upload do arquivo):
scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>
Se você usar autenticação por senha, tente com
scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>
Se você usar as mesmas credenciais de usuário em ambos os servidores:
scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>
A -W
opção é incorporada em versões mais novas (mais) do OpenSSH, portanto, isso funcionará apenas em máquinas que possuem a versão mínima (5.4, a menos que sua distribuição tenha portado algum recurso; por exemplo, RHEL6 OpenSSH 5.3p1 inclui esse recurso). De acordo com as notas de lançamento:http://www.openssh.com/txt/release-5.4
Adicionado um 'modo netcat' ao ssh(1): "ssh -W host:port ..." Isso conecta stdio no cliente a uma única porta de encaminhamento no servidor. Isso permite, por exemplo, usar ssh como ProxyCommand para rotear conexões através de servidores intermediários.
%h
e %p
são espaços reservados para o host e a porta.