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/configarquivo 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.machinelinhas no mesmo ~/.ssh/configarquivo; 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 %pmeios
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
pcredse tcredsrepresentam 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 ncno host intermediário. O uso ssh -W host:portconfigura um túnel para o host e a porta especificados e o conecta ao stdin / stdout e, em seguida, scppassa pelo túnel.
O %he %pno ProxyCommandsã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 -Wem 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 -- Xver 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 scpum 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.