¿Usando sftp para transferir un directorio?

50

Cuando intento usar sftp para transferir un directorio que contiene archivos, aparece un mensaje de error:

skipping non-regular file directory_name

El directorio contiene un par de archivos y dos subdirectorios.

¿Qué estoy haciendo mal?

Haziz
fuente

Respuestas:

49

sftp, like cpy scp, requiere que cuando copie una carpeta (y su contenido, obviamente), tenga que decirle explícitamente que desea transferir la carpeta de forma recursiva con la -ropción.

Entonces, agregue -ral comando.

Kevin
fuente
2
-r después del comando put? Recibo un mensaje de error "put: bandera inválida -r" si lo hago. Agregarlo al comando sftp original tampoco funciona.
haziz
55
Agregue -ral sftpcomando cuando se conecte. sftp -r user@host
Kevin
1
@Kevin Recibo el siguiente error "sftp: opción desconocida --r"
Amatya
2
Tenga en cuenta que hay un error bastante larga data en SFTP de OpenSSH: al copiar recursivamente un directorio en un servidor remoto, el propio directorio debe existir en el servidor de destino de otro modo la transferencia se producirá un error con un mensaje de error que no es explícita: Couldn't canonicalise: No such file or directory.
WhiteWinterWolf
55
debería ser algo como:# sftp user@remote-host #> get -r remote-folder
hbinduni
21

Solo puedo sugerir, lo usas rsync. Es algo así como un estándar de la industria, cuando se mueven archivos a través de conexiones seguras.

rsync -alPvz ./source_dir server.com:destination_dir

Es lo que he estado usando durante años por ahora.

(la -aopción se ocupa de cosas como la recursividad de directorio)

polemon
fuente
3
Un poco de aclaración sobre los parámetros mencionados: -a= recursión + mantener enlaces simbólicos, permisos, tiempos de modificación, propietario, grupo, archivos especiales y archivos de dispositivo (este último requiere privilegios de superusuario); -l= mantener enlaces simbólicos (ya incluidos en -a); -P= mostrar progreso durante la transferencia + mantener archivos parcialmente transferidos; -v= modo detallado (sin embargo, parece obligatorio cuando se usa -Ppara evitar un error extraño (¿error?) protocol version mismatch); -z= habilitar la compresión de los datos transferidos.
WhiteWinterWolf
@WhiteWinterWolf parece depender de la versión si el -linterruptor debe usarse o no. Recuerdo que las versiones anteriores no se incluyeron -len -a.
polemon
5

También puede usar el uso scp. El formato general es

scp -rp sourceDirName username@server:destDirName

scpsignifica "copia segura". Las banderas son

  • -r recurrir a subdirectorios
  • -p preservar tiempos de modificación

Creo que el resto de los elementos se explican por sí mismos.

Bina Ramamurthy
fuente
y scp -rp -P <port> .... cuando se utiliza un puerto no estándar
Pancho
4

Esto funciona para mi:

1) conectarse a través sftpde un host remoto

2) cambie al directorio remoto que desea copiar. (Ejemplo: cd Music)

3) cambie al directorio local al que desea copiar cosas. (Ejemplo: escritorio lcd)

4) Emita este comando: get -r *

Don karon
fuente
4

Si rsyncno es una opción, luego recomendaría lftp:

lftp sftp://[email protected]/path/path/

Luego use el mirrorcomando para cargar recursivamente, así:

mirror -R

(Tenga en cuenta que la recursividad es la predeterminada. -REs para revertir : para que el comando espejo se cargue en lugar de descargar. Intente agregar --dry-rununa prueba para asegurarse de que está haciendo lo que espera).

O para subir sin recursividad:

mirror --no-recursion

Tienes que cdingresar a los directorios que deseas reflejar. ¡Funciona genial!

Banago
fuente
2

Si puedes, usa sshfs . Es un sistema de archivos FUSE , disponible en la mayoría de los equipos modernos, y funciona con cualquier servidor SFTP. Este es un sistema de archivos remoto: le permite manipular archivos remotos (a través del protocolo SFTP) con las utilidades habituales.

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point
Gilles 'SO- deja de ser malvado'
fuente
0

Es un poco difícil pero lo que funciona para mí es:

  1. Use sshpara iniciar sesión en la máquina remota
  2. Uso sftpdesde la máquina remota a su máquina local
  3. Luego use el getcomando con la -ropción de mover el directorio y todos sus archivos.
Matthew Greene
fuente
1
no trabaje con -rsftp> get -r data /opt/bin get: Invalid flag -r
Skynet
0

Si su pregunta es en realidad '¿cómo uso sftp para transferir un directorio', entonces

 sftp -r user@server

Pero si transfiere un directorio, podría sugerir dos mejores opciones, según sus necesidades. sftprequiere iniciar sesión en el servidor remoto en un símbolo del sistema de tipo ssh, pero si todo lo que desea son los archivos, hay formas más fáciles y rápidas.

Scp

Para una transferencia única, para subir prueba:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

Rsync

Si planea sincronizar los directorios de manera regular, usar rsync tiene más sentido. Realiza deltas entre los dos directorios, ahorrando tiempo de transferencia y datos a través del cable.

rsync -r -a -v -e ssh --delete source_dir user@server:dest

Aquí hay una lista de algunas de las opciones rsync más comunes: ( tomado de aquí )

  • --delete - elimina archivos que no existen en el remitente (sistema)
  • -v - detallado (-vv proporcionará información más detallada)
  • -e "opciones ssh": especifique el ssh como shell remoto
  • -a - modo de archivo - conserva los permisos (propietarios, grupos), tiempos, enlaces simbólicos y dispositivos
  • -r - recurse a directorios
  • -z: comprime los datos del archivo durante la transferencia
  • --excluir 'nombre de carpeta' - excluye la carpeta correspondiente de la transferencia
  • -P: muestra el progreso durante la transferencia

¡Espero que ayude!

Dan Williams
fuente
0

puede llegar desde el servidor a su ruta local al

scp -rp user@server:directoryname(full path) .
usuario368621
fuente
¿Agrega esto alguna información nueva a las otras respuestas publicadas?
41754
¿Esto parece ser casi lo mismo que usar sftp para transferir un directorio?
Kusalananda