web-dev-qa-db-fra.com

Téléchargement de répertoires avec sftp?

J'ai du mal à télécharger des répertoires (qui contiennent d'autres répertoires à quelques niveaux) par sftp. Je me rends compte que je pourrais contourner ce problème en compressant, mais je ne vois pas pourquoi c'est nécessaire.

Bref, j'essaye

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"

Je pense que le dernier message d'erreur est complètement stupide. Le répertoire n'existe donc pas? Pourquoi ne pas créer le répertoire?

Y a-t-il de toute façon ce problème avec sftp, ou devrais-je simplement utiliser scp?

97
Earlz

CORRIGÉ : J'ai initialement prétendu à tort qu'OpenSSH ne supportait pas put -r. Il le fait, mais il le fait d'une manière très étrange. Il semble s'attendre à ce que le répertoire de destination existe déjà, avec le même nom que le répertoire source.

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

Ce qui est particulièrement étrange, c'est que cela s'applique même si vous donnez un nom différent à la destination:

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

Pour un put récursif mieux implémenté, vous pouvez utiliser l'outil de ligne de commande PuTTY psftp à la place. C'est dans le PuTTY-tools package sous Debian (et très probablement Ubuntu).

Alternativement, Filezilla fera ce que vous voulez, si vous souhaitez utiliser une interface graphique.

68
Jander

Je ne sais pas pourquoi sftp fait cela, mais vous ne pouvez copier récursivement que si le répertoire de destination existe déjà. Alors fais ça ...

sftp> mkdir bin
sftp> put -r bin
130
Useful Dude

Vous pourriez être intéressé par l'utilisation de rsync à la place. La commande pour cela serait

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

Cela copiera tout dans bin/ et placez-le sur le serveur distant dans /home/earlz/blah/bin/. Comme avantage supplémentaire, il vérifiera d'abord si le fichier du côté distant n'a pas changé et s'il ne l'a pas fait, il ne le renverra pas. De plus, vous pouvez ajouter une option -z et il la compressera pour vous.

22
Shawn J. Goff

lcd: votre dossier local (avec sous-dossiers)

cd: votre dossier distant

put -r .

9
eliseu

Puis-je suggérer une réponse quelque peu compliquée, sans zipper, mais avec du goudron?

Et c'est parti:

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

Cela emballera le répertoire ./bin avec tar (-cf: = create file), filename - (none, stdout) et le dirigera via la commande ssh vers target.org (qui pourrait aussi bien être une IP) où la commande entre guillemets est effectuée, qui est: cd en bla, et tar -xf (extraire le fichier) - aucun, pas de nom, juste stdin.

C'est comme si vous emballiez un paquet à la maison, l'apportiez à la poste, puis conduisiez au travail, où vous attendez le paquet et l'ouvrez.

Il existe peut-être une solution beaucoup plus élégante qui utilise simplement sftp.

8
user unknown

Vous pouvez utiliser yacc (Encore un autre client FTP/SFTP). L'option -r Y fonctionne très bien.

2
Dmitry Shpakov

Vous pouvez utiliser rsync , qui est une alternative très puissante pour scp et sftp, en particulier lors de la mise à jour des copies de la machine A vers la machine B, comme il ne le fait pas ' t copiez les fichiers qui n'ont pas été modifiés; il est également capable de supprimer des fichiers de la machine B qui ont été supprimés de la machine A (uniquement lorsque cela est dit, bien sûr).

par exemple :

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

L'option -r est destinée à la copie récursive de fichiers, -z active la compression pendant le transfert et -p préserve les autorisations de fichier (création de fichier, modification, etc.) lors de la copie, ce que scp ne fait pas AFAIK. Beaucoup plus d'options sont possibles; comme d'habitude, lisez les pages de manuel.
Réponse originale de Karolos

1
Sherlock

Connectez-vous au serveur distant avec ssh, utilisez sftp pour vous reconnecter à votre box, puis utilisez le get -r commande pour transférer des répertoires vers le serveur distant. La commande get vous permet de transférer des répertoires de manière récursive sans avoir déjà créé le répertoire.

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

Cas SFTP:

J'avais besoin de copier cette structure sur mon ftp:

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

Cela a résolu mon problème:

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
Nikita Malovichko

Je viens d'apprendre du Arch Linux Wiki qu'il est possible de monter le partage sftp en utilisant sshfs. J'utilise un sftp-server avec chroot et jail et sshfs fonctionne très bien.

  1. Mont: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Démonter: fusermount -u <your/local/mount/directory>
0
saltani