l'asile.fr


SSH 1 - PWD 0

Bonjour à tous les fous et déjà merci de me lire.

Alors , dans une architecture client/serveur , je cherche à écrire un script qui doit (entre autres) permettre de restaurer par l'utilisation des snapshots (LVM) le répertoire ou se trouve l'utilisateur quand il lance le script.

Exemple :
Sur le serveur même, je me rend dans /home/user/images et lance le script en local ,
j'obtiens une proposition de restauration pour le dossier /home/user/images.
Parfait.

cd /home/user/images
/usr/local/bin/restauration

Voulez -vous restaurez le dossier /home/user/images de 15H ?

Sur ma machine , je lance le script via SSH depuis /home/user/images (montage).
J'obtiens une proposition de restauration pour le dossier /home/user.
Raté !
SSH remonte directement à la racine dans mon homedir et y execute ma commande pwd , d'ou le plantage.


cd /home/user/images
ssh nom_du_serveur  /usr/local/bin/restauration

Voulez -vous restaurez le dossier /home/user/ de 15H ?

Toute aide sera la bienvenue.
Ci-dessous , ce merveilleux code à l'indentation toute particuière.

#!/bin/bash

rep=$(pwd)
echo "$rep"
represtau=`echo $rep | sed -e "s/\/home//"`
heure=$(date '+%H')
echo ""
echo -n "Souhaitez vous restaurer le dossier $rep de $heure H (y/n)"
echo ""
read reponse
echo ""
if [ "$reponse" = "y" ]; then           
              echo "RESTAURATION REPERTOIRE EN COURS"
              echo "Création du point de montage"
	      sudo -s /bin/mkdir /mnt/snaps/home.$heure\h00
	      echo "Montage du snapshot"
	      /bin/mount /dev/VG0/home.$heure\h00 /mnt/snaps/home.$heure\h00
	      echo "Copie depuis $rep vers homedir"
	      cp -a /mnt/snaps/home.$heure\h00$represtau /$rep.snap 
              echo "Démontage du snapshot"
              /bin/umount /dev/VG0/home.$heure\h00 /mnt/snaps/home.$heurerestau\h00
	      echo "Suppression du point de montage"
	      rm -rf /mnt/snaps/home.$heurerestau\h00
              echo "RESTAURATION TERMINEE"
 elif [ "$reponse" = "n" ]; then
              echo -n "Souhaitez vous restaurer un document ou un dossier (document/dossier)"
	      echo ""
	      read reponse2
	      echo ""
	      if  [ "$reponse2" = "document" ]; then 
	      echo "Veuillez entrer le chemin vers le document-cible"
	      echo "Exemple /nom/Documents/important/documentarestaurer"
	      read doccible
	      echo "Veuillez indiquer l'heure de la restauration à effectuer(08-19)"
	      read docheure
	      echo "Etes-vous sur de vouloir restaurer le document $doccible de $docheure H ? (y/n)"
	      read reponsedoc
	           if [ "$reponsedoc" = "y" ]; then
	           echo "RESTAURATION DOC EN COURS"
	           echo "Création du point de montage"
	           sudo -s /bin/mkdir /mnt/snaps/home.$docheure
	           echo "Montage du snapshot"
	           /bin/mount /dev/VG0/home.$docheure /mnt/snaps/home.$docheure
	           echo "Copie depuis /mnt vers homedir"
	           cp -a /mnt/snaps/home.$docheure\h00$doccible /home$doccible.snap 
	           echo "Démontage du snapshot"
                   /bin/umount /dev/VG0/home.$docheure /mnt/snaps/home.$docheure
	           echo "Destruction du point de montage"
	           rm -rf /mnt/snaps/home.$docheure			     
	           echo "RESTAURATION TERMINEE"
		   elif [ "$reponsedoc" = "n" ]; then
	           echo "A votre demande, le script de restauration va se terminer"
	           else 
	           echo "Erreur, veuillez relancer le script de restauration"    
	           fi
	           exit
	       elif [ "$reponse2" = "dossier" ]; then
	       echo "Veuillez entrez le chemin vers le répertoire cible"
	       echo "Exemple /user/dossier/arestaurer"
	       read repcible
	       echo "Veuillez indiquer l'heure de la restauration à effectuer(08-19)"
	       read repheure
	       echo "Etes-vous sur de vouloir restaurer le repertoire /home$repcible de $repheure H ? (y/n)"
	       read reponserep
		    if [ "$reponserep" = "y" ]; then           
		    echo "RESTAURATION REPERTOIRE EN COURS"
	            echo "Création du point de montage"
		    sudo -s /bin/mkdir /mnt/snaps/home.$repheure
	            echo "Montage du snapshot"
		    /bin/mount /dev/VG0/home.$repheure /mnt/snaps/home.$repheure
	            echo "Copie depuis /mnt vers homedir"
	            cp -a /mnt/snaps/home.$repheure\h00$repcible /home$repcible.snap 
		    echo "Démontage du snapshot"
                    /bin/umount /dev/VG0/home.$repheure /mnt/snaps/home.$repheure
		    echo "Destruction du point de montage"
		    rm -rf /mnt/snaps/home.$repheure
		    echo "RESTAURATION TERMINEE"
		    elif [ "$reponserep" = "n" ]; then
		    echo "A votre demande, le script de restauration va se terminer"
		    else
		    echo "Erreur, veuillez relancer le script de restauration" 
		    fi
		    exit

