¿Cómo descargar un archivo a través de un servidor SSH?

31

Tengo un servidor en EE. UU. (Linux box B) y la PC de mi casa (Linux box A), y necesito descargar un archivo del sitio web C,

El problema es que es muy lento descargar un archivo directamente desde A, por lo que necesito descargar el archivo cuando inicio sesión en B y sftpobtener el archivo de A.

¿Hay alguna manera de que pueda descargar el archivo y usar B como proxy directamente a través de un solo comando de línea?

linjunhalida
fuente

Respuestas:

46

(Situación extraña, ¿no se cumple algo así como la desigualdad del triángulo para el enrutamiento de Internet?)

De todos modos, intente lo siguiente, en A , sshen B con un -Dargumento,

ssh -D 1080 address-of-B

que actúa como un proxy SOCKS5 127.0.0.1:1080, que puede ser utilizado por cualquier cosa que admita conexiones proxy SOCKS5. Aparentemente, wgetpuede hacer esto , usando la variable de entorno

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

Tenga en cuenta que a veces curles más útil (es decir, no estoy seguro de si wgetpuede realizar búsquedas de nombres de host a través de SOCKS5; pero supongo que esta no es una de sus preocupaciones); También Firefox puede funcionar completamente a través de un proxy SOCKS5.

Editar Acabo de notar que está buscando una solución de una línea . Bueno, que tal

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

es decir, redirigir la wgetsalida -fetched a stdout, y redirigir la salida local (de sshejecución wgetremota) a un archivo.

Esto parece funcionar, el wgetresultado es un poco confuso (" guardado en - "), puede deshacerse de él agregando -qa la wgetllamada.

sr_
fuente
66
Aparentemente, la SOCKS_SERVERvariable de entorno no tiene efecto en Ubuntu 14.04.
kasperd
44
Según esta otra respuesta , wgetno tiene soporte para SOCKS_SERVERvariable. Esa respuesta sugiere usar curl --socks5-hostnameo curl --socks5.
Denilson Sá Maia
@kasperd, entonces, ¿es solo ubuntu donde no funciona, o la variable no está relacionada con wget? parece que la variable podría ser para en su socksifylugar.
Cnst
@cnst No he visto evidencia de que ninguna versión de wget tenga soporte para calcetines. socksifyNo es una configuración, es un programa separado.
Kasperd
así que, básicamente, si quieres SOCKS_SERVERtener algún efecto wget, entonces debes instalar ports.su/security/dante , y luego ejecutarlo en socksify wgetlugar de solowget
cnst
3

Otro enfoque podría ser que normalmente inicies sesión B, donde comienzas una screensesión. Allí, usted hace el wgetde sus archivos, todo en un directorio.

Y allí el programa puede ejecutarse felizmente; simplemente se separa de la pantalla, pero se deja que se ejecute en segundo plano.

Si se acaban las descargas (tal vez incluso antes), puede FECH los datos Ba Autilizar rsync(mi preferencia).

glglgl
fuente
2

Inspirado por otra respuesta a otra pregunta , sugiero usar proxychains-ng (que es la versión más nueva de proxychains ).

  1. Descargue, compile y, opcionalmente, instale proxychains-ng .
  2. Crear un proxychains.confarchivo en el directorio actual, o en ~/.proxychains/proxychains.conf, o en /etc/proxychains.conf.
    • Alternativamente, cree un archivo en cualquier otro lugar, o con otro nombre, y especifique si a través -fde un argumento de línea de comandos o mediante PROXYCHAINS_CONF_FILEuna variable de entorno.
    • Hay un archivo de configuración de muestra disponible. Las opciones más relevantes están al final.
  3. En su proxychains.confarchivo, agregue:

    [ProxyList]
    socks5 127.0.0.1 1234
    
  4. Ejecutar ssh -D 1234 your_host_b. Esto hará que ssh escuche en el puerto 1234 en localhost y use su host remoto como proxy SOCKS.

    • Alternativamente, corre en su ssh -ND 1234 your_host_blugar. -Nevitará que ssh ejecute cualquier comando en el servidor remoto (es decir, no abrirá un shell).
  5. Ejecute: proxychains4 yourcommandhere yourparametershere. Ver algunos ejemplos:
    • proxychains4 wget -O - http://ifconfig.co/
    • proxychains4 -q links http://ifconfig.co/
Denilson Sá Maia
fuente
2

Opción 0:

Para usar wgetcon un proxy SOCKS5 de ssh, debe instalar el security/dantepaquete para usar la SOCKS_SERVERopción con la socksifyutilidad.

sudo pkg_add dante

Posteriormente, abre una conexión SSH en segundo plano:

ssh -N -C -D1080 user@hostB &

Y use wget a través de un proxy SOCKS5 a través de socksify:

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

Opción 1:

Simplemente conecte el archivo al stdoutservidor y léalo desde stdinsu estación de trabajo.

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

Puede hacer un túnel ssh desde la casilla A a la casilla B y agregar a la tabla de enrutamiento en la casilla A, se puede acceder a ese sitio web C a través del túnel a la casilla B. Debe permitir el reenvío de paquetes en la casilla B.

Aquí puedes ver un muy buen tutorial paso a paso ...

Jan Marek
fuente
1

Tendría que crear un túnel en la máquina B que redirigiría la llamada al sitio web C. Pero me desconcierta por qué esto sería más rápido, a menos que su ISP tenga algunas restricciones.

No conozco una línea, pero esto no es mucho más complicado.

En la máquina A, sí (tomé 11111 al azar, puede tomar lo que quiera siempre que sea> 1024, o necesitaría ser root)

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

El nombre de usuario en B es el que usa para conectarse a B. Esto debería crear un túnel en el puerto 11111 en la máquina B que redirija al puerto 80 (sitio web en HTTP use 443 para HTTPS) en la máquina C (espero no haberme metido el orden ;) )

Luego puede descargar el archivo directamente desde la máquina A a través de la máquina B. Supongo que el archivo está en http://C/path/to/filemodo que entonces usaría:

wget http://B:11111/path/to/file
Huygens
fuente
¿No funcionaría esto solo si se puede acceder al archivo sin un alojamiento virtual basado en el nombre de HTTP 1.1? Dado que la solicitud GET emitida por wget indicaría el nombre de host como B, no C.
un CVn
@ MichaelKjörling No tengo suficiente conocimiento para responderte.
Huygens