Aide programme shell

Résolu/Fermé
COLOMBAT - 3 déc. 2006 à 21:45
 COLOMBAT - 5 déc. 2006 à 11:21
Bonsoir,
J'ai un petit souci avec un programme que je dois écrire en shell.
Voici le code :

#!/bin/sh



#********************Liste des utilisateurs**************************

liste_users()

{

echo "Liste des utilisateurs"

for params in `cat /etc/passwd | cut -d: -f1`

do

echo "$params"

done

}



#*****Informations sur un ou plusieurs utilisateurs******************

infos_users()

{

echo "Coordonnées de l'utilisateur dans le système"

who am i

}



#******Liste des processus d'un utilisateur**************************

processus_users()

{

echo "Liste des processus de l'utilisateur"

ps -aux

}



#****************Fonctions répertoire********************************

#********************************************************************

#*****************Vérification du répertoire*************************

verif_rep()

{

echo "Chemin du répertoire :"

read rep

[ -d "$rep" ] && return 0

return 1

}



#*****************Fonction création répertoire***********************

cree_rep()

{

clear

if verif_rep

then echo "$rep existe"

else

if [ ! -z "$rep" ]

then

echo "Création du répertoire $rep"

mkdir -p "$rep"

echo "Répertoire créé"

fi

fi

}



#************Fonction suppression répertoire*************************

Suppr_rep()

{

clear

if verif_rep

then

echo "Suppression du répertoire $rep"

echo "Etes-vous sûr de vouloir supprimer?"

read choix

case "$choix" in

O|o|OUI|oui)

rm -r "$rep"

echo "Répertoire supprimé"

;;

N|n|NON|non)

echo "Suppression annulée"

Menu_principal

;;

*)

erreur

pause

;;

esac

else

echo "$rep inexistant ou n'est pas un répertoire"

erreur

fi

}



#****************Consultation du contenu d'un repertoire************

contenu_rep()

{

clear

if verif_rep

then

ls -l "$rep"

else

echo "$ rep inexistant ou n'est pas un répertoire"

erreur

fi

}



#****************Vérification fichier************************************

verif_fich()

{

echo "Chemin du fichier:"

read nom_fich

N=$(cat $fichier | head -n1 | tr -d'')

if ["$nombre" = "$N"]

then

echo "Fichier existant"

else

echo "Fichier $nom_fich inexistant"

erreur

fi

}



#****************Consultation fichier************************************

Consulte_fich()

{

echo "Chemin du fichier à consulter:"

read nom_fich

if [ -e "$nom_fich" ]

then

cat "$nom_fich"

else

echo "Fichier $nom_fich inexistant"

erreur

fi

}



#****************Modification fichier***************************

Modif_fich()

{

echo "Chemin du fichier à modifier:"

read nom_fich

if [ -e "$nom_fich" ]

then

vi "$nom_fich"

else

echo "Fichier $nom_fich n'existe pas"

erreur

fi

}



#*Détection d'utilisateurs n'ayant pas de répertoire d'accueil************

detect_users()

{

tmp=`cat /etc/passwd | cut -d: -f1,6`

for hash in $tmp

do

login=`echo $hash | cut -d: -f1`

home_dir=`echo $hash | cut -d: -f2`

if [ ! -d $home_dir ]

then

echo "pas de répertoire accueil pour $login"

fi

done

}



#**Test si repertoire utilisateur existant***********************

test_repertoire()

{

if [ -d $HOME ]

then

echo "le repertoire $HOME existe déjà"

erreur

fi

}



#**Test si root lance le script*****************************

test_root()

{

if [ $USER != "root" ]

then

echo "l'utilisateur n'est pas root"

erreur

fi

}



#****************Fonction erreur*****************************************

erreur()

{

echo `date` >> erreur.log

echo ""

}



#******************Fonction permettant de quitter le programme***********

Quitter_programme()

{

echo "Voulez-vous quitter le programme?"

read reponse

case "$reponse" in

O|o|OUI|oui)

break

;;

N|n|NON|non)

Menu_principal

;;

*)

echo "erreur"

erreur

pause

;;

esac

}



#********************Fonction pause****************************

pause()

{

echo "Appuyer sur Entrée"

read touche

}


#**************Sous-menu informations utilisateurs***********************

Sous_menu_utilisateurs()