fi           
else
echo "Erreur, veuillez relancer le script de restauration" 
fi
exit


mercredi
14 mai 2008 à 16:18
 
 

AH MES YEUX §§§ MES YEUX !!!!


mercredi
14 mai 2008 à 16:23
 
 

Houla, c't'un peu dense et peu lisible.

Je regarde ça si j'ai un peu de temps (pas gagné d'avance).

Sinon y'a bien Kane qui sera capable de t'éclairer.


mercredi
14 mai 2008 à 16:25
 
 

Mmmh, à la réflexion :

- ta commande 'pwd' s'exécute là où est le script, donc sur le serveur. Et à partir de là tu ne pourras jamais avoir le nom du répertoire voulu sur le client.

- il faudrait passer le nom du répertoire de destination sur le client en paramètre du script ; mais je ne vois pas de moyen simple pour l'automatiser (et le laisser saisir par l'utilisateur c'est l'erreur assurée).

Ce qui pourrait être à faire c'est décomposer ton script en deux parties :

- un script sur le client qui fait le nécessaire pour être dans le bon répertoire et lancer le 'pwd' qui va bien

- un script sur le serveur qui fait le travail de restauration voulu

et ton deuxième script serait lancé par le premier via ssh et avec le résultat de la commande pwd en paramètre.

Quelque chose du genre

ssh utilisateur@serveur:scripts/restauration /home/users/images


Pour rappel, un paramètre de script se récupère avec les variables pré-définies de $0 à $9 ($0 : nom du script, $1 : première variable, $2 deuxième variable, ...). Et on peut vérifier le nombre de paramètres avec la variable $#.


mercredi
14 mai 2008 à 16:37
 
 

Sonny Riviera a écrit
AH MES YEUX §§§ MES YEUX !!!!


Mais va mourir...


mercredi
14 mai 2008 à 16:37
 
 

Repiemink
#6 Mr Bricolage

barbares


mercredi
14 mai 2008 à 16:39
 
 

Ah non, on écrit des choses 'barbares' pour que le monsieur-tout-le-monde n'ait pas à le faire et qu'il puisse récupérer ses sauvegardes. ALORS HEIN §


mercredi
14 mai 2008 à 17:02
 
 

Ellendhel a écrit
Sonny Riviera a écrit
AH MES YEUX §§§ MES YEUX !!!!


Mais va mourir...


Ah ben si ça te fait plaisir de te cogner du script avec zéro indentation ni ligne blanche c'est toi que ça regarde.

