Aide programme shell

Résolu
COLOMBAT -  
 COLOMBAT -
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

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Encore une chose

    au lieu de `cat /etc/passwd | cut -d: -f1`
    tu peux utiliser
    $(cat /etc/passwd | cut -d: -f1)
    0
  3. COLOMBAT
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    chez moi ça marche
    affiche le resultat de la commande
    sh -x ton_script
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  7. COLOMBAT
     
    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