Copie un archivo de nuevo al sistema local con ssh


257

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?


44
Si tiene un servidor ssh en su cliente, siempre puede intentar scp file.foo user@myclient.com:file.foo: P
rahmu

44
Seguro, pero no quiero permitir el acceso a mi computadora desde un servidor propiedad de una compañía para la que trabajo :) Solo tengo autenticación basada en claves aquí de todos modos, y no sería demasiado seguro poner mi clave privada arriba en el servidor!
Naftuli Kay

2
No entiendo tu problema. Genere un nuevo par de claves, copie la parte pública en sus computadoras autorizado_keys y luego de su transferencia elimine esa línea nuevamente.
Nils

8
Hago esto mucho, por lo que sería ineficiente hacerlo cada vez que quiera copiar un archivo en medio de una sesión SSH. Solo estoy buscando una manera, mientras estoy en una sesión de terminal SSH, de volver a conectarme a mi computadora local y hacer que envíe un archivo al servidor remoto sin tener que abandonar la sesión SSH actual.
Naftuli Kay

2
El problema es que el inicio de sesión ssh inicial puede ser un problema (2fa u otros desafíos más allá de la clave o contraseña), es posible que no tengamos los privilegios para cambiar la configuración del servidor ssh, no hay razón para tener que negociar las claves varias veces, y que una vez que tengamos una sesión, sería bueno usar esa sesión para múltiples cosas.
duanev

Respuestas:


139

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 su ~/.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:22donde 22042 es un número elegido al azar que es diferente de cualquier otro número de puerto en la máquina remota. Luego, ssh -p 22042 localhosten la máquina remota, se conecta de nuevo a la máquina de origen; 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 xclipo 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 -

Si podemos transferir archivos usando SSH, ¿por qué la gente todavía necesita / usa SFTP?
Pacerier

3
@Pacerier Porque SFTP es una forma de transferir archivos usando SSH.
Gilles

¿Por qué las personas incluso necesitan SFTP si pueden transferir archivos usando SSH sin SFTP?
Pacerier

El método de copiar y pegar es particularmente conveniente con conexiones encadenadas (es decir, saltar a través de varios hosts para llegar al último)
golimar

1
@Pacerier SFTP tiene algunos comandos adicionales como listar archivos o eliminar un archivo remoto, etc.
rahmu

67

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

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

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


8
Honestamente, no entiendo por qué esto no ha sido votado. OP solicitó una solución sin scp. A veces, particularmente en mi caso en el que me estoy metiendo en un enrutador proporcionado por un ISP muy lisiado, no tengo sftp, no tengo scp, e incluso ftp está muy dañado. Sabía que podía hacer esto, solo vine para asegurarme de que mi sintaxis era correcta.
Auspex

1
¡Brillante! mcEs el más rápido de usar.
Namek

2
En realidad, esta solución no funciona en mi caso. Con un túnel creado de Windows a Linux, comienzas en masilla, no en una terminal. Este método es exactamente lo que quería, pero no puedo usarlo. Irritado.
Benjamin

1
La razón por la que no estoy votando esto es porque no funcionará si la máquina del cliente está detrás de un enrutador compartido (como una red corporativa). Supongo que estoy en una computadora de trabajo y he ingresado en el servidor de mi casa. ¿Cómo copio un archivo a la computadora de mi trabajo después de los dolores de cd'ing a través de directorios complejos con espacios y caracteres especiales?
Sridhar Sarnobat

1
Funciona bien con datos binarios. Estoy haciendo esto con tgzarchivos todo el tiempo :)
Florian Fida

53

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

El !argsparece estar más cerca de lo que quieres. Tenga en cuenta que deberá tener PermitLocalCommandhabilitado en su /etc/ssh_configarchivo para que los ~Ccomandos funcionen (ver man ssh_config).

Se puede volver a utilizar la misma sesión ssh si se configura una ControlMasteren ssh_config. Si haces esto:

$ ~C
ssh> !scp file user@myserver:

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.


¿Esto todavía funciona? No pude encontrar !argsen el mensaje de ayuda.
xuhdev

@xuhdev todavía está allí en OpenSSH_7.2p2, argsno está en el primer mensaje de ayuda ( ~?), pero en el segundo (una vez que se ingresa el ssh>mensaje con ~C, se puede escribir helpen el ssh>mensaje)
sdaau

Esto parece una buena solución (aunque no lo he probado), no me di cuenta de que puede obtener un búfer de línea de comando principal, estilo vim. En la práctica, uno podría simplemente preferir abrir una nueva pestaña de terminal para que no olviden cómo volver a la sesión (como cuando nunca puedo recordar cómo salir de emacs).
Sridhar Sarnobat

37

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

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

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


44
Conexión con un archivo de claves:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • 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.
  • Invertir ( -R, para remoto a local) o reenviar ( -L, para local a remoto) puertos 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 ControlMastery ControlPath configuró (también ControlPersistes útil),

  # primera conexión
$ ssh remoto

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

55
zmodem me recuerda la descarga del último shareware del BBS local .. :-)
Stuart Woodward

La forma xfer es exactamente lo que estaba buscando, pero ¿sabe por qué el parche ssh-xfer no está incluido en el flujo ascendente de OpenSSH? Alguna llama?
Ferran Basora

Gracias por la pista zssh! Estoy usando tmux en Konsole y debido a tmux mi "sz" del servidor ya no funciona. ¡El zssh resuelve mis problemas!
0xAF

9

Un enfoque aún más simple: abra Filezilla (o su navegador ftp favorito), abra una conexión ssh al mismo sitio, encuentre 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.



Creo que el servidor FileZilla es solo para Windows. Sin embargo
Freedom_Ben

Incluso podrías usar Caja, solo abrir ssh://SERVER.
basic6

8

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

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

Esto evita la necesidad de usar scpo tener un servidor ssh local. Lo uso con cygwin por ejemplo. El único problema es que esto requiere instalación xclipsi aún no lo tiene. Ah, y esto también funciona con archivos binarios.


Wow, esta podría ser una mejor solución que mi reenvío de puerto inverso más netcat.
Sridhar Sarnobat

3

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 desde y hacia un sistema en el que está SSH:

  • 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 escribe algo como sz file-to-downloaden la línea de comando remota, el szprograma remoto escribe una secuencia de escape que le dice a SecureCRT que comience a descargar de inmediato file-to-downloaden el directorio de descarga predeterminado.

    Un buen detalle es que el directorio de descargas 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.

    ( szes el programa "enviar ZModem", parte del lrzszpaquete. Ya está empaquetado para la mayoría de los sistemas Unixy. Si por alguna razón su sistema remoto ya no lo tiene instalado y no puede instalar fácilmente un paquete binario, el 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 simplificado para poder enviarle archivos ZModem).

  • SFTP : SecureCRT tiene una implementación básica de SFTP 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 sftpprograma de OpenSSH , excepto que tiene ventajas como la Tabfinalización de comandos. Por lo tanto, recuperar un archivo remoto llamado somefile.tar.gzpodría ser tan fácil como get soTabEnter.

  • Arrastrar y soltar : si arrastra y suelta un archivo en la ventana del terminal, se teclea automáticamente rzy 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, el envío de un archivo a un sistema remoto podría ser tan simple como Alt-P, arrastrar , soltar .

    Descubrimos 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 rzen 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 rzcomando explícito . 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.


1

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.