Descargue un archivo en una sesión SSH activa

86

Quiero descargar un archivo de una sesión SSH activa. En muchos casos, probablemente podría sólo tiene que utilizar SFTP, scp, rsyncet al, pero hay momentos en los que he elevados permisos en el servidor remoto de una manera que no puedo usar estos métodos.

Si te cuesta entender lo que quiero decir, imagina que deseas descargar algo de /root/o /var/log/auth.log. El inicio de sesión raíz está deshabilitado (porque no somos idiotas). ¿Cómo se obtiene ese archivo? ¿Copiarlo en un lugar menos protegido y luego moverlo? Esto es torpe. También hay escenarios en los que la ruta remota es compleja o temporal, o ni siquiera es una ruta porque quiero que la salida de un comando remoto se almacene localmente. ¿Almacenar de forma remota y luego copiar? Clunk!

Hay varias formas más torpes de lograr versiones de estos, pero en un mundo ideal, tendría algo similar al acceso de escritura local desde el servidor remoto, utilizando la sesión SSH existente como un conducto. Algo así (esto es solo la impresión de un artista):

$oli@remote: cp /root/cheesecake /local/

Y solo aparece en mi local cwd. Y el acceso bidireccional no sería algo malo.


Han pasado ocho largos años desde que hice esta pregunta y hemos visto un rango real de clunk, pero sigue siendo un problema con el que todavía lucho ocasionalmente.

He refactorizado la pregunta en algo mucho más idealista. Entiendo completamente que puede que actualmente no haya una respuesta perfecta. Todos los esfuerzos pasados ​​y futuros hacia mi ideal son apreciados.

Oli
fuente
1
¡Interesante pregunta! Realmente muestra cómo las ideas de las personas sobre lo que es sensato hacer se configuran con las herramientas que utilizan. zsshprobablemente esté más cerca del flujo de trabajo tipo zmodem que pueda estar recordando.
Poolie
1
Estoy realmente sorprendido de que incluso después de 8 respuestas, realmente no hay ninguna forma de hacer esto
endolito

Respuestas:

34

Es posible que desee consultar zssh , que está disponible en el universo y, por lo tanto, disponible con

sudo apt-get install zssh

Lo necesita en su servidor ubuntu y en su cliente, pero básicamente cuando inicia sesión con zssh, simplemente presiona 'ctrl- @' y aparece el "Modo de transferencia de archivos" que le permite enviar archivos de vuelta por la tubería a su máquina cliente, o cárguelas del cliente al servidor.

Sin embargo, no tiene que volver a autenticar o abrir una nueva ventana para scp.

Si está utilizando claves ssh y un agente ssh, puede hacer fácilmente:

[enter]~[ctrl]-Z

Lo que hará ssh en segundo plano, y luego solo scp $!:/whatever/whatever .'

Una vez que se transfiere el archivo, fgpara recuperar ssh.

Si no está usando las teclas ssh, aún puede usar las opciones "ControlMaster" y "ControlPath" agregadas a las versiones recientes de OpenSSh, pero eso se vuelve complicado, consulte man ssh_config

SpamapS
fuente
24

Suponiendo que esté ejecutando un servidor ssh en su escritorio (hay formas de evitar esto, pero creo que todos agregan complejidad y posiblemente tienen problemas de seguridad), puede configurar un túnel ssh inverso. Consulte SSH copiar fácilmente el archivo al sistema local. encima en unix.SE .

  • Escriba Enter ~C Enter -R 22042:localhost:22 Enterpara crear un reenvío de puerto inverso desde su servidor a su escritorio (22042 puede ser cualquier número de puerto entre 1024 y 65534 que no esté en uso).
  • Luego scp -P 22042 foo localhost:copiará el archivo fooen su directorio actual en el servidor a su hogar en el escritorio.
  • Ahora mueva el archivo a su directorio actual en el escritorio escribiendo Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

Las secuencias de escape Ssh comienzan con ~; la tilde solo se reconoce después de una nueva línea. ~ Ctrl+Zpone ssh en segundo plano. ~Cingresa una línea de comando donde puede crear o eliminar un reenvío.

