Respostas:
Sei que essa é uma resposta tardia, mas acabei de descobrir uma maneira legal de fazer isso. É basicamente a resposta de Holger Just, mas em um arquivo de configuração salvo:
Você precisa colocar isso em seu ~/.ssh/config
arquivo em local.machine (criando o arquivo se ele não existir)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
Depois de salvar o arquivo, você pode apenas usar
ssh target.machine
a qualquer momento que você quiser se conectar. O Scp também funcionará, pois também respeita o arquivo de configuração ssh. O Nautilus também, se você estiver usando o GNOME e quiser usar uma GUI.
Host proxy.machine
linhas no mesmo ~/.ssh/config
arquivo; 2) Mencione se esses comandos podem ser aninhados (ou seja, o cliente se conecta ao host 1 do proxy que se conecta ao host 2 do proxy ao qual se conecta. ..target) e 3) Que nc %h %p
meios
Você pode fazer isso em um comando, mas precisa do netcat (nc) instalado na máquina proxy:
ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine
[EDIT: misturou a ordem das máquinas ...]
Agora você pode * fazer isso como uma linha, sem precisar de nc
nenhum lugar:
scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .
Explicação
pcreds
e tcreds
representam o proxy e de destino credenciais, se necessário ( username
, username:password
, etc.).
Isso é possível devido a uma capacidade interna do tipo netcat, removendo o requisito nc
no host intermediário. O uso ssh -W host:port
configura um túnel para o host e a porta especificados e o conecta ao stdin / stdout e, em seguida, scp
passa pelo túnel.
O %h
e %p
no ProxyCommand
são substituídos pelo host e porta de destino que você especificar.
Para ainda mais comodidade, você pode configurar o proxy na sua configuração ssh:
Host target.machine
ProxyCommand ssh pcreds@proxy.machine -W %h:%p
e a partir de então basta
scp tcreds@target.machine:file .
* desde o OpenSSH 5.4 - lançado em março de 2010
-p <portnum>
antes da -W
em um ou outro método para especificar a porta proxy
Um one-liner? Não é do alto da minha cabeça. Você precisa estabelecer um proxy primeiro e não pode fazer isso com o scp sozinho.
Ao fazer isso manualmente, abro uma sessão de tela para o meu túnel:
screen -S tunnel
A tela é usada para manter o túnel em um shell de plano de fundo. Use qualquer técnica que você queira manter o túnel aberto em segundo plano (a resposta de @ weeheavy é provavelmente a mais simples). Uma vez na sessão de tela, inicio meu túnel dessa maneira
ssh -L 2222:target.machine:22 [user@]proxy.machine
Para resumir, isso basicamente diz "Na minha máquina local, abra a porta 2222 e qualquer conexão que atinja localhost: 2222 é proxy através do proxy.machine para target.machine: 22"
Depois de estabelecer a conexão e o túnel ssh, desconecte da sessão da tela com "Ca d". Para voltar à sessão de tela, digitescreen -raAd tunnel
Quando você voltar ao shell original, seu comando scp se parecerá com
scp -P 2222 localhost:your/file/on/target.machine local/path
Lembre-se de que a porta 2222 do host local é realmente apenas um túnel para o target.machine.
Parece que o scp suporta a opção "-o", assim como o ssh, embora não tenha certeza de como passar um nome de usuário / senha de proxy:
scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path
Se você conseguir nc: invalid option -- X
ver https://stackoverflow.com/a/23616021/32453
E se:
scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location
Você pode tentar algo como:
ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file
Mas não funcionará se o proxy.machine precisar solicitar sua senha (que o SSH não está em um TTY, portanto, o askpass falhará).
Se você tiver mais de um arquivo, poderá usar o tar assim (não testado, eu geralmente uso um netcat dessa maneira):
tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"
Outra solução simples para transferir um arquivo de origem do host de origem para um host de destino por meio de um host proxy :
Efetue login no proxy_server :
ssh login@proxy_host
No servidor proxy, transfira o arquivo_de_origem do host_de_arquitetura para o host_de destino (você pode digitar isso como uma linha, omitindo a \
ou como duas linhas, conforme mostrado abaixo):
scp login@source_host:/path_to_source_file \
login@destination_host:/path_to_destination_directory
Isso requer que o logon no host_da_arquitetura no proxy_host use uma rsa_key.
Eu segui este artigo e encontrei uma resposta que funciona para mim. (Porque as respostas acima não funcionam para mim).
Como fazer scp
um arquivo através de um host intermediário (também conhecido como jump host)
http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html
E minha resposta é a seguinte:
scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
{source_file} {remote_username}@{remote_IP}:{remote_file_path}
Exemplo:
scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz
Espero que esta resposta possa ajudá-lo.