¿Es posible usar comandos de Unix para copiar un archivo de mi subdirectorio en una computadora remota a través de SSH?

17

Tengo una serie de archivos de software descargados en mi subdirectorio ~/Downloadsen mi computadora personal. También estoy usando bash para conectarme remotamente a una computadora usando ssh.

¿Es posible transferir este archivo ssha la computadora remota?

ShanZhengYang
fuente
La pregunta se refiere a un archivo singular ( this file) y múltiples archivos ( a series of software files), la mejor solución depende de si tiene un solo archivo o varios archivos.
user2768

Respuestas:

42

Es posible que desee utilizar scppara este propósito. Es un medio seguro para transferir archivos utilizando el protocolo SSH.

Por ejemplo, para copiar un archivo llamado yourfile.txtdesde ~/Downloadsa una computadora remota, use:

scp ~/Downloads/yourfile.txt [email protected]:/some/remote/directory

Puedes ver más ejemplos aquí .

ARG
fuente
55
Creo que rsyncpuede funcionar también, ahora que lo pienso
ShanZhengYang
1
rsync es demasiado complejo para solo uno o un
puñado
14
@Paebbels Por el contrario, reemplace scparriba con rsyncy debería funcionar bien.
8bittree
Tiendo a usarlo rsyncpara todo, incluso para archivos individuales, porque "simplemente funciona" en los casos simples y puede ser mucho más eficiente en otros casos. Si bien el uso scpo rsyncen cualquier cosa no se ha comprimido y / o cifrado, recuerde apagar la opción de compresión en ( -Ca scp, -zo --compresspara rsync). De hecho, lo enciendo por hábito: es muy raro que encuentre una circunstancia en la que ralentice las cosas (tal vez si está utilizando un dispositivo lento de baja potencia con una potencia de CPI limitada como un rPi).
David Spillett
37

Aunque scpes claramente la herramienta adecuada para esto, si por alguna razón no puede usarlo, puede hacer algo como lo siguiente desde su máquina local para copiar, digamos, una estructura de directorio a la máquina remota:

tar -c . | ssh <remote> tar -x

Esto será tarel directorio actual en la máquina local, y escribir que tara stdoutlos que a continuación se canaliza a un sshcomando en el que se ejecutará un comando a distancia para descomprimir el archivo se lee destdin

Editado para reflejar el comentario de Dietrich Epp acerca de -f -ser el predeterminado en los extremos de creación y extracción, por lo que no es necesario especificarlo explícitamente.

Eric Renouf
fuente
77
Probablemente desee agregar un -C basedirargumento para tarextraer en otro lugar que no sea su directorio de inicio si está haciendo esto.
Dougal
17

Si desea hacer esto en más de una rara ocasión, le sugiero que monte el sistema de archivos remoto sshfssi está utilizando un tipo Unix que admita FUSE (Linux, * BSD, Mac OS X). Haga un directorio debajo de su directorio de inicio, digamos, llamado ~ / remote-server:

    $ mkdir ~/remote-server

Luego monte el sistema de archivos remoto con sshfs. Reemplace "yourserver.com" con el nombre de host de su máquina remota y "nombre de directorio remoto" con el directorio que está utilizando en el sistema remoto.

    $ sudo sshfs [email protected]:/name/of/remote/directory ~/remote-server/

Una vez hecho esto, el directorio remoto forma parte de su sistema de archivos y puede usar todas sus herramientas normales, incluyendo cp:

    $ cp ~/Downloads/your-files ~/remote-server

Si aún no lo ha sshfsinstalado, debería poder instalarlo en su computadora utilizando su administrador de paquetes (busque paquetes con el nombre sshfso fuse-sshfs). Para obtener más información, puede leer un tutorial en línea .

Por cierto, esta es mi forma favorita de administrar archivos en servidores remotos. Normalmente mantengo un servidor de producción y dos servidores de desarrollo montados de esta manera y utilizo mi flujo de trabajo de exploración de archivos normal con ellos.

Benjamin Staton
fuente
Y luego verifique qué opciones de sshfs lo ayudarán a hacer su trabajo mejor. Por ejemplo, comenzando con la asignación de ID de usuario / grupo -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_othery -Cpara la compresión si el ancho de banda es deficiente. Tan pronto como funciona bien, personalmente agrego alias para los comandos para montar rápidamente los sistemas de archivos distantes sobre ssh. @Benjamin_Staton No usaría sudo o root aquí, no sin un mapeo de usuario / grupo adecuado al menos.
tuk0z
9

Primera vez, no hay una diferencia real entre scp(copiar más ssh) y rsync.

Las ejecuciones posteriores se beneficiarán si rsync no copia los archivos que ya existen.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a para todos los archivos
  • -v para detallado
  • -H para "simplemente descubrir enlaces simbólicos y hacer lo correcto"
  • luego rutas de origen y destino. Puede usar comodines en la fuente o simplemente sincronizar todo el directorio.

Otras banderas útiles incluyen:

  • --delete para eliminar archivos en el destino que ya no existen en la fuente.
  • --dry-run para pruebas: muy útil cuando se combina con --delete.

Esto usará ssh teclas para iniciar sesión sin contraseña, si las tiene configuradas.

Al final de la ejecución, rsyncle dirá cuántas veces más rápido fue hacer la copia simple nuevamente.

Criggie
fuente
1
-Hen realidad es para enlaces duros, detiene el mismo contenido que se envía dos veces o más cuando está vinculado a más de un lugar en la estructura del directorio de origen (pero puede hacer que el proceso sea menos eficiente para estructuras de directorio grandes). no tiene ningún efecto en los enlaces simbólicos, pero algunas de las opciones incluidas por -a/ --archivesí afectan cómo se procesan los enlaces simbólicos.
David Spillett
4

Para agregar a las respuestas anteriores. A veces no estoy exactamente seguro acerca de la ruta remota. En estos casos yo usosftp para navegar primero a la ubicación requerida, luego utilizo get o put para descargar o cargar un archivo.

Si también desea mantener algo siempre sincronizado e incluso desea ejecutar localmente algún archivo ubicado en una máquina remota, sshfsfunciona muy bien.

aragaer
fuente
-1

Estoy haciendo algo muy similar con ssh. Creé una herramienta de compilación personalizada para Visual Studio y básicamente estoy haciendo que VS ejecute un comando ssh que copia mi código en una computadora de destino y luego lo compila en esa computadora de destino.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand '

Observe el uso de comillas simples y punto y coma. El primero encapsula sus comandos a hostB a través de ssh y el segundo le permite ejecutar múltiples comandos del sistema hostB en un comando ssh desde hostA.

Para que esto funcione, deberá configurar las claves ssh en su máquina de inicio para que pueda ser usuarioA @ hostA e iniciar sesión en hostB como usuarioB. El proceso para crear una clave ssh pública para userA @ hostA está bien documentado. Si no crea una clave pública en el hostA para el usuarioA, y copia esa clave en el hostB como usuarioB, entonces se verá obligado a ingresar su contraseña cada vez, lo que arruina la alegría de la automatización.

Andrés
fuente
¿Puede alguien que votó en contra dejar un comentario sobre por qué votaron en contra? Los votos negativos no tienen sentido sin comentarios informativos. Gracias. He abordado la pregunta específica del OP con una respuesta que se relaciona directamente. No estoy introduciendo nueva tecnología ni sugiriendo rutas alternativas. ¿Por qué? quizás OP no quiera usar rutas alternativas.
Andrew