Gilles
fuente
1
Usar 2 capas de encriptación y compresión es un poco exagerado, por eso sugerí usar rsh o ftp para el "vínculo de retroceso".
JanC
2
@ JanC: Eso requiere más configuración: debe instalar un servidor rsh o ftp y asegurarse de que su configuración sea segura. La sobrecarga del cifrado es mínima incluso en una netbook.
Gilles
Un servidor ssh tampoco está instalado por defecto. ;)
JanC
@ JanC: Otra ventaja de ssh es que si ha habilitado el reenvío de agentes, no tendrá que escribir una contraseña para hacer la copia. Eficiencia del flujo de trabajo sobre la microeficiencia informática.
Gilles
También puede hacer algo así con (algunos) otros servicios, por supuesto. En cualquier caso, hay múltiples soluciones similares que implican configurar una conexión de túnel y un demonio adicional ...;)
JanC
10

Se me ocurrió una manera de hacer esto con ssh estándar. Es un script que duplica la conexión ssh actual, encuentra su directorio de trabajo en la máquina remota y copia el archivo que especifique en la máquina local. Necesita 2 scripts muy pequeños (1 remoto, 1 local) y 2 líneas en su configuración ssh. Los pasos son los siguientes:

  1. Agregue estas 2 líneas a su ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Ahora, si tiene una conexión ssh para abrir machineX, no necesitará contraseñas para abrir otra.

  2. Haga un script de 1 línea en la máquina remota llamada ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Cree un script en la máquina local llamado ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. y crea un alias para grab.sh en ( ~/.bashrco donde sea):

    alias grab=~/.grab.sh
    

Eso es todo, hecho. Ahora, si ha iniciado sesión machineX:/some/directory, simplemente inicie una nueva terminal y escriba

grab machineX filename

Eso coloca el archivo en su directorio de trabajo actual en la máquina local. Puede especificar una ubicación diferente como tercer argumento para "agarrar".

Nota: Obviamente, ambos scripts deben ser "ejecutables", es decir chmod u+x filename.

sebix
fuente
Interesante, ¿podría explicar cómo funciona esto? ¿Eres capaz de extender esto para admitir "poner" archivos y también agarrarlos?
Peter Gibson
5

Si su máquina cliente (la máquina en la que está sentado) se llama máquinaA y la máquina en la que se encuentra actualmente SSH se llama máquina B. MáquinaA, su máquina local debe tener SSHD funcionando y el puerto 22 abierto. Entonces:

scp myfile machineA:

Copias myfileen MachineB al directorio de inicio de mi MachineA en machineA. Esto supone que el ID de usuario / contraseña son los mismos.

scp myfile machineA:/newdir/newname

Copias myfileuno a machineB /newdir/newnamede Machinea. Esto supone que el ID de usuario / contraseña son los mismos.

scp MachineA:/path/to/my/otherfile . 

Obtiene una copia de otherfilemi directorio MachineA en MachineA y la coloca en mi directorio de trabajo actual en la máquina MachineB (designada en forma UNIX estándar por el carácter "punto" (.)). Esto supone que el ID de usuario / contraseña son los mismos.

Si el ID de usuario / contraseña no son los mismos, use:

scp myfile user@MachineA: para obtener el archivo

scp user@MachineA:/path/to/my/otherfile . poner archivos

NOTAS sobre SCP:

Al igual que el cpcomando, scptiene una opción -p para propagar la configuración de permisos del archivo original a la copia (de lo contrario, la copia se realiza con la configuración normal para archivos nuevos) y una opción -r para copiar un árbol de directorios completo con uno mando.

scpcrea un canal de datos cifrados completamente transparente entre las dos máquinas, por lo que los datos binarios (como imágenes o programas ejecutables) se conservan correctamente. Esto también significa que scpno puede realizar la conversión automática de terminación de fin de línea entre diferentes tipos de sistemas operativos, como se puede hacer con ftp en modo "ascii". Eso no será un problema al copiar entre sistemas Unix, que utilizan la misma convención de fin de línea.

LukeInDC
fuente
2

si accede al servidor a través de ssh, también puede conectarse a través de sftp. Mantenga a mano el cliente de filezilla (GUI) y pegue la ruta en la que se encuentra actualmente

ingrese la descripción de la imagen aquí

chorro
fuente
2
Esto se beneficiaría con mayores detalles, incluida la forma de conectarse a un servidor SSH con FileZilla (no es obvio). Las capturas de pantalla también pueden ayudar, además del texto explicativo .
Eliah Kagan
2

Si su archivo es lo suficientemente pequeño, puede codificarlo con base64 y luego decodificarlo localmente:

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

Respuesta original de donde obtuve esto (y probado) de: https://unix.stackexchange.com/a/2869/194134