{

echo "Informations liees aux utilisateurs"



echo "1- Liste des utilisateurs"

echo "2- Informations sur un ou plusieurs utilisateurs"

echo "3- Liste des processus utilisateurs"

echo "4- Retour au menu principal"

echo "Tapez votre choix"

read choix2



case "$choix2" in

1)

echo "1- Liste des utilisateurs"

liste_users

pause

;;

2)

echo "2- Informations sur un ou plusieurs utilisateurs"

infos_users

pause

;;

3)

echo "3- Liste des processus d'un utilisateur"

processus_users

pause

;;

4)

echo "4- Retour au menu principal"

Menu_principal

;;

*)

erreur

pause

;;

esac

}



#**************Sous-menu sur les répertoires et fichiers*****************

Sous_menu_repertoires_et_fichiers()

{

echo "Fonctions sur les répertoires et fichiers"



echo "1- Creation d'un répertoire"

echo "2- Suppression d'un répertoire"

echo "3- Consultation du contenu d'un répertoire"

echo "4- Consultation d'un fichier"

echo "5- Modification d'un fichier sous un éditeur"

echo "6- Retour au menu principal"

echo "Quel est votre choix?"



read choix3

case "$choix3" in

1)

cree_rep

pause

;;

2)

Suppr_rep

pause

;;

3)

contenu_rep

pause

;;

4)

Consulte_fich

pause

;;

5)

Modif_fich

pause

;;

6)

Menu_principal

;;

*)

erreur

pause

;;

esac

}



#*******************Sous-menu autres fonctions***************************

Sous_menu_diverses_fonctions()

{

echo "Autres fonctions"

echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"

echo "2- Test si le repertoire de l'utilisateur existe"

echo "3- Test si l'utilisateur exécutant le script est root"

echo "4- Retour au menu principal"



read choix4

case "$choix4" in

1)

echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"

detect_users

pause

;;

2)

test_repertoire

pause

;;

3)

test_root

pause

;;

4)

Menu_principal

pause

;;

*)

erreur

pause

;;

esac

}


#*****************Menu principal****************

while :

do

clear

#-----------------Affichage du menu-------------

cat << EOT

1- Informations liées aux utilisateurs

2- Fonctions sur les répertoires et fichiers

3- Diverses fonctions

4- Quitter

EOT

#---------------Fin du menu---------------------



echo "Entrer votre choix :"

read choix

case $choix in

1)

Sous_menu_utilisateurs

;;

2)

Sous_menu_repertoires_et_fichiers

;;

3)

Sous_menu_diverses_fonctions

;;

4)

Quitter_programme

;;

*)

erreur

echo "Erreur. Saisissez à nouveau votre choix."

pause

;;

esac

done

Lorsque j'exécute le programme sur le terminal, il me retourne comme erreur :
: commande introuvable
' inattendue 4: erreur de syntaxe près du jeton `
'rojet: line 4: `liste_users()

Alors que la veille, il marchait parfaitement bien.
Enfin, concernant la redirection d'erreur, j'aimerais afficher, en plus de la date, le message d'erreur dans le fichier erreur.log.
Merci de votre aide
Guillaume COLOMBAT

8 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 déc. 2006 à 22:16
Salut,

j'ai testé ton script chez moi et ça marche

sugestion

pour
test_root()
{
if [ $USER != "root" ]
then
echo "l'utilisateur n'est pas root"
erreur
fi
} 
Même si dans erreur.log tu as les traces de l'exécutions tu peux quand même affiche à l'écran que "voilà c'est bien le root qui exécute le script"
test_root()
{
  if [ $USER != "root" ];then
    echo "l'utilisateur n'est pas root"
    erreur
  else
    echo "l'utilisateur est root"
  fi
}


Pour l'erreur dans erreur.log tu peux utiliser une variable

Par exemple
*)
  msg="Erreur.Saisissez à nouveau votre choix"
  erreur
  echo $msg
  pause
;;
La fonction erreur
#****************Fonction erreur*****************************************

erreur()
{
  echo `date` $msg >> erreur.log
  echo ""
}
et la partie qui vérifie si l'utilisateur qui exécute le script et root
#**Test si root lance le script*****************************

test_root()
{
  msg="l'utilisateur n'est pas root"

  if [ $USER != "root" ];then
    echo $msg
    erreur
  else
    echo "l'utilisateur est root"
  fi
}
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 déc. 2006 à 22:21
Encore une chose

