it-swarm-es.tech

Copie un archivo de nuevo al sistema local con ssh

Si he iniciado sesión en un sistema a través de SSH, ¿hay alguna manera de copiar un archivo a mi sistema local sin activar otra terminal o sesión de pantalla y hacer scp o algo similar o sin hacer SSH desde el sistema remoto de nuevo al sistema local?

271
Shawn J. Goff

Conexión maestra

Es más fácil si planifica con anticipación.

Abra una conexión maestra la primera vez. Para conexiones posteriores, enrute las conexiones esclavas a través de la conexión maestra existente. En tus ~/.ssh/config , configure el uso compartido de la conexión para que se realice automáticamente:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Si inicia una sesión ssh con el mismo (usuario, puerto, máquina) que una conexión existente, la segunda sesión se tunelizará sobre la primera. Establecer la segunda conexión no requiere una nueva autenticación y es muy rápido.

Entonces, mientras tenga su conexión activa, puede rápidamente:

Reenvío

En una conexión existente, puede establecer un túnel ssh inverso. En la línea de comando ssh, cree un reenvío remoto pasando -R 22042:localhost:22 donde 22042 es un número elegido al azar que es diferente de cualquier otro número de puerto en la máquina remota. Entonces ssh -p 22042 localhost en la máquina remota lo conecta de nuevo a la máquina fuente; puedes usar scp -P 22042 foo localhost: para copiar archivos.

Puede automatizar esto aún más con RemoteForward 22042 localhost:22. El problema con esto es que si te conectas a la misma computadora con varias instancias de ssh, o si alguien más está usando el puerto, no obtienes el reenvío.

Si no ha habilitado un reenvío remoto desde el principio, puede hacerlo en una sesión ssh existente. Tipo Enter ~C Enter -R 22042:localhost:22 Enter. Consulte "Caracteres de escape" en el manual para obtener más información.

También hay información interesante en este hilo de falla del servidor .

Copiar pegar

Si el archivo es pequeño, puede escribirlo y copiar y pegar desde la salida del terminal. Si el archivo contiene caracteres no imprimibles, use una codificación como base64 .

 remote.example.net $ base64 <myfile 
  (copie la salida) 
 local.example.net $ base64 -d> myfile 
  (pegue el contenido del portapapeles) Ctrl+D

Más convenientemente, si tiene el reenvío X activo, copie el archivo en la máquina remota y péguelo localmente. Puede canalizar datos dentro y fuera de xclip o xsel . Si desea conservar el nombre del archivo y los metadatos, copie y pegue un archivo.

remote.example.net$ tar -czf - myfile | xsel
local.example.net$ xsel | tar -xzf -

Otra forma fácil (IMO) sería:

# to remote Host
cat localfile.conf | ssh [email protected] 'cat -> /tmp/remotefile.conf'

# from remote Host
ssh [email protected] 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

O si prefiere algo parecido a una GUI, intente Midnight Commander . Llaman a la función Shell-Link. La mayoría de las distribuciones tienen em en sus sistemas de paquetes como mc.

75
Florian Fida

SSH admite algunos comandos, a través del carácter de escape (~ por defecto):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:Host:hostport    Request local forward
      -R[bind_address:]port:Host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

Los !args parece estar más cerca de lo que quieres. Tenga en cuenta que necesitará tener PermitLocalCommand habilitado en su /etc/ssh_config archivo para el ~C comandos para trabajar (ver man ssh_config).

Puede reutilizar la misma sesión ssh si configura un ControlMaster en ssh_config. Si haces esto:

$ ~C
ssh> !scp file [email protected]:

técnicamente nunca ha dejado la sesión ssh y no necesita volver a autenticarse. Probablemente más complicado de lo que te gustaría, pero no puedo pensar en otra manera fácil.

54
Corey Henderson

Esos son todos métodos muy complicados.
Puede montar el sistema de archivos remoto en su máquina local con sshfs:

mkdir -p /mnt/sshfs

[email protected]:~# sshfs 192.168.1.2:/ /mnt/sshfs
[email protected]:~# umount /mnt/sshfs

Luego puede copiar y pegar el archivo con nautilus, gnome, konqueror, dolphin, bash o lo que sea.

38
Quandary
  • Use ssh-xfer , un agente ssh modificado que sobrecarga efectivamente un canal lateral ssh existente para el uso de transferencia de archivos.
  • Use zssh , que efectivamente es zmodem sobre ssh. Si alguna vez has usado rzsz, esto te resultará muy familiar.
  • Contrarrestar (-R, para remoto a local) o hacia adelante (-L, para puertos locales a remotos) para ejecutar transferencias de archivos, suponiendo que tenga algún demonio de transferencia de archivos escuchando en el otro extremo.

Pero ninguno de estos es realmente necesario, OMI. El protocolo SSH admite múltiples canales en una sola conexión, y el cliente OpenSSH admite multiplexación. Suponiendo que tiene ControlMaster y ControlPathconfiguración (ControlPersist también es útil),

# primera conexión
 $ ssh remoto 
 
 # multiplexará sobre la misma conexión que abrió el ssh original
 $ sftp remoto 
15
ephemient

Un enfoque aún más simple: abra Filezilla (o su navegador ftp favorito), abra una conexión ssh al mismo sitio, busque el archivo y arrástrelo a su estructura de archivos local. Si es nuevo en Filezilla, use la función "administrador del sitio" para volver a conectarse rápidamente la próxima vez.

Sí, sé que esto es obvio para la mayoría de ustedes (y no precisamente en el punto), pero algunos (como yo) que encontraron este hilo buscando una solución solo terminal pueden haber pasado por alto lo obvio.

