Scp através de um proxy com um comando da máquina local?

47

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

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

    
por grm 10.08.2010 / 13:24

10 respostas

59

Eu sei que esta é 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 no seu arquivo ~/.ssh/config em local.machine, (criando o arquivo se ele não existir)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh [email protected] nc %h %p 2> /dev/null

Depois de salvar o arquivo, você pode usar apenas

ssh target.machine

sempre que você quiser se conectar. O Scp também funcionará, pois também respeita o arquivo de configuração do ssh. Então, o Nautilus, se você estiver usando o GNOME e quiser usar uma GUI.

    
por 08.08.2011 / 15:37
20

Você pode fazer isso em um comando, mas precisa do netcat (nc) instalado na máquina proxy:

ssh -o "ProxyCommand ssh [email protected] nc -w 1 %h 22" [email protected]

[EDIT: confundir a ordem das máquinas ...]

    
por 20.02.2011 / 11:31
16

Se você não se importa em usar o rsync ao invés do scp, você pode usar o seguinte one-liner:

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

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

    
por 20.02.2011 / 11:26
13

Agora você pode * fazer isso como uma linha direta, sem exigir nc em qualquer lugar:

scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file .

Explicação

pcreds e tcreds representam suas credenciais de proxy e de destino, se necessário ( username , username:password , etc.).

Isso é possível por causa de uma habilidade interna semelhante a um netcat, removendo o requisito para nc no host intermediário. Usar ssh -W host:port configura um encapsulamento para o host e a porta especificados e o conecta a stdin / stdout e, em seguida, scp é executado sobre o encapsulamento.

Os %h e %p no ProxyCommand são substituídos pelo host de destino e pela porta que você especificar.

Para maior comodidade, você pode configurar o proxy em sua configuração ssh:

Host target.machine
    ProxyCommand ssh [email protected] -W %h:%p

e, a partir daí, basta fazer

scp [email protected]:file .

* desde o OpenSSH 5.4 - lançado em março de 2010

    
por 02.02.2016 / 12:00
8
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .

OK, na verdade, dois comandos ...

    
por 10.08.2010 / 13:44
6

Um one-liner? Não fora do topo da minha cabeça. Você precisa estabelecer um proxy primeiro e você 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 segundo plano. Use qualquer técnica que você queira manter o túnel aberto em segundo plano (a resposta do @weeheavy é provavelmente a mais simples). Uma vez na sessão de tela eu começo meu túnel assim

ssh -L 2222:target.machine:22 [user@]proxy.machine

Para quebrar isso, isso basicamente diz "Na minha máquina local, abra a porta 2222 e qualquer conexão que acesse o host local: 2222 é intermediada por proxy através de proxy.machine para target.machine: 22"

Uma vez que você tenha a conexão ssh e o túnel estabelecidos, desconecte-se da sessão de tela com "C-a d". Para voltar a essa sessão de tela, digite screen -raAd tunnel

Quando estiver de volta ao seu shell original, seu comando scp ficará parecido com

scp -P 2222 localhost:your/file/on/target.machine local/path

Lembre-se de que a porta 2222 do localhost é realmente apenas um túnel que vai para o target.machine.

    
por 10.08.2010 / 13:45
2

Que tal:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
    
por 22.05.2015 / 16:23
2

Aparece que o scp suporta a opção "-o" assim como o ssh, embora eu não tenha certeza de como passar um nome de usuário / senha do proxy:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Se você obtiver nc: invalid option -- X , consulte o link

    
por 12.05.2014 / 20:22
1

Você poderia tentar algo como:

ssh [email protected] "ssh [email protected] 'cat > file'" < file

Mas não funcionará se sua proxy.machine precisar perguntar a senha (que o SSH não está em um TTY, então o askpass falhará).

Se você tiver mais de um arquivo, você pode usar tar assim (não testado, eu costumo usar um netcat dessa maneira):

tar cf - file1 file2 folder1/ | ssh [email protected] "ssh [email protected] 'tar xvf -'"
    
por 10.08.2010 / 14:23
0

Outra solução simples para transferir um source_file do source_host para um destination_host via um proxy_host :

Faça o login no proxy_server :

ssh login@proxy_host

Do servidor proxy, transfira o source_file do source_host para o destination_host (você pode digitar isso como uma linha, omitindo o% código%, ou como duas linhas, como mostrado abaixo):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Isso requer que o login no source_host para o proxy_host use uma rsa_key.

    
por 17.11.2015 / 16:08

Tags