au lieu de `cat /etc/passwd | cut -d: -f1`
tu peux utiliser
$(cat /etc/passwd | cut -d: -f1)
0
Salut lami20j!
Merci beaucoup pour ta réponse.
C'est tout de même bizarre que ça ne fonctionne pas chez moi.
D'après toi, d'où ça peut venir?
Bref, avec ce que tu as mis, j'ai donc modifié le script :

#!/bin/sh

#********************Liste des utilisateurs**************************
liste_users()
{
echo "Liste des utilisateurs"
for params in $(cat /etc/passwd | cut -d: -f1)
do
echo "$params"
done
}

#*****Informations sur un ou plusieurs utilisateurs******************
infos_users()
{
echo "Coordonnées de l'utilisateur dans le système"
who am i
}

#******Liste des processus d'un utilisateur**************************
processus_users()
{
echo "Liste des processus de l'utilisateur"
ps -aux
}

#****************Fonctions répertoire********************************
#********************************************************************
#*****************Vérification du répertoire*************************
verif_rep()
{
echo "Chemin du répertoire :"
read rep
[ -d "$rep" ] && return 0
return 1
}

#*****************Fonction création répertoire***********************
cree_rep()
{
clear
if verif_rep
then echo "$rep existe"
else
if [ ! -z "$rep" ]
then
echo "Création du répertoire $rep"
mkdir -p "$rep"
echo "Répertoire créé"
fi
fi
}

#************Fonction suppression répertoire*************************
Suppr_rep()
{
clear
if verif_rep
then
echo "Suppression du répertoire $rep"
echo "Etes-vous sûr de vouloir supprimer?"
read choix
case "$choix" in
O|o|OUI|oui)
rm -r "$rep"
echo "Répertoire supprimé"
;;
N|n|NON|non)
echo "Suppression annulée"
Menu_principal
;;
*)
erreur
pause
;;
esac
else
msg="$rep inexistant ou n'est pas un répertoire"
echo $msg
erreur
fi
}

#****************Consultation du contenu d'un repertoire************
contenu_rep()
{
clear
if verif_rep
then
ls -l "$rep"
else
msg="$ rep inexistant ou n'est pas un répertoire"
echo $msg
erreur
fi
}

#****************Vérification fichier************************************
verif_fich()
{
echo "Chemin du fichier:"
read nom_fich
N=$(cat $fichier | head -n1 | tr -d'')
if ["$nombre" = "$N"]
then
echo "Fichier existant"
else
msg="Fichier $nom_fich inexistant"
echo $msg
erreur
fi
}

#****************Consultation fichier************************************
Consulte_fich()
{
echo "Chemin du fichier à consulter:"
read nom_fich
if [ -e "$nom_fich" ]
then
cat "$nom_fich"
else
msg="Fichier $nom_fich inexistant"
echo $msg
erreur
fi
}

#****************Modification fichier***************************
Modif_fich()
{
echo "Chemin du fichier à modifier:"
read nom_fich
if [ -e "$nom_fich" ]
then
vi "$nom_fich"
else
echo "Fichier $nom_fich n'existe pas"
erreur
fi
}

#*Détection d'utilisateurs n'ayant pas de répertoire d'accueil************
detect_users()
{
tmp=`cat /etc/passwd | cut -d: -f1,6`
for hash in $tmp
do
login=`echo $hash | cut -d: -f1`
home_dir=`echo $hash | cut -d: -f2`
if [ ! -d $home_dir ]
then
echo "pas de répertoire accueil pour $login"
fi
done
}

#**Test si repertoire utilisateur existant***********************
test_repertoire()
{
if [ -d $HOME ]
then
echo "le repertoire $HOME existe déjà"
erreur
fi
}

#**Test si root lance le script*****************************
test_root()
{
msg="l'utilisateur n'est pas root"
if [ $USER != "root" ];
then
echo $msg
erreur
else
echo "l'utilisateur est root"
fi
}

#****************Fonction erreur*****************************************
erreur()
{
echo `date` $msg >> erreur.log
echo ""
}

#******************Fonction permettant de quitter le programme***********
Quitter_programme()
{
echo "Voulez-vous quitter le programme?"
read reponse
case "$reponse" in
O|o|OUI|oui)
break
;;
N|n|NON|non)
Menu_principal
;;
*)
msg="erreur"
erreur

