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?
(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
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
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).
Baixe, compile e, opcionalmente, instale proxychains-ng .
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.
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).
Execute: proxychains4 yourcommandhere yourparametershere. Veja alguns exemplos:
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 ...
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:
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.
Essencialmente, você deve configurar o encaminhamento de porta em B. Quando A emitir wget para B, B encaminhará os pacotes para C e enviará os resultados de volta para A.
SOCKS_SERVER
variável de ambiente não tem efeito no Ubuntu 14.04.wget
não tem suporte paraSOCKS_SERVER
variável. Essa resposta sugere o uso decurl --socks5-hostname
oucurl --socks5
.socksify
alternativa.socksify
não é uma configuração, é um programa separado.SOCKS_SERVER
ter algum efeitowget
, precisará instalar o ports.su/security/dante e executar emsocksify wget
vez de apenaswget
Outra abordagem pode ser aquela em que você normalmente faz login
B
, onde inicia umascreen
sessão. Lá você faz oswget
seus 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
B
paraA
usandorsync
(minha preferência).fonte
Inspirado por outra resposta a outra pergunta , sugiro usar proxychains-ng (que é a versão mais recente do proxychains ).
proxychains.conf
arquivo no diretório atual, ou em~/.proxychains/proxychains.conf
, ou em/etc/proxychains.conf
.-f
do argumento da linha de comandos ou daPROXYCHAINS_CONF_FILE
variável de ambiente.No seu
proxychains.conf
arquivo, adicione: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.ssh -ND 1234 your_host_b
vez disso.-N
impedirá que o ssh execute qualquer comando no servidor remoto (ou seja, ele não abrirá um shell).proxychains4 yourcommandhere yourparametershere
. Veja alguns exemplos:proxychains4 wget -O - http://ifconfig.co/
proxychains4 -q links http://ifconfig.co/
fonte
Opção 0:
Para usar
wget
com um proxy SOCKS5ssh
, você deve instalar osecurity/dante
pacote para usar aSOCKS_SERVER
opção com osocksify
utilitário.Posteriormente, você abre uma conexão SSH em segundo plano:
E use o wget através de um proxy SOCKS5 através do socksify:
Opção 1:
Basta canalizar o arquivo
stdout
no servidor e lê-lostdin
na sua estação de trabalho.fonte
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 ...
fonte
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)
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/file
que você usaria:fonte
Você pode fazer isso via encaminhamento de porta (encapsulamento ssh). Aqui está um recurso: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9
Essencialmente, você deve configurar o encaminhamento de porta em B. Quando A emitir wget para B, B encaminhará os pacotes para C e enviará os resultados de volta para A.
fonte