Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/10/2012, à 11:56

BrunoL

[RESOLU] if [ -d pour un répertoire du serveur ?

Bonjour,

Je cherche l'équivalent de l'instruction sh :

if [ -d repertoire_local]; then

Pour un répertoire du serveur, soit :

if [ -d moi@adress_serveur:/repertoire_serveur]; then

Cette dernière produisant une erreur.

Merci.

Dernière modification par BrunoL (Le 21/10/2012, à 21:38)

Hors ligne

#2 Le 20/10/2012, à 17:46

BrunoL

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

Bon, ma solution ponctuelle :

REQ_SERV_REP_DEST="if [ -d $REPERTOIRE_DESTINATION ]; then echo 10;fi"
SSH_REPSERVEUR="ssh -l "$SERV_USER" "$SERV_HOST" ""$REQ_SERV_REP_DEST"""
echo "C: "`$SSH_REPSERVEUR`

Ça fonctionne, je récupère 10 si le répertoire est présent, mais y a sûrement plus léger, je suis preneur. Les " et autres ' m'ont pris la tête ;-(

Merci.

Dernière modification par BrunoL (Le 20/10/2012, à 17:49)

Hors ligne

#3 Le 20/10/2012, à 19:32

Bousky

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

BrunoL a écrit :
if [ -d moi@adress_serveur:/repertoire_serveur]; then

Cette dernière produisant une erreur.

Tu ne pourras pas exécuter une commande sur une autre machine sans passer par ssh.


Les " et autres ' m'ont pris la tête ;-(

J'ai pas envie de chercher à comprendre comment tu en es arrivé à un tel résultat… Chez moi ça ne marche pas :

ssh: illegal option -- d

Plus simple :

if ssh user@host test -d "'dossier'" ; then ...

Le seul problème de cette méthode est qu'elle ne fait pas la distinction entre un dossier qui n'existe pas et un problème de connexion. Pour ça il faut faire :

ssh user@host test -d "'dossier'"
case $? in
0)
        # le dossier existe
;;
1)
        # le dossier n'existe pas
;;
*)
        # erreur de connexion ou autre
esac

Si tu utilises des variables avec ma solution, mets juste des guillemets doubles autour (rien à changer pour le dossier puisqu'ils y sont déjà, mais il faut que les guillemets doubles soient à l'extérieur et les simples à l'intérieur) :

ssh "$user"@"$host" test -d "'$dossier'"

Note : « test … » et « [ … ] », c'est pareil.

Dernière modification par Bousky (Le 20/10/2012, à 19:48)


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#4 Le 20/10/2012, à 20:28

BrunoL

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

Le principe :

ssh -l ${NOM_UTILISATEUR} ${NOM_HOTE} " ls -l "

Pour envoyer une commende à exécuter sur le serveur. J'ai galéré car intégré dans un script avec des paramètres le mélange de ", ' et ` est plutôt dur à coordonner.

Petite remarque concernant le fait que cela ne fonctionne pas chez toi, l'instruction if [ -d ... ]; est très susceptible quant aux espaces. En oublier un et tu as des anomalies de toutes sorte et sans grand rapport avec l'espace omis ...

A+

Dernière modification par BrunoL (Le 20/10/2012, à 20:32)

Hors ligne

#5 Le 20/10/2012, à 21:53

Bousky

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

BrunoL a écrit :

le mélange de ", ' et ` est plutôt dur à coordonner.

J'ai l'impression que tu veux trop en mettre :

  • Les « "" » finaux de la ligne « SSH_REPSERVEUR=… » ne servent à rien) ;

  • Les « " » autour de « $SERV_USER » ne font que le mettre hors des guillemets ;

Regarde comment j'ai protégé le dossier dans ma version.
Si tu utilises bash, utilise « $(…) » à la place de « `…` ».

Ce que je ne comprends pas, c'est pourquoi tu utilises autant de variables (qu'il faut protéger à chaque fois : $REPERTOIRE_DESTINATION, $SERV_USER et $SERV_HOST ne sont pas protégées par exemple) alors qu'il est possible de le faire en une ligne avec un minimum de guillemets (et en plus le fonctionnement est plus proche de l'original).


BrunoL a écrit :

Petite remarque concernant le fait que cela ne fonctionne pas chez toi,…

En fait j'avais oublié de définir « $SERV_USER » et « $SERV_HOST » hmm


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#6 Le 21/10/2012, à 03:16

