it-swarm.it

Caricare directory con sftp?

Sto riscontrando dei problemi nel caricare directory (che contengono altre directory a pochi livelli di profondità) da sftp. Mi rendo conto che potrei aggirare questo problema con il gzip, 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?

97
Earlz

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ò si applica 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 uno put ricorsivo meglio implementato, è possibile utilizzare invece lo strumento da riga di comando PuTTY psftp. È nel PuTTY-tools pacchetto sotto Debian (e molto probabilmente Ubuntu).

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

68
Jander

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
130
Useful Dude

Potresti essere interessato a utilizzare rsync invece. Il comando per quello sarebbe

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

Questo copierà tutto in bin/ e posizionalo sul server remoto in /home/earlz/blah/bin/. Come ulteriore vantaggio, per prima cosa verificherà 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.

22
Shawn J. Goff

lcd: la tua cartella locale (con le sottocartelle)

cd: la tua cartella remota

put -r .

9
eliseu

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.

8
user unknown

Puoi usare yafc (Ancora un client FTP/SFTP anoter). Il -r L'opzione funziona molto bene.

2
Dmitry Shpakov

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 t copia i file che non sono stati modificati; è anche in grado di rimuovere i file dalla macchina B che sono stati cancellati dalla macchina A (solo quando viene detto ovviamente).

per esempio :

rsync -zrp /home/a/ [email protected]:/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

1
Sherlock

Accedi al server remoto con ssh, usa sftp per riconnetterti al tuo box, quindi usa get -r comando per trasferire 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
Cyb3rT00th

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 da Arch Linux Wiki che è possibile montare la condivisione sftp usando sshfs. Sto eseguendo un sftp-server con chroot e jail e sshfs funziona molto bene.

  1. Mount: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Smonta: fusermount -u <your/local/mount/directory>
0
saltani