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?

Earlz
la source

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.

Jander
la source
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
Mec Utile
la source
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.

Shawn J. Goff
la source
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 .

Eliseu
la source
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.

Utilisateur inconnu
la source
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
2

Vous pouvez utiliser yafc (encore un autre client FTP / SFTP). L' -roption y fonctionne très bien.

Dmitry Shpakov
la source
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/ [email protected]:/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

Sherlock
la source
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
Cyb3rT00th
la source
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/
Nikita Malovichko
la source
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>
saltani
la source