Je veux utiliser scp
pour télécharger des fichiers, mais parfois le répertoire cible peut ne pas exister.
Est-il possible de créer le dossier automatiquement? Si c'est le cas, comment? Si non, quel autre moyen puis-je essayer?
C'est l'une des nombreuses choses que l' rsync
on peut faire.
Si vous utilisez une version de rsync
libérée au cours des dernières années, ¹ sa syntaxe de commande de base est similaire à scp
: ²
$ rsync -r local-dir remote-machine:path
Cela va copier local-source
et son contenu $HOME/path/local-dir
sur la machine distante, en créant les répertoires nécessaires .³
rsync
Il existe certaines restrictions ici qui peuvent affecter si cela fonctionnera dans votre situation particulière. Cela ne créera pas plusieurs niveaux de répertoires distants manquants, par exemple; il ne créera qu'un niveau manquant sur la télécommande. Vous pouvez facilement contourner cela en faisant précéder la rsync
commande avec quelque chose comme ceci:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Cela créera l' $HOME/foo/bar/qux
arbre s'il n'existe pas. Il ne se plaindra pas ou faire quoi que ce soit d' autre mauvais si elle n'existe déjà.
rsync
a parfois d'autres comportements surprenants. Fondamentalement, vous lui demandez de comprendre ce que vous vouliez copier, et ses suppositions peuvent ne pas correspondre à vos hypothèses. Essayez et voyez. S'il ne se comporte pas comme prévu et que vous ne voyez pas pourquoi, publiez plus de détails sur les configurations de votre répertoire local et distant et donnez la commande que vous avez essayée.
Notes de bas de page :
Avant la version rsync
2.6.0 (1 er janvier 2004), il avait besoin de l’ -e ssh
indicateur pour qu’il se comporte comme scp
il se présentait par défaut avec le protocole RSH obsolète .
scp
et rsync
partager des drapeaux, mais il y a peu de chevauchement.
En utilisant SSH
comme protocole de transfert, rsync
utilise les mêmes valeurs par défaut. Ainsi, tout comme scp
, cela supposera qu’un utilisateur porte par défaut le même nom que votre utilisateur local sur la machine distante.
rsync
la page de documentation consultée , n'a pas trouvé comment utiliser ssh-key pour se connecter. Je ne souhaite pas utiliser identifiant / mot de passe pourrsync
. Et oui, vous avez également besoinrsync
du côté distant, tout comme avecscp
. En ce qui concerne les clés SSH,rsync
utilise SSH en dessous avec la valeur par défaut-e ssh
. Par conséquent, si vous avez configuré des clés à utiliser avecscp
, elles fonctionnerontrsync
également.-r
ne fait aucune différence. Le scénario que vous décrivez ne fonctionne que si vous copiez un répertoire et si le répertoire parent cible existe. Donc,rsync foo/ u@h:~/
créera le répertoire ciblefoo
maisrsync foo/ u@h:~/bar/
ne créera pas le répertoire ciblebar
. Celui-ci ne créerabar/foo
que s'ilbar/
existe. Dans tous les cas, l'OP télécharge des fichiers et même dans les cas où cela fonctionne, cela ne fonctionne que pour des répertoires entiers.rsync file host:/foo/file
échoue sifoo/
n'existe pas maisrsync file host:/foo/
crée le répertoire et y placefile
. Étrange. Quoi qu'il en soit, vous avez tout à fait raison et le scénario de base fonctionne, je vais retirer mon vote négatif.Si vous copiez un groupe de fichiers, pas vraiment. Si vous copiez un répertoire et tout son contenu, oui. Étant donné cette commande:
Si
directory
n'existe pas~/the/target
surhost
, il sera créé. Si, toutefois,~the/target
n'existe pas, vous aurez probablement des problèmes - je ne me souviens pas des résultats exacts de ce cas, mais soyez prêt àscp
faire échouer le projet.la source
scp: /home/madmike/test_bin: No such file or directory
Dès que le répertoire cible est manquant, cela se produit sur mon installation. Utilisation de cygwin sur le client et de RHEL 6.9 sur le serveur. Quelle est votre configuration?Autant que je sache,
scp
elle - même ne peut pas faire cela, non. Cependant, vous pouvez simplementssh
créer un répertoire sur la machine cible, puis le copier. Quelque chose comme:Notez que si vous copiez des répertoires entiers, ce qui précède n’est pas nécessaire. Par exemple, pour copier le répertoire
~/foo
sur l'hôte distant, vous pouvez utiliser l'-r
indicateur (récursif):Cela créera le répertoire cible
~/foo
sur l'hôte distant. Cependant, il ne peut pas créer le répertoire parent.scp ~/foo user@host:~/bar/foo
échouera sauf si le répertoire ciblebar
existe. Dans tous les cas, l'-r
indicateur ne vous aidera pas à créer un répertoire cible si vous copiez des fichiers individuels.la source
Oui, vous pouvez. Selon la page de manuel de scp:
la source
scp -r foo/ u@h:~/bar
créerabar/foo
si la télécommandebar/
existe mais échouera si elle n’existe pas.foo
contenu dans le nouveau répertoire/bar
. Bien sûr, le nom a été changé, ce qui peut ne pas être ce que souhaite le PO. Si ce que vous voulez, c'est une nouvelle structure d'arborescence créée dans la machine de destination,scp
le travail ne sera pas effectué. Si ce que vous voulez, c'est de répliquer une structure d'arborescence à partir d'une certaine branche de l'arborescence, cette structure est créée.scp -r file host:~/bar/
ne créera pasbar/
.J'utilise la fonction suivante avant de transférer des
btrfs
instantanés surssh
:Appelez simplement la fonction dans votre script avec:
check_remote_dir /my/remote/path
la source
Vous pouvez chaîner la commande avec la commande mkdir puis faire référence au dossier que vous avez créé:
la source
Lorsque restreint à scp ou sftp sans ssh disponible (par rssh), il est possible de créer des répertoires en copiant une arborescence de répertoires vide avec rsync, puis en copiant des fichiers.
Voici comment j'ai mis la clé publique ssh sur l'hôte distant lorsque ssh-copy-id ne fonctionne pas et que le répertoire .ssh n'existe pas:
Il est possible de combiner ces commandes dans un seul rsync en ajoutant un filtre d'inclusion supplémentaire au milieu, si le nom du fichier cible est identique.
la source