Como baixar um arquivo através de um servidor SSH?

31

Eu tenho um servidor nos EUA (caixa B do Linux) e meu PC doméstico (caixa A do Linux) e preciso fazer o download de um arquivo do site C,

O problema é que é muito lento o download de um arquivo diretamente de A, portanto, preciso fazer o download do arquivo ao efetuar o login B e sftpobter o arquivo de A.

Existe alguma maneira de baixar arquivos e usar B como proxy diretamente através de apenas um comando de linha?

linjunhalida
fonte

Respostas:

46

(Situação estranha, algo como a desigualdade do triângulo não vale para o roteamento da Internet?)

De qualquer forma, tente o seguinte, em A , sshem B com um -Dargumento,

ssh -D 1080 address-of-B

que atua como um proxy SOCKS5 127.0.0.1:1080, que pode ser usado por qualquer coisa que suporte conexões proxy SOCKS5. Aparentemente, você wgetpode fazer isso usando a variável de ambiente

export SOCKS_SERVER=127.0.0.1:1080
wget http://server-C/whatever

Observe que algumas vezes curlé mais útil (ou seja, não tenho certeza se é wgetpossível fazer pesquisas de nome de host via SOCKS5; mas essa não é uma das suas preocupações, suponho); o Firefox também é capaz de funcionar completamente através de um proxy SOCKS5.

Editar Acabei de notar que você está procurando uma solução de uma linha . Bem, que tal

ssh address-of-B 'wget -O - http://server-C/whatever' >> whatever

ou seja, redirecionar a wgetsaída buscada para stdoute redirecionar a saída local (da sshexecução wgetremota) para um arquivo.

Isso parece funcionar, a wgetsaída é um pouco confusa (" salva em - "), você pode se livrar dela adicionando -qà wgetchamada.

sr_
fonte
6
Aparentemente, a SOCKS_SERVERvariável de ambiente não tem efeito no Ubuntu 14.04.
kasperd
4
De acordo com essa outra resposta , wgetnão tem suporte para SOCKS_SERVERvariável. Essa resposta sugere o uso de curl --socks5-hostnameou curl --socks5.
Denilson Sá Maia
@kasperd, então, é apenas o ubuntu onde não funciona, ou a variável não está relacionada ao wget? parece que a variável pode ser a socksifyalternativa.
cnst 5/09/15
@ CNST Não vi nenhuma evidência de que qualquer versão do wget tenha suporte para meias. socksifynão é uma configuração, é um programa separado.
kasperd
então, basicamente, se você quiser SOCKS_SERVERter algum efeito wget, precisará instalar o ports.su/security/dante e executar em socksify wgetvez de apenaswget
cnst
3

Outra abordagem pode ser aquela em que você normalmente faz login B, onde inicia uma screensessão. Lá você faz os wgetseus arquivos - tudo em um diretório.

E aí o programa pode ser executado com alegria; você apenas se desconecta da tela, mas deixa-a ser executada em segundo plano.

Se os downloads forem concluídos (talvez até mais cedo), você pode transferir os dados de Bpara Ausando rsync(minha preferência).

glglgl
fonte
2

Inspirado por outra resposta a outra pergunta , sugiro usar proxychains-ng (que é a versão mais recente do proxychains ).

  1. Baixe, compile e, opcionalmente, instale proxychains-ng .
  2. Crie um proxychains.confarquivo no diretório atual, ou em ~/.proxychains/proxychains.conf, ou em /etc/proxychains.conf.
    • Como alternativa, crie um arquivo em qualquer outro lugar ou com outro nome e especifique se através -fdo argumento da linha de comandos ou da PROXYCHAINS_CONF_FILEvariável de ambiente.
    • Existe um arquivo de configuração de amostra disponível. As opções mais relevantes estão no final.
  3. No seu proxychains.confarquivo, adicione:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Corra ssh -D 1234 your_host_b. Isso fará com que o ssh escute na porta 1234 no host local e use seu host remoto como um proxy SOCKS.

    • Como alternativa, execute em ssh -ND 1234 your_host_bvez disso. -Nimpedirá que o ssh execute qualquer comando no servidor remoto (ou seja, ele não abrirá um shell).
  5. Execute: proxychains4 yourcommandhere yourparametershere. Veja alguns exemplos:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
Denilson Sá Maia
fonte
2

Opção 0:

Para usar wgetcom um proxy SOCKS5 ssh, você deve instalar o security/dantepacote para usar a SOCKS_SERVERopção com o socksifyutilitário.

sudo pkg_add dante

Posteriormente, você abre uma conexão SSH em segundo plano:

ssh -N -C -D1080 user@hostB &

E use o wget através de um proxy SOCKS5 através do socksify:

env SOCKS_SERVER=127.0.0.1:1080 socksify wget http://website-C

Opção 1:

Basta canalizar o arquivo stdoutno servidor e lê-lo stdinna sua estação de trabalho.

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C
cnst
fonte
1

Você pode fazer um túnel ssh da caixa A à caixa B e adicionar à tabela de roteamento na caixa A, que o site C seja acessível através do túnel na caixa B. Você deve permitir o encaminhamento de pacotes na caixa B.

Aqui você pode ver um ótimo tutorial passo a passo ...

Jan Marek
fonte
1

Você precisaria criar um túnel na máquina B que redirecionaria a chamada para o site C. Mas estou confuso sobre o motivo pelo qual isso seria mais rápido, a menos que o seu provedor de serviços de Internet tenha algumas restrições.

Não conheço um oneliner, mas isso não é muito mais complicado.

Na máquina A, você faz (peguei 11111 aleatoriamente, você pode pegar o que quiser, contanto que seja> 1024 ou precisaria ser root)

ssh -f -C -N -L 11111:C:80 username@B

O nome de usuário em B é aquele que você usa para se conectar ao B. Isso deve criar um túnel na porta 11111 na máquina B que redireciona para a porta 80 (site em HTTP use 443 para HTTPS) na máquina C (espero não ter mexido a ordem ;) )

Em seguida, você pode fazer o download do arquivo diretamente da máquina A via máquina B. Estou assumindo que o arquivo está em http://C/path/to/fileque você usaria:

wget http://B:11111/path/to/file
Huygens
fonte
Isso não funcionaria apenas se o arquivo estiver acessível sem a hospedagem virtual baseada em nome HTTP 1.1? Como a solicitação GET emitida pelo wget indicaria o nome do host como B, não C.
um CVn
@ MichaelKjörling Não tenho conhecimento suficiente para responder.
Huygens