Wesalius
fuente
¿Qué tiene eso que ver con algo? No necesita codificar archivos para enviarlos con scp, etc.
HörmannHH
1

No está sobre la conexión SSH activa, pero scp copia archivos usando los mismos mecanismos y permisos que ssh.

msw
fuente
44
Soy consciente de scp pero es un flujo de trabajo muy inconexo. Si estoy trabajando en un directorio remoto determinado, necesito obtener la ruta remota, desconectar (o generar otro shell), realizar el scping escribiendo las rutas y luego volver a conectar. Estoy buscando algo similar a la escritura get filey aparece mágicamente en mi máquina local. Si tiene que hacer eso a través de algún servicio tunelizado a través de SSH, que así sea ... Pero debería estar vinculado a la sesión.
Oli
Además, fue reemplazado por sftp (ver mi respuesta)
Olivier Lalonde
@Oli: dado que ambos extremos de la transacción son cuadros * nix, es probable que ambos se hayan sshdejecutado y, por lo tanto, debería poder usarlos scpen la línea de comandos del servidor para devolver los archivos al cliente. Solo hay mucha magia para todos; a veces todavía tenemos que presionar los botones. La solución FileZilla también es útil.
zerobandwidth
1

Esto no es posible con una sesión ssh predeterminada, pero podría usar un script en lugar de ssh, que inicia algo así como un simple servidor ftp o rsh en su sistema local y ejecuta ssh con las opciones necesarias para configurar un túnel en su escritorio para conectarse a este servidor.

JanC
fuente
O podría simplemente scp / rsync ...
HörmannHH
1

konsole tiene esa capacidad a través del menú "Editar-> Subir ZModem" mientras está en una sesión remota (o Ctrl-Alt-U).

Tenga en cuenta: el paquete lrzszdebe instalarse primero. Para mí, parece que solo funciona para cargar archivos ASCII.

chorro
fuente
0

Como se está conectando desde un escritorio, supongo que puede abrir una segunda terminal.

Así es como lo hago a menudo:

  • desde el primer terminal, el que está ejecutando la sesión ssh, obtengo la ruta completa del archivo que necesito obtener, usando uno realpath myfileo readlink -f myfile(las versiones anteriores de Ubuntu no se preinstalan realpath) y lo copio.
  • desde el segundo terminal que uso scpo sftppara obtener el archivo, pegando la ruta completa que obtuve antes. Por ejemplo:scp user@host:/etc/some/file ./

Es bastante básico, pero también es fácil de recordar y no necesita ningún paquete adicional para funcionar.

obtenga la ruta completa desde la primera terminal y luego pegue en la segunda terminal

gerlos
fuente
No ayuda con el problema "tratar de obtener un archivo raíz e iniciar sesión directamente desde la raíz está prohibido" planteado en la pregunta.
Oli
0

Sorprendentemente, no veo ninguna mención del buen viejo Comandante de Medianoche aquí. En mi opinión, es probablemente el administrador de archivos más universal y útil para shell con capacidades de potencia, una de las herramientas "imprescindibles" para el caso, que también le permite conectarse a través de SSH, FTP, SFTP, mientras está encendido el segundo panel puede abrir cualquier otro sistema de archivos (su local) y trabajar con archivos libremente.

Todo lo que necesitas es: apt-get install mc (del universo)

Después de eso, ejecute mc, abra el menú para el panel izquierdo o derecho, elija la conexión de shell, ingrese username @ remote-ip, la contraseña; en realidad, eso es todo ... copie (aquí: descargue) archivos / carpetas de una máquina a otra con F5, muévase con F6, y así sucesivamente según los botones a continuación. Para los antiguos usuarios de MS: al igual que en NC para DOS

Nex0
fuente
-2

MANERA de pensar demasiado en esto, amigos. Estaba buscando todas las respuestas profundas, oscuras y complejas también. Resulta que puedes hacer esto directamente desde Dolphin directamente de la lata. fish: // nombre de usuario @ servidor: puerto

Víctor
fuente
No lo entiendo
Pierre.Vriens
No creo que entiendas mi caso de uso. Estoy en una sesión de línea de comando SSH activa y quiero enviar un archivo a mi computadora local desde una ubicación [potencialmente privilegiada, es decir, no disponible a través de SFTP]. Puede que ni siquiera sea un archivo en su origen, podría ser una salida de comando. Estoy buscando alguna forma de canalizarlo sin crear archivos intermedios e iniciar nuevas sesiones SFTP / SCP / etc.
Oli