Ah mais non, j'suis con, t'adores te faire mal, mOsieur LINUX.


mercredi
14 mai 2008 à 17:08
 
 

Sonny Riviera a écrit
Ah ben si ça te fait plaisir de te cogner du script avec zéro indentation ni ligne blanche c'est toi que ça regarde.


Si tu cites le message initial, tu verras que l'indentation y est, c'est juste que l'affichage ne prends pas en compte les tabulations.

C'est un grand classique de la plupart des forums web.


mercredi
14 mai 2008 à 17:46
 
 

ok.


mercredi
14 mai 2008 à 18:02
 
 

kaplan
#11 Joe Le Mérou

C'est d'ailleurs à ça que sert la balise 'code', s'il m'en souvient.


mercredi
14 mai 2008 à 18:11
 
 

Kane
#12 Satan m'habite

Ellendhel a écrit

Ce qui pourrait être à faire c'est décomposer ton script en deux parties :

- un script sur le client qui fait le nécessaire pour être dans le bon répertoire et lancer le 'pwd' qui va bien

- un script sur le serveur qui fait le travail de restauration voulu

et ton deuxième script serait lancé par le premier via ssh et avec le résultat de la commande pwd en paramètre.

Quelque chose du genre
ssh utilisateur@serveur:scripts/restauration /home/users/images


Pour rappel, un paramètre de script se récupère avec les variables pré-définies de $0 à $9 ($0 : nom du script, $1 : première variable, $2 deuxième variable, ...). Et on peut vérifier le nombre de paramètres avec la variable $#.


Il n'y a pas d'autres solutions, a moins de faire entrer les paramètres aux utilisateurs (hahahahaha, j'en rigole encore).

En plus si tu poses ton script client dans le path d'execution (/usr/local/bin ou /usr/bin selon la distrib') les utilisateurs n'auront qu'a lancer la commande sans se poser de question.


mercredi
14 mai 2008 à 19:42
 
 

plop

ici une balise code


plop (pas indenté)
    plop plop (indenté sur un niveau, quatre espaces)
        plop plop plop (indenté sur deux niveaux, huit espaces)

fini la balise code

Verdict : en prévisualisation, aucune indentation

Verdict deux : en publication, aucune indentation non plus.

Mais bon, je ne vais pas aller au bureau des pleurs pour cela, on pourrait croire que j'encourage à poster des codes sources après.


Dernière modification le 14/05/08 à 21:48 par Ellendhel
mercredi
14 mai 2008 à 21:46
 
 


jeudi
15 mai 2008 à 08:14
 
 

Hooooooooooooooo putain hahahahaha :) mais tu la trouvé ou cette image.


jeudi
15 mai 2008 à 08:22
 
 

Je dirais vu l'emblème sur la casquette, que cela vient du fan-site dédié à Condorman ©


jeudi
15 mai 2008 à 08:28
 
 

WTF + Google image.
L'internet est full of surprises :)


jeudi
15 mai 2008 à 08:38
 
 

Désolé pour l'indentation mais les balises codes sont ds les choux.

J'crois que c'est mort pour recupérer le pwd en local ...

J'ai donc fait ca :

if [ $# -ne 1 ]; then
echo "Erreur, veuillez spécifier le répertoire à restaurer"
fi

# mémorisation du répertoire courant
cur_rep=`pwd`
rep=$1
# on se place dans le répertoire à restaurer
cd $rep

# la suite est identique

# tout à la fin avant le exit
cd $cur_rep

Comme ca , j'appelle en local avec la complétion et je nettoie mon code de 2/3 de ces lignes.
Avec un petit alias sur le ssh server /chemin/script et c'est presque acceptable.

Merci à ceux qui se sont niqués les yeux sur ce script.


Dernière modification le 15/05/08 à 16:45 par stillcut
jeudi
15 mai 2008 à 16:43
 
 


Répondre au sujet

Vous devez être identifié pour participer à ce topic.