Subiendo directorios con sftp?

97

Tengo algunos problemas para cargar directorios (que contienen otros directorios de algunos niveles de profundidad) por sftp. Me doy cuenta de que podría solucionar esto al comprimir, pero no veo por qué es necesario.

De todos modos, lo intento

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

Creo que el último mensaje de error es completamente estúpido. ¿Entonces el directorio no existe? ¿Por qué no crear el directorio?

¿Hay alguna forma de solucionar este problema con sftp, o debería usar scp?

Earlz
fuente

Respuestas:

68

CORREGIDO : Inicialmente alegué erróneamente que OpenSSH no era compatible put -r. Lo hace, pero lo hace de una manera muy extraña. Parece esperar que el directorio de destino ya exista, con el mismo nombre que el directorio de origen.

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

Lo que es especialmente extraño es que esto se aplica incluso si le da un nombre diferente al destino:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

Para un recursivo mejor implementado put, puede usar la psftpherramienta de línea de comandos PuTTY en su lugar. Está en el putty-toolspaquete bajo Debian (y probablemente Ubuntu).

Alternativamente, Filezilla hará lo que quiera, si desea usar una GUI.

Jander
fuente
FYI: sftppermite put -rdesde OpenSSH 5.4
Tino
3
Gracias, he corregido mi respuesta. Ya es hora, ¿eh? ;-P
Enero
128

No sé por qué sftp hace esto, pero solo puede realizar una copia recursiva si el directorio de destino ya existe. Entonces haz esto ...

sftp> mkdir bin
sftp> put -r bin
Amigo útil
fuente
1
-rnecesita OpenSSH 5.4 o superior
Tino
22

Quizás te interese usar en su rsynclugar. El comando para eso sería

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

Esto copiará todo bin/y lo colocará en el servidor remoto /home/earlz/blah/bin/. Como beneficio adicional, primero verificará si el archivo en el lado remoto no ha cambiado, y si no lo ha hecho, no lo reenviará. Además, puede agregar una opción -z y la comprimirá por usted.

Shawn J. Goff
fuente
Impresionante! ¡Tan sencillo!
Asken
3
Tenga en cuenta que sftpes un comando y un protocolo . rsyncno es compatible con el sftpprotocolo.
Tino
9

lcd: su carpeta local (con subcarpetas)

cd: su carpeta remota

put -r .

eliseu
fuente
en realidad, creo que esta es la respuesta más correcta ... con el propósito de poner toda mi carpeta allí
nopole
sftp se quejó cuando ingresé en la carpeta principal local e intenté poner el directorio por su nombre. Pero cdentrar en el directorio que quería subir lo hizo. ¡Gracias!
karimkorun
8

¿Puedo sugerir una respuesta algo complicada, sin comprimir, pero que incluya alquitrán?

Aquí vamos:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

Esto empacará el directorio ./bin con tar (-cf: = crear archivo), nombre de archivo - (ninguno, stdout) y lo canalizará a través del comando ssh a target.org (que también podría ser una IP) donde el comando entre comillas se realiza, que es: cd a bla, y tar -xf (archivo de extracción) - ninguno, sin nombre, solo stdin.

Es como empacar un paquete en casa, llevarlo a la publicación, luego conducir al trabajo, donde espera el paquete y abrirlo.

Tal vez hay una solución mucho más elegante que solo usa sftp.

usuario desconocido
fuente
Una canalización tares una muy buena solución, sin embargo, esto necesita sshsoporte de inicio de sesión (además de sftpun protocolo diferente ssh). tar, a diferencia de otros, de forma predeterminada , se ejecuta de forma recursiva, transfiere todos los archivos especiales (FIFO, dispositivos de bloque / caracteres, etc.), intenta traducir el mapeo UID / GID desde el sistema de origen al sistema de destino y tiene una línea de comando corta tradicional. (Sin embargo, una excepción: "los sockets de dominio Unix" no se transfieren. ¿Pero quién los necesita?)
Tino
Uso este método cuando necesito compresión entre nodos, también puedes usar la pvherramienta para ver la velocidad en transferencias largas
Felipe Alcacibar
2

Puede usar yafc (aún otro cliente FTP / SFTP). La -ropción funciona muy bien allí.

Dmitry Shpakov
fuente
1

Puede usar rsync , que es una alternativa muy poderosa para scp y sftp, especialmente al actualizar las copias de la máquina A a la máquina B, ya que no copia los archivos que no han sido alterados; también es capaz de eliminar archivos de la máquina B que se han eliminado de la máquina A (solo cuando, por supuesto, se lo indica).

por ejemplo :

rsync -zrp /home/a/ [email protected]:/home/b/  

La opción -r es para copiar archivos de forma recursiva, -z habilita la compresión durante la transferencia y -p conserva los permisos del archivo (creación, edición, etc.) al copiar, que es algo que scp no hace AFAIK. Son posibles muchas más opciones; como de costumbre, lea las páginas del manual.
Respuesta original de Karolos

Sherlock
fuente
0

Inicie sesión en el servidor remoto con ssh, use sftp para conectarse nuevamente a su caja, luego use el get -rcomando para transferir directorios al servidor remoto. El comando get le permite transferir directorios de forma recursiva sin tener el directorio ya creado.

ssh remote ip
sftp local ip 
get -r whichever-dir
Cyb3rT00th
fuente
0

Caso SFTP:

Necesitaba copiar esa estructura en mi ftp:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

Eso resolvió mi problema:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
Nikita Malovichko
fuente
0

Acabo de enterarme de Arch Linux Wiki que es posible montar sftp-share usando sshfs. Estoy ejecutando un servidor sftp con chroot y jail y sshfs funciona muy bien.

  1. Montar: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Desmontar: fusermount -u <your/local/mount/directory>
saltani
fuente