echo $msg
pause
;;
esac
}

#********************Fonction pause****************************
pause()
{
echo "Appuyer sur Entrée"
read touche
}

#**************Sous-menu informations utilisateurs***********************
Sous_menu_utilisateurs()
{
echo "Informations liees aux utilisateurs"

echo "1- Liste des utilisateurs"
echo "2- Informations sur un ou plusieurs utilisateurs"
echo "3- Liste des processus utilisateurs"
echo "4- Retour au menu principal"
echo "Tapez votre choix"
read choix2

case "$choix2" in
1)
echo "1- Liste des utilisateurs"
liste_users
pause
;;
2)
echo "2- Informations sur un ou plusieurs utilisateurs"
infos_users
pause
;;
3)
echo "3- Liste des processus d'un utilisateur"
processus_users
pause
;;
4)
echo "4- Retour au menu principal"
Menu_principal
;;
*)
erreur
pause
;;
esac
}

#**************Sous-menu sur les répertoires et fichiers*****************
Sous_menu_repertoires_et_fichiers()
{
echo "Fonctions sur les répertoires et fichiers"

echo "1- Creation d'un répertoire"
echo "2- Suppression d'un répertoire"
echo "3- Consultation du contenu d'un répertoire"
echo "4- Consultation d'un fichier"
echo "5- Modification d'un fichier sous un éditeur"
echo "6- Retour au menu principal"
echo "Quel est votre choix?"

read choix3
case "$choix3" in
1)
cree_rep
pause
;;
2)
Suppr_rep
pause
;;
3)
contenu_rep
pause
;;
4)
Consulte_fich
pause
;;
5)
Modif_fich
pause
;;
6)
Menu_principal
;;
*)
erreur
pause
;;
esac
}

#*******************Sous-menu autres fonctions***************************
Sous_menu_diverses_fonctions()
{
echo "Autres fonctions"
echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"
echo "2- Test si le repertoire de l'utilisateur existe"
echo "3- Test si l'utilisateur exécutant le script est root"
echo "4- Retour au menu principal"

read choix4
case "$choix4" in
1)
echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"
detect_users
pause
;;
2)
test_repertoire
pause
;;
3)
test_root
pause
;;
4)
Menu_principal
pause
;;
*)
erreur
pause
;;
esac
}

#*****************Menu principal****************
while :
do
clear
#-----------------Affichage du menu-------------
cat << EOT
1- Informations liées aux utilisateurs
2- Fonctions sur les répertoires et fichiers
3- Diverses fonctions
4- Quitter
EOT
#---------------Fin du menu---------------------

echo "Entrer votre choix :"
read choix
case $choix in
1)
Sous_menu_utilisateurs
;;
2)
Sous_menu_repertoires_et_fichiers
;;
3)
Sous_menu_diverses_fonctions
;;
4)
Quitter_programme
;;
*)

msg="Erreur. Saisissez à nouveau votre choix."
echo $msg
erreur
pause
;;
esac
done

Dis-moi si ça marche.
Merci d'avance
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 déc. 2006 à 22:45
chez moi ça marche
affiche le resultat de la commande
sh -x ton_script
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci beaucoup lami20j!
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
3 déc. 2006 à 23:06
Ca veut dire que ça marche?

Un petit conseil

rend ton code plus lisible en utilisant l'indentation

Par exemple

sans indentation
case "$choix3" in
1)
cree_rep
pause
;;
2)
Suppr_rep
pause
;;
3)
contenu_rep
pause
;;
4)
Consulte_fich
pause
;;
5)
Modif_fich
pause
;;
6)
Menu_principal
;;
*)
erreur
pause
;;
esac
} 


Avec indentation
case "$choix3" in
    1)
      cree_rep
      pause
    ;;
    2)
      Suppr_rep
      pause
    ;;
    3)
      contenu_rep
      pause
    ;;
    4)
      Consulte_fich
      pause
    ;;
    5)
      Modif_fich
      pause
    ;;
    6)
      Menu_principal
    ;;
    *)
      erreur
      pause
    ;;
esac
0
Merci lami20j!
Ca marche.
0
Le programme fonctionne mais j'ai juste un petit problème concernant la création de répertoire. J'aimerais d'abord vérifier les droits avant de le créer.
Merci d'avance pour ton aide
0