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

28

Eu tenho um servidor nos EUA (caixa Linux B) e meu computador pessoal (caixa Linux A), e eu preciso baixar um arquivo do site C,

A questão é que é muito lento baixar um arquivo direto de A, então eu preciso baixar o arquivo quando eu fizer o login B e sftp pegar o arquivo de A.

Existe alguma maneira que eu possa baixar o arquivo e usar B como proxy diretamente através de apenas um comando de linha?

    
por linjunhalida 16.05.2012 / 09:00

7 respostas

44

(Situação estranha, algo como a desigualdade do triângulo é válida para o roteamento da Internet?)

De qualquer forma, tente o seguinte, em A , ssh em B com um argumento -D ,

ssh -D 1080 address-of-B

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

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

Observe que às vezes curl é mais útil (ou seja, não sei se wget pode fazer pesquisas de nome de host por meio de SOCKS5; mas isso não é uma de suas preocupações, suponho); também o Firefox é capaz de funcionar completamente através de um proxy SOCKS5.

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

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

i.e. redirecionar a saída wget -fetched para stdout e redirecionar a saída local (de ssh executando wget remotamente) para um arquivo.

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

    
por 16.05.2012 / 09:33
3

Outra abordagem pode ser que você normalmente efetue login em B , onde você inicia uma sessão screen . Lá você faz o wget de seus arquivos - tudo em um diretório.

E lá o programa pode ser executado com alegria; você simplesmente se desconecta da tela, mas deixa rodar em segundo plano.

Se os downloads terminarem (talvez até mais cedo), você poderá verificar os dados de B a A usando rsync (minha preferência).

    
por 16.05.2012 / 11:47
2

Inspirado por outra resposta para 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 arquivo proxychains.conf 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 do argumento de linha de comando -f ou através da variável de ambiente PROXYCHAINS_CONF_FILE .
    • Existe um exemplo de arquivo de configuração disponível. As opções mais relevantes estão no final.
  3. No seu arquivo proxychains.conf , adicione:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Execute 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 ssh -ND 1234 your_host_b . -N impedirá que o ssh execute qualquer comando no servidor remoto (ou seja, ele não abrirá um shell).
  5. Executar: proxychains4 yourcommandhere yourparametershere . Veja alguns exemplos:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
por 18.06.2015 / 16:08
1

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

Aqui você pode ver um tutorial passo-a-passo muito bom ...

    
por 16.05.2012 / 09:34
1

Você precisaria criar um túnel na máquina B que redirecionaria a chamada para o site C. Mas estou intrigado porque isso seria mais rápido, a menos que seu ISP tenha algumas restrições.

Eu 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, desde que seja > 1024, ou você 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 a B. Isso deve criar um encapsulamento na porta 11111 na máquina B que redireciona para a porta 80 (web site em HTTP use 443 para HTTPS) na máquina C (espero que eu não mexeu no pedido;))

Então você pode baixar o arquivo diretamente da máquina A via máquina B. Estou assumindo que o arquivo está em http://C/path/to/file , então você usaria:

wget http://B:11111/path/to/file
    
por 16.05.2012 / 09:35
1

Você pode fazer isso através do encaminhamento de porta (tunelamento ssh). Aqui está um recurso: link

Essencialmente, você deve configurar o encaminhamento de porta em B. Quando um problema é enviado para B, B encaminhará os pacotes para C e enviará os resultados de volta para A.

    
por 16.05.2012 / 09:37
1

Opção 0:

Para usar wget com um proxy SOCKS5 de ssh , você precisa instalar o pacote security/dante para usar o SOCKS_SERVER option com o utilitário socksify .

sudo pkg_add dante

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

ssh -N -C -D1080 user@hostB &

E use o wget por meio de um proxy SOCKS5 por meio do socksify:

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

Opção 1:

Basta enviar o arquivo para stdout no servidor e lê-lo em stdin em sua estação de trabalho.

ssh -C user@hostB "wget -O- http://website-C" >> file-from-website-C
    
por 05.09.2015 / 10:00

Tags