Scp sobre um proxy com um comando da máquina local?


54

Eu tenho meu local.machine, o proxy.machine e o target.machine. local.machine não tem contato direto com target.machine, mas precisa passar por proxy.machine.

Quero scp um arquivo de target.machine para local.machine. Isso é possível com apenas um comando do local.machine?

Respostas:


64

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.


5
Apenas uma nota rápida. Se você estiver usando um arquivo de identidade alternativo por meio da opção de linha de comando -i para ssh, precisará especificar essa opção para a configuração ProxyCommand e a linha de comando ssh.
Billman

7
3 coisas que podem ajudar: 1) ajudaria se você também mostrasse as 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
puk

Como podemos copiar da máquina local para a máquina de destino com proxy?
Mulagala

19

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 ...]


Boa tentativa, mas onde devo adicionar o nome de usuário para proxy e login?
GRM

Antes do nome da máquina, com um @. Eu editei minha resposta para refletir isso.
amigos estão

19

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


11
Verificado, isso realmente funciona bem e não deixa processos NC obsoletos na máquina de proxy.
LaXDragon

11
Onde posso especificar a porta do proxy?
Marged

11
@Marged eu não estou em uma posição para experimentá-lo aqui no momento, mas eu acho que você deve ser capaz de incluir -p <portnum>antes da -Wem um ou outro método para especificar a porta proxy
CupawnTae

11
Demorei um pouco para descobrir que a opção -i (se você precisar) vai para as aspas. O proxy ssh não usa, por padrão, a mesma chave privada especificada por qualquer opção -i fornecida diretamente ao scp. Eu acho que isso é óbvio quando você pensa sobre isso.
Keeely

18

Se você não se importa em usar o rsync em vez do scp, pode usar o seguinte recurso:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(você precisará de acesso sem senha à máquina proxy)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

OK, na verdade dois comandos ...


11
Como posso especificar a porta do meu proxy? No meu caso8080
marcou

@Marged adicione -p <portnumber>ao seu comando ssh
weeheavy

6

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.


3

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


droga bro, trabalhou imediatamente :)
Elouan Keryell-Even

2

E se:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

ou possivelmente nome de usuário: senha aqui?
Rogerdpack # 11/15

1

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 -'"

1

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.


0

Caso você precise usar chaves públicas, precisará de algo assim.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

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.

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.