Utiliser sftp pour transférer un répertoire?

50

Lorsque j'essaie d'utiliser sftp pour transférer un répertoire contenant des fichiers, je reçois un message d'erreur:

skipping non-regular file directory_name

Le répertoire contient quelques fichiers et deux sous-répertoires.

Qu'est-ce que je fais mal?

Haziz
la source

Réponses:

49

sftp, like cpet scp, exige que lorsque vous copiez un dossier (et son contenu, évidemment), vous devez lui indiquer explicitement que vous souhaitez transférer le dossier de manière récursive avec l' -roption.

Alors, ajoutez -rà la commande.

Kevin
la source
2
-r après la commande put? Je reçois un message d'erreur «put: indicateur non valide -r» si je le fais. L'ajouter à la commande sftp d'origine ne fonctionne pas non plus.
Haziz
5
Ajoutez -rà la sftpcommande lorsque vous vous connectez. sftp -r user@host
Kevin
1
@ Kevin Je reçois l'erreur suivante "sftp: option inconnue --r"
Amatya
2
Attention qu'il ya un bug debout assez longtemps dans le SFTP OpenSSH: lors de la copie récursive un répertoire à un serveur distant, le répertoire lui - même doit déjà exister sur le serveur cible sinon le transfert échouera avec un message d'erreur non explicite: Couldn't canonicalise: No such file or directory.
WhiteWinterWolf
5
devrait être quelque chose comme:# sftp user@remote-host #> get -r remote-folder
hbinduni
21

Je ne peux que suggérer, vous utilisez rsync. Il s'agit en quelque sorte d'un standard de l'industrie lorsque vous déplacez des fichiers via des connexions sécurisées.

rsync -alPvz ./source_dir server.com:destination_dir

C'est ce que j'utilise depuis des années.

(l' -aoption prend en charge des choses comme la récursion de répertoire)

polemon
la source
3
Quelques précisions sur les paramètres mentionnés: -a= récursivité + conserver les liens symboliques, les autorisations, les temps de modification, le propriétaire, le groupe, les fichiers spéciaux et les fichiers de périphérique (ce dernier nécessite des privilèges de super-utilisateur); -l= conserver les liens symboliques (déjà inclus dans -a); -P= affiche la progression pendant le transfert + conserve les fichiers partiellement transférés; -v= mode verbeux (toutefois, cela semble obligatoire -Ppour éviter une erreur étrange (bug?) protocol version mismatch); -z= activer la compression des données transférées.
WhiteWinterWolf
@WhiteWinterWolf semble être dépendant de la version si le -lcommutateur doit être utilisé ou non. Je me souviens d' anciennes versions ne sont pas -len -a.
polemon
5

Vous pouvez également être en mesure d'utiliser scp. Le format général est

scp -rp sourceDirName username@server:destDirName

scpsignifie "copie sécurisée". Les drapeaux sont

  • -r recurse dans des sous-répertoires
  • -p préserver les temps de modification

Je crois que le reste des articles est explicite

Bina Ramamurthy
la source
et scp -rp -P <port> .... lors de l'utilisation d'un port non standard
Pancho
4

Cela fonctionne pour moi:

1) se connecter via sftpà l'hôte distant

2) accédez au répertoire distant que vous souhaitez copier. (Exemple: cd Music)

3) accédez au répertoire local dans lequel vous souhaitez copier des éléments. (Exemple: bureau lcd)

4) Émettez cette commande: get -r *

Don Karon
la source
4

Si ce rsyncn'est pas une option, je recommanderais ensuite lftp:

lftp sftp://[email protected]/path/path/

Ensuite, utilisez la mirrorcommande pour télécharger de manière récursive, comme ceci:

mirror -R

(Notez que la récursivité est la valeur par défaut. Il -Rs'agit de reverse - pour que la commande miroir soit chargée à la place du téléchargement. Essayez d'ajouter --dry-runpour effectuer un essai afin de vous assurer qu'il répond à vos attentes.)

Ou pour télécharger sans récursion:

mirror --no-recursion

Vous devez cdentrer dans les répertoires que vous voulez mettre en miroir. Fonctionne très bien!

Banago
la source
2

Si vous le pouvez, utilisez sshfs . C'est un système de fichiers FUSE , disponible sur la plupart des ordinateurs modernes, et fonctionne avec n'importe quel serveur SFTP. Il s’agit d’un système de fichiers distant: il vous permet de manipuler des fichiers distants (via le protocole SFTP) avec les utilitaires habituels.

mkdir /mount/point
sshfs server.example.com:/remote/path /mount/point
ls /mount/point
cp -Rp /mount/point/somedir /local/location
fusemount -d /mount/point
Gilles, arrête de faire le mal
la source
0

C'est un peu un kludge mais ce qui fonctionne pour moi est de:

  1. Utilisez sshpour vous connecter à la machine distante
  2. Utiliser sftpde la machine distante à votre machine locale
  3. Ensuite, utilisez la getcommande avec l' -roption pour déplacer le répertoire et tous ses fichiers.
Matthew Greene
la source
1
ne travaille pas avec -rsftp> get -r data /opt/bin get: Invalid flag -r
Skynet
0

Si vous vous demandez en fait «comment utiliser sftp pour transférer un répertoire»,

 sftp -r user@server

Mais si vous transférez un répertoire, je pourrais suggérer deux meilleures options, en fonction de vos besoins. sftpnécessite de se connecter au serveur distant à l’aide d’une invite de commande de type ssh, mais si vous ne voulez que le fichier, il existe des moyens plus simples et plus rapides.

Scp

Pour un transfert ponctuel, pour télécharger, essayez:

 # upload source directory to remote server
 scp -rp source_dir user@server:dest

 #download directory from remote server:
 scp -rp user@server:source_dir dest

 #specifying ssh key:
 scp -rp -i ~/.ssh/key user@server:source_dir dest

 #remote directory has spaces
 scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest

Rsync

Si vous envisagez de synchroniser les répertoires régulièrement, il est plus logique d'utiliser rsync. Il effectue des deltas entre les deux répertoires, permettant ainsi d’économiser du temps de transfert et des données sur le réseau.

rsync -r -a -v -e ssh --delete source_dir user@server:dest

Voici une liste de quelques - unes des options les plus rsync commune: ( prise d'ici )

  • --delete - supprime les fichiers qui n'existent pas sur l'expéditeur (système)
  • -v - verbose (-vv fournira des informations plus détaillées)
  • -e "options ssh" - spécifie le ssh en tant que shell distant
  • -a - mode archive - conserve les autorisations (propriétaires, groupes), les heures, les liens symboliques et les périphériques
  • -r - recurse dans des répertoires
  • -z - compresse les données du fichier pendant le transfert
  • --exclude 'nomdossier' - exclut le dossier correspondant du transfert
  • -P - affiche les progrès pendant le transfert

J'espère que ça t'as aidé!

Dan Williams
la source
0

vous pouvez obtenir du serveur à votre chemin local par

scp -rp user@server:directoryname(full path) .
utilisateur368621
la source
Cela ajoute-t-il de nouvelles informations à quelles autres réponses déjà postées?
41754
Cela semble être la plupart du temps identique à l’ utilisation de sftp pour transférer un répertoire?
Kusalananda