53 votes

Comment créer un répertoire sur un hôte distant s'il n'existe pas sans se connecter par ssh ?

Je ne sais pas si c'est possible ou non. En gros, j'écris un script qui me permet de scp un fichier sur mon hébergement. Voilà ce qu'il en est pour l'instant. L'argument 1 est le fichier et l'argument 2 est le dossier dans lequel je veux qu'il soit placé sur le serveur distant :

function upload {
    scp $1 myusername@ssh.myhost.net:$2
}

Comme vous le savez peut-être ou peut-être pas, si le répertoire que je spécifie lorsque j'appelle la fonction n'existe pas, le transfert échoue. Existe-t-il un moyen de vérifier si le répertoire existe dans la fonction et s'il n'existe pas, de le créer.

Je préférerais ne pas avoir à me connecter à chaque fois et à créer le répertoire, mais si je n'ai pas le choix, alors je n'ai pas le choix.

35voto

Peter Mortensen Points 7440

Vous pouvez utiliser rsync .

Par exemple,

rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO

Note sur rsync :

rsync est un logiciel utilitaire et un protocole réseau pour Unix qui synchronise les fichiers et les répertoires d'un emplacement à un autre. Il minimise la taille des transferts de données en utilisant l'encodage delta lorsque cela est approprié, en utilisant la fonction rsync qui est plus rapide que les autres outils.

4 votes

Cela ne fonctionne pas pour moi (il se plaint simplement que le répertoire de destination n'existe pas) - cela nécessite-t-il une version inhabituellement récente de rsync ? Cependant, rsync -R peut être utilisé pour obtenir l'effet désiré si le fichier local se trouve dans un répertoire portant un nom approprié, par ex : rsync -Rave ssh some/nonExisting/dirToCopyTo/fileToCopy ssh.myhost.net:/

2 votes

Comme @MartinKleppmann, je n'obtiens qu'une erreur se plaignant de l'inexistence du répertoire en utilisant cette méthode. Avez-vous déjà constaté que cela fonctionne ? Si oui, je serais intéressé de comprendre ce qui est différent dans nos programmes rsync.

2 votes

Ah, il semble que cela fonctionne si cela ne doit créer qu'un seul niveau de répertoire dans lequel copier. J'ai essayé de déployer dans /var/www/myapp/test/. Lorsque le serveur n'avait que /var/www/, cela a échoué. Lorsque j'ai créé /var/www/myapp/, le dossier de test a été créé et tout a été copié dedans. Donc si vous avez besoin de créer plus d'un niveau de structure de répertoire, vous aurez besoin d'une solution comme @ire_and_curses ci-dessous.

25voto

ire_and_curses Points 32802

Je suppose que vous voulez dire que vous ne voulez pas vous connecter interactivement et créer des répertoires à la main, plutôt que d'éviter l'utilisation de ssh puisque vous avez toujours besoin d'un mot de passe ou d'une clé publique avec l'adresse de l'entreprise. scp .

Si l'utilisation de ssh de manière non interactive est acceptable, alors vous pouvez streamer votre fichier en utilisant cat sur ssh :

cat $1 | ssh $2 "mkdir $3;cat >> $3/$1"

$1 = filename 
$2 = user@server
$3 = dir_on_server

Si le répertoire existe déjà, mkdir se plaint mais le fichier est quand même copié. Le répertoire existant ne sera pas écrasé. Si le répertoire n'existe pas, mkdir le créera.

15 votes

mkdir -p $3 évite que mkdir se plaigne d'un répertoire déjà existant. De plus, il vous permet de créer des répertoires à niveaux multiples.

19voto

Matthias Wandel Points 3022

Si vous effectuez un scp récursif (-r), il copiera également les répertoires. Ainsi, si vous créez localement un répertoire du nom que vous souhaitez sur l'hôte distant, que vous y copiez le fichier, puis que vous effectuez une copie récursive, le répertoire sera créé, avec le fichier à l'intérieur.

C'est un peu gênant, mais ça ferait l'affaire.

0 votes

Que faire si le répertoire distant existe déjà (et n'est pas vide) ?

0 votes

Le nouveau contenu sera ajouté au répertoire existant.

13voto

Sarang Points 169

Il s'agit d'un processus en deux étapes

ssh myusername@ssh.myhost.net "mkdir -p $2"

Cela garantit que la structure du répertoire est créée. Ensuite, vous copiez

scp $1 myusername@ssh.myhost.net:$2

6voto

Rico Chen Points 61

Que diriez-vous, par exemple,
ssh remote_user@remote.host '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt remote_user@remote.host:/tmp/nonexist/dir

0 votes

Je vois définitivement SSH ainsi que scp qui, selon Wikipedia ...is based on the Secure Shell (SSH) protocol. Ce n'est pas ce que le PO demandait.

0 votes

Il n'y a rien de mal à utiliser ssh ou scp et il n'y a pas besoin de les éviter. C'est à l'utilisateur script de se souvenir de ce qui a été créé sur l'hôte distant afin que les vérifications ne soient pas faites encore et encore. J'ai effectivement écrit une sauvegarde de journal script récemment en utilisant cette méthode. J'aimerais savoir s'il existe d'autres options pour vérifier et créer de nouveaux dossiers sur l'hôte distant s'il ne fournit pas de moyens tels que CIFS, NFS, FTP ou rsync (celui-ci fonctionne en fait sur ssh) pour l'accès aux fichiers distants.

0 votes

Désolé si je me suis mal exprimé Rico, je faisais référence au fait que le PO ne voulait pas utiliser SSH, mais j'aurais dû lire la question plus attentivement ; scp est très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X