¿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?
(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
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
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).
Descargue, compile y, opcionalmente, instale proxychains-ng .
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.
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).
Ejecute: proxychains4 yourcommandhere yourparametershere. Ver algunos ejemplos:
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 ...
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:
¿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.
SOCKS_SERVER
variable de entorno no tiene efecto en Ubuntu 14.04.wget
no tiene soporte paraSOCKS_SERVER
variable. Esa respuesta sugiere usarcurl --socks5-hostname
ocurl --socks5
.socksify
lugar.socksify
No es una configuración, es un programa separado.SOCKS_SERVER
tener algún efectowget
, entonces debes instalar ports.su/security/dante , y luego ejecutarlo ensocksify wget
lugar de solowget
Otro enfoque podría ser que normalmente inicies sesión
B
, donde comienzas unascreen
sesión. Allí, usted hace elwget
de 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
B
aA
utilizarrsync
(mi preferencia).fuente
Inspirado por otra respuesta a otra pregunta , sugiero usar proxychains-ng (que es la versión más nueva de proxychains ).
proxychains.conf
archivo en el directorio actual, o en~/.proxychains/proxychains.conf
, o en/etc/proxychains.conf
.-f
de un argumento de línea de comandos o mediantePROXYCHAINS_CONF_FILE
una variable de entorno.En su
proxychains.conf
archivo, agregue: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.ssh -ND 1234 your_host_b
lugar.-N
evitará que ssh ejecute cualquier comando en el servidor remoto (es decir, no abrirá un shell).proxychains4 yourcommandhere yourparametershere
. Ver algunos ejemplos:proxychains4 wget -O - http://ifconfig.co/
proxychains4 -q links http://ifconfig.co/
fuente
Opción 0:
Para usar
wget
con un proxy SOCKS5 dessh
, debe instalar elsecurity/dante
paquete para usar laSOCKS_SERVER
opción con lasocksify
utilidad.Posteriormente, abre una conexión SSH en segundo plano:
Y use wget a través de un proxy SOCKS5 a través de socksify:
Opción 1:
Simplemente conecte el archivo al
stdout
servidor y léalo desdestdin
su estación de trabajo.fuente
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 ...
fuente
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)
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/file
modo que entonces usaría:fuente
Puede hacerlo a través del reenvío de puertos (túnel ssh). Aquí hay un recurso: http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.en.html#ToC9
Básicamente, debe configurar el reenvío de puertos en B. Cuando A emite wget a B, B reenviará los paquetes a C y enviará los resultados a A.
fuente