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?
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.
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
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.
lcd
: votre dossier local (avec sous-dossiers)
cd
: votre dossier distant
put -r .
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.
Vous pouvez utiliser yacc (Encore un autre client FTP/SFTP). L'option -r
Y fonctionne très bien.
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
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
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/
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.
sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
fusermount -u <your/local/mount/directory>