9
Larry Jones

Lo que he encontrado como la mejor y más eficiente solución es usar xclip-copyfile y xclip-pastefile.

En el servidor, usa xclip-copyfile para copiar uno o más archivos. Estos archivos están disponibles en su servidor local. Allí, puedes usar xclip-pastefile.

Esto evita la necesidad de usar scp o tener un servidor ssh local. Yo uso esto con cygwin por ejemplo. El único problema es que esto requiere instalar xclip si aún no lo tiene. Ah, y esto también funciona con archivos binarios.

8
Robert

Una de las muchas razones por las que usamos SecureCRT , a pesar de preferir el software de código abierto donde sea práctico, es la facilidad de realizar transferencias de archivos. Simplemente no hay reemplazo directo en el mundo F/OSS.

SecureCRT comenzó como un programa puro de Windows a mediados de la década de 1990, pero fue portado a Mac OS X y Linux hace un par de años .

SecureCRT tiene tres características principales para transferir archivos hacia y desde un sistema en el que se SSH'd:

  • ZModem , YModem , XModem , Kermit y ASCII - SecureCRT es un emulador de terminal de la vieja escuela, que admite varios protocolos de transferencia de archivos en banda.

    El más fácil de usar es ZModem. Cuando escribes algo como sz file-to-download en la línea de comando remota, el programa remoto sz escribe un secuencia de escape que le dice a SecureCRT que comience a descargar inmediatamente file-to-download al directorio de descarga predeterminado.

    Un buen detalle es que el directorio de descarga es personalizable por sesión. Usamos esto para tener directorios por sitio en nuestro servidor de archivos de la oficina principal, por lo que no tenemos que ordenar manualmente los archivos descargados.

    (sz es el programa "enviar ZModem", parte del paquete lrzsz . Ya está empaquetado para la mayoría de los sistemas Unixy. Si por alguna razón su sistema remoto no funciona ya lo tengo instalado, y no puede instalar fácilmente un paquete binario, el paquete fuente es pequeño y altamente portátil. Más de una vez, tuve que enviar un lrzsz"sharchive " o uuencode 'd tarball a un sistema remoto despojado para que yo pueda ZModem a él.)

  • [~ # ~] sftp [~ # ~] - SecureCRT tiene una implementación SFTP básica estrechamente integrada.

    Por "estrechamente integrado", quiero decir que cuando le das al comando de menú SFTP o al atajo de teclado, se abre una nueva pestaña conectada al sitio remoto a través de la misma conexión SSH. Por lo tanto, no necesita volver a iniciar sesión y la conexión se establece un poco más rápido que si hubiera abierto una conexión SFTP separada al mismo servidor.

    Caracterizo la función SFTP como "básica", porque VanDyke Software tiene un producto de transferencia de archivos separado, SecureFX . Es más funcional que el cliente SFTP incorporado y también se integra con SecureCRT.

    La función SFTP de SecureCRT le permite configurar directorios remotos y locales predeterminados que son independientes de la configuración de ZModem.

    Esta función SFTP tiene una interfaz de línea de comandos básica que imita el programa sftp de OpenSSH, excepto que tiene posibilidades como Tab comando completado. Por lo tanto, recuperar un archivo remoto llamado somefile.tar.gz podría ser tan fácil como get soTabEnter.

  • Arrastrar y soltar - Si arrastra y suelta un archivo en la ventana del terminal, automáticamente teclea rz para ti y comienza a enviar el archivo.

    Alternativamente, puede abrir una pestaña SFTP y soltar un archivo en esa pestaña para enviarlo a través de SFTP. Por lo tanto, enviar un archivo a un sistema remoto podría ser tan simple como Alt-P, arrastrar, soltar.

    Encontramos que las transferencias se realizan mucho más rápido a través de SFTP, probablemente porque es un protocolo basado en TCP, por lo que se beneficia de las grandes ventanas deslizantes de las modernas pilas TCP/IP . ZModem fue diseñado en los días en que un tamaño de bloque de 64 kiB se consideraba "grande". Por lo tanto, gran parte de la velocidad potencial en un enlace se absorbe en ZModem mientras cada extremo espera confirmaciones de transferencia de bloque.

    Una cosa buena del modo de operación de arrastrar y soltar es que elimina una de las tensiones de usar ZModem. Cuando escribe rz en el sistema remoto, SecureCRT muestra automáticamente un selector de archivos. Luego tiene aproximadamente un minuto para buscar y seleccionar el archivo antes de que se agote el tiempo del lado remoto. Esto crea un ambiente de carrera contra reloj que no es agradable. Arrastrar y soltar le permite encontrar el archivo a su gusto, luego comenzar la transferencia con un solo movimiento rápido del mouse.

    Todavía utilizamos el método manual, comenzando la transferencia con un comando explícito rz. Esto se debe a que SecureCRT le permite configurar un directorio de carga por sesión, que apuntamos a la carpeta en el servidor de archivos que siempre contiene la última versión del software que está ejecutando ese sitio remoto en particular. Para tales transferencias, no hay carrera contra reloj, ya que el selector de archivos se abre en el lugar correcto para comenzar.

3
Warren Young

Utilizar "!" para convertir el archivo a una representación ASCII de su archivo (por ejemplo, ! uuencode myfile.bin >uuencode.dat). Luego use ! cat uuencode.dat >target.dat. Después de eso, use uudecode en el lado de destino: ! uudecode target.dat >myfile.bin

1
Nils