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


97

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

En tout cas, 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. Donc le répertoire n'existe pas? Pourquoi ne pas créer le répertoire?

Existe-t-il de toute façon un problème avec sftp ou devrais-je simplement utiliser scp?

Réponses:


68

CORRIGÉ : Au départ, j'ai prétendu à tort qu'OpenSSH ne supportait pas put -r. Oui, mais 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 une meilleure mise en œuvre récursive put, vous pouvez utiliser l' psftpoutil de ligne de commande PuTTY à la place. C'est dans le putty-toolspaquet sous Debian (et très probablement Ubuntu).

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


FYI: sftppermet put -rde OpenSSH 5.4
Tino

3
Merci - j'ai corrigé ma réponse. Il est temps, hein? ;-P
Jander

128

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

sftp> mkdir bin
sftp> put -r bin

1
-rnécessite OpenSSH 5.4 ou supérieur
Tino,

22

Vous pourriez être intéressé à utiliser à la rsyncplace. La commande pour cela serait

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

Cela va tout copier bin/et le placer sur le serveur distant /home/earlz/blah/bin/. De plus, il vérifiera d'abord si le fichier situé sur le côté distant n'a pas changé et s'il ne le fait pas, il ne le renverra pas. De plus, vous pouvez ajouter une option -z et il sera compressé pour vous.


Impressionnant! Si simple!
Asken

3
Veuillez noter qu'il sftps'agit d'une commande et d'un protocole . rsyncne supporte pas le sftpprotocole.
Tino

9

lcd: votre dossier local (avec des sous-dossiers)

cd: votre dossier distant

put -r .


en fait, je pense que c'est la réponse la plus correcte ... dans le but de mettre tout mon dossier là
nopole

sftp s'est plaint quand j'ai gravé dans le dossier parent local et que j'ai essayé de mettre le répertoire par son nom. Mais cdentrer dans le répertoire que je voulais télécharger l'a fait. Je vous remercie!
Karimkorun

8

Puis-je suggérer une réponse un peu compliquée, sans compresser, mais en incluant du goudron?

Et c'est parti:

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

Cela compresse le répertoire ./bin avec tar (-cf: = crée le fichier), filename - (none, stdout) et le redirige vers la commande ssh vers target.org (qui peut aussi bien être une adresse IP) où la commande entre guillemets est effectuée, c’est-à-dire: cd to blah, et tar -xf (fichier d’extrait) - aucun, aucun nom, juste stdin.

C'est comme si vous emballiez un colis à la maison, apportez-le à la poste, puis rendez-vous au travail, où vous attendez le colis et ouvrez-le.

Peut-être existe-t-il une solution beaucoup plus élégante qui utilise simplement sftp.


Un piped tarest une très bonne solution, mais cela nécessite un sshsupport de connexion ( sftpun protocole différent se trouve au-dessus de ssh). tar, contrairement à d'autres, fonctionne par défaut de manière récursive par défaut , transfère tous les fichiers spéciaux (FIFO, périphériques bloc / caractère, etc.), tente de traduire le mappage UID / GID du système source vers le système cible et dispose d'une ligne de commande courte traditionnelle. (Une exception toutefois: les "sockets de domaine Unix" ne sont pas transférés. Mais qui en a besoin?)
Tino,

J'utilise cette méthode lorsque j'ai besoin d'une compression entre les nœuds. Vous pouvez également utiliser l' pvoutil pour surveiller la vitesse des transferts longs.
Felipe Alcacibar


1

Vous pouvez utiliser rsync , 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, car elle ne copie pas 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 indiqué à bien sûr).

par exemple :

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

L'option -r sert à la copie récursive de fichiers, -z active la compression pendant le transfert et -p conserve les droits d'accès (création, modification, etc.) lors de la copie, ce que scp n'effectue pas autant que je sache. Beaucoup plus d'options sont possibles. comme d'habitude, lisez les pages de manuel.
Réponse originale de Karolos


0

Connectez-vous au serveur distant avec ssh, utilisez sftp pour vous reconnecter à votre boîte, puis utilisez la get -rcommande pour transférer des répertoires sur le serveur distant. La commande get vous permet de transférer des répertoires de manière récursive sans que le répertoire ne soit déjà créé.

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

0

Cas SFTP:

Je devais 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

Le Wiki Arch Linux vient d’apprendre qu’il est possible de monter le partage sftp à l’aide de sshfs. J'exécute un serveur sftp avec chroot et jail et sshfs fonctionne très bien.

  1. Monter: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Démonter: fusermount -u <your/local/mount/directory>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.