Caricare directory con sftp?


97

Ho dei problemi nel caricare le directory (che contengono altre directory a pochi livelli di profondità) da sftp. Mi rendo conto che potrei aggirare questo problema tramite la compressione, ma non vedo perché sia ​​necessario.

Comunque, ci provo

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"

Penso che l'ultimo messaggio di errore sia completamente stupido. Quindi la directory non esiste? Perché non creare la directory?

Esiste comunque un problema con sftp o dovrei usare solo scp?

Risposte:


68

CORRETTO : Inizialmente ho affermato erroneamente che OpenSSH non supportava put -r. Lo fa, ma lo fa in un modo molto strano. Sembra che la directory di destinazione esista già, con lo stesso nome della directory di origine.

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

La cosa particolarmente strana è che ciò vale anche se si assegna un nome diverso alla destinazione:

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

Per un ricorsivo meglio implementato put, è possibile utilizzare psftpinvece lo strumento da riga di comando PuTTY . È nel putty-toolspacchetto sotto Debian (e molto probabilmente Ubuntu).

In alternativa, Filezilla farà quello che vuoi, se vuoi usare una GUI.


Cordiali saluti: sftpconsente put -rda OpenSSH 5.4
Tino

3
Grazie - ho corretto la mia risposta. È giunto il momento, eh? ;-P
Jander,

128

Non so perché sftp faccia questo, ma è possibile solo la copia ricorsiva se la directory di destinazione esiste già. Quindi fai questo ...

sftp> mkdir bin
sftp> put -r bin

1
-rha bisogno di OpenSSH 5.4 o successivo
Tino,

22

Potresti essere interessato a utilizzare rsyncinvece. Il comando per quello sarebbe

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

Questo copierà tutto bin/e lo inserirà sul server remoto /home/earlz/blah/bin/. Come ulteriore vantaggio, controllerà innanzitutto se il file sul lato remoto non è cambiato e, in caso contrario, non lo invierà nuovamente. Inoltre, puoi aggiungere un'opzione -z e la comprimerà per te.


Stupendo! Così semplice!
Asken,

3
Si noti che sftpè un comando e un protocollo . rsyncnon supporta il sftpprotocollo.
Tino,

9

lcd: la tua cartella locale (con le sottocartelle)

cd: la tua cartella remota

put -r .


in realtà, penso che questa sia la risposta più corretta ... allo scopo di mettere lì tutta la mia cartella
nopole

sftp si è lamentato quando ho inserito il cd nella cartella principale locale e ho provato a mettere la directory per nome. Ma cdnella directory che volevo caricare lo ha fatto. Grazie!
Karimkorun,

8

Posso suggerire una risposta un po 'complicata, senza zippare, ma includendo tar?

Eccoci qui:

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

Questo impacchetterà la directory ./bin con tar (-cf: = create file), nome file - (none, stdout) e lo instraderà attraverso il comando ssh a target.org (che potrebbe anche essere un IP) dove il comando tra virgolette viene eseguito, che è: cd in blah e tar -xf (estrarre il file) - nessuno, nessun nome, solo stdin.

È come se impacchi un pacchetto a casa, lo porti alla posta, poi guidi al lavoro, dove ti aspetti il ​​pacchetto e lo apri.

Forse esiste una soluzione molto più elegante che utilizza solo sftp.


Una piped tarè un'ottima soluzione, tuttavia richiede sshsupporto per il login ( sftpsopra c'è un protocollo diverso ssh). tar, a differenza di altri, per impostazione predefinita , viene eseguito in modo ricorsivo, trasferisce tutti i file speciali (FIFO, dispositivi a blocchi / caratteri, ecc.), tenta di tradurre la mappatura UID / GID dalla sorgente al sistema di destinazione e ha una tradizionale riga di comando breve. (Un'eccezione però: i "socket di dominio Unix" non vengono trasferiti. Ma chi ne ha bisogno?)
Tino,

Uso questo metodo quando ho bisogno di compressione tra i nodi, inoltre puoi usare lo pvstrumento per vedere la velocità nei trasferimenti lunghi
Felipe Alcacibar,


1

Puoi usare rsync , che è un'alternativa molto potente per scp e sftp, specialmente quando aggiorni le copie dalla macchina A alla macchina B, poiché non copia i file che non sono stati modificati; è anche in grado di rimuovere i file dalla macchina B che sono stati eliminati dalla macchina A (solo quando viene detto ovviamente).

per esempio :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

L'opzione -r è per la copia ricorsiva di file, -z abilita la compressione durante il trasferimento e -p conserva i permessi dei file (creazione del file, modifica, ecc.) Durante la copia, cosa che scp non fa con AFAIK. Sono possibili molte più opzioni; come al solito, leggi le pagine man.
Risposta originale di Karolos


0

Accedi al server remoto con ssh, usa sftp per riconnetterti al tuo box, quindi usa il get -rcomando per trasferire le directory sul server remoto. Il comando get consente di trasferire ricorsivamente le directory senza che la directory sia già stata creata.

ssh remote ip
sftp local ip 
get -r whichever-dir

0

Caso SFTP:

Ho dovuto copiare quella struttura sul mio ftp:

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

Ciò ha risolto il mio 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/

0

Ho appena imparato dal Wiki di Arch Linux che è possibile montare la condivisione sftp usando sshfs. Sto eseguendo un server sftp con chroot e jail e sshfs funziona molto bene.

  1. Montare: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Smonta: fusermount -u <your/local/mount/directory>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.