Pregunta

No es realmente una pregunta de programación, pero es relevante para muchos programadores ...

Digamos que he abierto una sesión SSH en otra computadora.

  

remoto: html avalys $ ls
  welcome.msg index.html readme.txt
  remoto: html avalys $

¿Hay algún comando que pueda escribir en mi shell remoto que transfiera inmediatamente uno de los archivos en el directorio actual (por ejemplo, welcome.msg) a mi computadora local, es decir,

  

remoto: html avalys $ stransfer welcome.msg
  Obteniendo /home/avalys/html/welcome.msg en welcome.msg
  /home/avalys/html/welcome.msg 100% 23KB 23.3KB / s 00:00
  remoto: html avalys $

La única forma en que sé hacer esto es abrir una sesión SFTP paralela y un CD en mi directorio actual en la sesión SSH, que es una verdadera PITA cuando se administra un servidor de forma remota.

EDITAR: Soy consciente de la posibilidad de usar una conexión sftp / scp inversa, pero eso implica más tipeo. Sería genial si pudiera escribir solo el nombre de algún comando (por ejemplo, " stransfer "), y el / los archivo (s) que quiero transferir, y que solo funcione.

¿Fue útil?

Solución

Puede configurar una conexión de transferencia invertida con / ssh -Port: 127.0.0.1: 22 user @ host para scp back.

Use scp user @ host: port para acceder a él.

Otros consejos

Al investigar esto, encontré un programa que funciona como un reemplazo directo para el cliente openssh, zssh.

sudo apt-get install zssh
zssh user@remote
sudo apt-get install zssh
sz file.name
<ctrl>+<space>
rz

Funciona como un encanto.

Aquí está mi solución preferida para este problema [tal como aparece en una pregunta duplicada que hice]. Configure un túnel ssh inverso al crear la sesión ssh. Esto es fácil gracias a dos funciones bash: grabfrom () debe definirse en el host local, mientras que grab () debe definirse en el host remoto. Puede agregar cualquier otra variable ssh que use (por ejemplo, -X o -Y) como mejor le parezca.

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; };
function grab() { scp -P 2202 $@ localuser@127.0.0.1:~; };

Uso:

localhost% grabfrom remoteuser@remotehost
password: <remote password goes here>
remotehost% grab somefile1 somefile2 *.txt
password: <local password goes here>

Aspectos positivos:

  • Funciona sin software especial en ninguno de los hosts más allá de OpenSSH
  • Funciona cuando el host local está detrás de un enrutador NAT
  • Se puede implementar como un par de dos funciones bash de una línea

Negativos:

  • Utiliza un número de puerto fijo, entonces:
    • no funcionará con múltiples conexiones al host remoto
    • podría entrar en conflicto con un proceso que usa ese puerto en el host remoto
  • Requiere localhost aceptar conexiones ssh
  • Requiere un comando especial al iniciar la sesión
  • No maneja implícitamente la autenticación al localhost
  • No permite especificar el directorio de destino en localhost
  • Si tomas de múltiples hosts locales al mismo host remoto, a ssh no le gustará que cambien las teclas

Trabajo futuro: Esto todavía es bastante torpe. Obviamente, sería posible manejar el problema de autenticación configurando las claves ssh adecuadamente y es aún más fácil permitir la especificación de un directorio remoto agregando un parámetro para grab ()

Más difícil es abordar los otros aspectos negativos. Sería bueno elegir un puerto dinámico, pero por lo que puedo decir, no hay una manera elegante de pasar ese puerto al shell en el host remoto; Lo mejor que puedo decir es que OpenSSH no le permite establecer variables de entorno arbitrarias en el host remoto y bash no puede tomar variables de entorno de un argumento de línea de comandos. Incluso si pudiera elegir un puerto dinámico, no hay forma de asegurarse de que no se use en el host remoto sin conectarse primero.

Puede montar una conexión ssh con sshfs. De esa manera, puede transferir archivos dentro de la misma conexión ssh, mientras usa el cliente ssh que más le guste. Incluso puede configurarlo para el montaje automático si lo desea.

Si está interesado en parchear cosas (en mi humilde opinión, no debería ser parcheado), eche un vistazo a ssh-xfer

Podría escribir un script bash llamado stransfer que tomaría un argumento de nombre de archivo, luego intercalaría el nombre de archivo en el comando scp, suponiendo que el servidor y la ruta a los archivos en el servidor no cambien.

O si el archivo es siempre el mismo, puede crear un alias en su archivo ~ / .bashrc.

alias getwelcome = 'scp avalys @ remotehost: /home/avalys/html/welcome.msg.'

Tenía el mismo pensamiento que Paul Tomblin escribió en un comentario a la pregunta. Las antiguas sesiones de terminal solían usar protocolos y herramientas de módem x, y y z ( sz y rz para las variantes de z-modem) para lograr algo como esto. No estoy seguro de si funcionarán en una sesión ssh, pero valdría la pena intentarlo.

Fink suministra un paquete lrzsz con estas herramientas en Mac OS X.

Hacer de esto un wiki de la comunidad porque me sentiría mal por tener reputación después de que Paul llegó allí primero ...

En la escuela, si estoy transfiriendo un archivo de un sistema Linux a otro, usualmente remoto usando ssh y luego uso scp para transferir el archivo desde el sistema remoto de regreso a mi computadora. No estoy seguro de si eso es lo que está buscando o si eso es aplicable en su caso, pero esa suele ser mi forma de evitar tener que abrir otra ventana de terminal.

Solo para aclarar que si no está familiarizado con scp, aún tendría que especificar la ubicación de la que desea colocar el archivo en su computadora, pero para mí, en general, esto es algo más fácil de recordar que la ubicación del archivo en la computadora remota. Aquí hay un enlace que puede ser útil: http://www.computerhope.com/unix/scp .htm

https://superuser.com/questions/259481/reverse-scp-over-ssh -conexión

sftp server
get file.txt

Aparentemente, también puede navegar por n cosas en la consola sftp, y get toma una ruta de archivo completa. Copias al directorio desde el que ejecutó sftp .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top