nesthib

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

mkdir /tmp/serveur
sshfs moi@adress_serveur:/ /tmp/serveur
if [ -d /tmp/serveur/repertoire_local]; then

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#7 Le 21/10/2012, à 11:01

BrunoL

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

Bousky, les " et autres caractères m'ont été nécessaires afin que l'exécution en `...` interprète bien les paramètres et ne prenne pas seulement leur titre. J'ai beau faire, en supprimer, entraîne des anomalies pas toujours bloquantes mais gênantes (type : -l : commande introuvable).
Tout instancier en une seule ligne ne fonctionne pas. Ce que j'ai essayé en premier ... et qui a entraîné ma demande.
D’après ma compréhension entre `...` les paramètres ne sont pas instanciés d'où le problème. Mais je ne doute pas qu'il y ait une solution plus propre qui ne devrait pas tarder vu les expertise présentent  smile

Nesthlb, solution fonctionnellement équivalente et très élégante mais que je souhaite éviter.  Merci.

Dernière modification par BrunoL (Le 21/10/2012, à 11:01)

Hors ligne

#8 Le 21/10/2012, à 11:52

Bousky

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

BrunoL a écrit :

D’après ma compréhension entre `...` les paramètres ne sont pas instanciés d'où le problème.

Ça veut dire quoi pour toi « instancier » ? De manière générale, vouloir construire des commandes et les stocker dans une variable avant de les exécuter est à éviter, c'est toujours source d'ennuis.


en une seule ligne ne fonctionne pas.

Tu as testé ma méthode au moins ?


Mais je ne doute pas qu'il y ait une solution plus propre qui ne devrait pas tarder vu les expertise présentent  smile

En quoi la ligne suivante n'est pas propre ? Elle est concise, claire, et fonctionne dans tous les cas (je l'ai même testé avec un saut de ligne dans le nom du dossier)…

if ssh "$user@$host" test -d "'$dossier'" ; then …

nesthib et moi t'avons donné deux bonnes solutions (tout dépend de ce que tu veux faire d'autre avec le dossier en question). Si tu as un problème précis avec l'une des deux, donne nous plus de détails : « ça ne fonctionne pas » ne nous donne pas assez d'informations sur ce que tu as testé exactement et sur l'erreur produite.
Après si tu refuse de tester les solutions que l'on te propose, on ne peux pas t'aider…


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#9 Le 21/10/2012, à 21:37

BrunoL

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

Bousky, ta solution est parfaite. Je comprends pas l'erreur de connexion mais pour le reste cela fonctionne exactement comme je le souhaitais.

J'ai été un peu long à mettre en œuvre parce que mon script est alambiqué.

Merci à vous deux.

Hors ligne

#10 Le 21/10/2012, à 22:23

Bousky

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

BrunoL a écrit :

Je comprends pas l'erreur de connexion

Les programmes renvoient des codes d'erreurs (si tout se passe bien, c'est zéro). « test » ou « [ … ] » utilisent ce principe pour renvoyer le résultat du test : = 0 → vrai, ≠ 0 → faux ; et c'est ce code qui détermine le comportement de « if … ; then ». Ssh renvoie le code d'erreur de la commande exécutée sur le serveur s'il a pu l'exécuter et un code d'erreur qu'il génère lui-même s'il n'a pas pu exécuter la commande. Il y a donc trois possibilités :

  1. ssh a pu exécuter le test sur le serveur et celui-ci est vrai :
            code d'erreur = 0 ;

  2. ssh a pu exécuter le test sur le serveur et celui-ci est faux :
            code d'erreur = 1 ;

  3. ssh n'a pas pu exécuter le test (erreur de connexion, d'identification, …) :
            code d'erreur > 1.

Si on fait simplement un « if ssh … », on teste juste si le code d'erreur de ssh est non nul, et donc on ne peux pas faire la différence entre le cas 2 et le 3. Pour faire cette différence, il faut utiliser un « case » sur le code d'erreur contenu dans « $? ».


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#11 Le 22/10/2012, à 20:22

BrunoL

Re : [RESOLU] if [ -d pour un répertoire du serveur ?

Et en plus des explications simples et pédagogiques.

Mes ", ' ont quasiment disparu et plus de ` smile c'est plus lisible

Encore merci Bousky.

Hors ligne