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?

grm
fonte

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 [email protected] 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.

user24925
fonte
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 [email protected] nc -w 1 %h 22" [email protected]

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

Holger Just
fonte
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 [email protected] -W %h:%p" [email protected]: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 [email protected] -W %h:%p

e a partir de então basta

scp [email protected]:file .

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

CupawnTae
fonte
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)

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

OK, na verdade dois comandos ...

pesado
fonte
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.

baleia
fonte
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

rogerdpack
fonte
droga bro, trabalhou imediatamente :)
Elouan Keryell-Even
2

E se:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
eggroll77
fonte
ou possivelmente nome de usuário: senha aqui?
Rogerdpack # 11/15
1

Você pode tentar algo como:

ssh [email protected] "ssh [email protected] '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 [email protected] "ssh [email protected] 'tar xvf -'"
Eric Darchis
fonte
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.

lomai
fonte
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
Leo
fonte
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 [email protected]" \
        archive.gz [email protected]:/home/wise/archive.gz

Espero que esta resposta possa ajudá-lo.

Wise Lin
fonte