Forum Programmation.shell Contrôle de l'utilisateur dans un shell de service

Posté par .
Tags : aucun
1
28
sept.
2011

Bonjour à tous,

je suis débutant sous linux, et je suis en train de créer des services dans /etc/init.d
voilà rien de très compliqué pour le moment après ça se complique (du moins pour moi!!!), je vais essayer de vous décrire mon problème le plus précisément possible:

J'ai un script dans mon répertoire /opt/appi/appi.sh
ce script permet de faire un status/start/stop/restart de mon application, mais il ne peut être exécuter seulement avec mon utilisateur (tata par exemple), si je le start/restart en root l'appli ne se lance pas correctement (pas du tout même)

je souhaiterais créer mon service "appi" dans /etc/init.d pour qu'il aille chercher ce script

Je souhaiterais avoir dans mon script de service, un controle de l'utilisateur, si je suis tata "OK je le lance", si je suis root (ou autre) "je le lance avec l'utilisateur tata"

Mais je ne sais pas faire un controle avant de type:

if $user=tata
"ok je lance le service"
else "je lance le service en tant que tata"

Je ne sais pas si je me suis bien fais comprendre, mais si quelqu'un aurait une idée, ce serait avec plaisir.

Merci d'avance

Franck

  • # id

    Posté par . Évalué à 2.

    avec la commande id, tu peux faire des vérifications sur l'utilisateur

    #en tant que root
    # id 
    uid=0(root) gid=0(root) groups=0(root)
    # id -u
    0
    # id -nu
    root
    # en tant qu'user normal
    $ id -nu
    gab
    $ id -u 
    1000
    
    

    tu peux aussi récupérer l'id/nom du groupe avec -g/-gn

    Je ne sais pas si je me suis bien fais comprendre, mais si quelqu'un aurait une idée, ce serait avec plaisir.

    du coup, je ne sais pas si je répond à côté :)

    • [^] # Re: id

      Posté par . Évalué à 1.

      Merci déjà pour ta réponse,

      j'ai bien compris la notion de UID GID mais en faite je n'arrive pas à l'appliquer dans mon cas, concrètement si je fais en root:

      service appi start

      je souhaiterais qu'il lance l'appli mais dans les process de tata (UID et le GID de tata est 20001 pour les deux)

      • [^] # Re: id

        Posté par . Évalué à 1.

        Re (dslé)

        Donc il faudrait lors de la création du service faire un controle de l'utilisateur pour dire quand c'est tata OK, on restart
        et si c'est root qui demande un service appi restart (ok on restart, mais en lançant sur le process de tata)

        Mais ça je ne sais pas faire

        • [^] # Re: id

          Posté par . Évalué à 2.

          pour lancer la commande cmd en tant que tata quand tu es root,

          su - tata -c cmd
          
          

          pour décider si tu lances cmd ou su -c cmd, quelque chose comme:

          if [ $(id -nu) -eq 0 ]; then
              su - tata -c cmd
          else
             cmd
          fi
          
          

          avec ces quelques briques, tu devrais pouvoir avancer vers (voire atteindre) ton objectif

          • [^] # Re: id

            Posté par . Évalué à 1.

            ah oui, pour tout ça, man est ton ami, même si je veux bien admettre que le man de bash (ou autre shell) est un peu touffu :)

          • [^] # Re: id

            Posté par . Évalué à 1.

            Merci en tout cas de ta réponse, je vais essayer de me débrouiller avec ça.
            Juste quelques précisions dans ton code:

            dans
            if [ $(id -nu) -eq 0 ]; then
            su - tata -c cmd

            Si je suis root je lance avec tata, c'est ça?

            donc si je vais en quelques sortes l'inverse (id de tata = 20001)
            comme:

            if [ $(id -nu) -eq 20001 ]; then
            cmd
            else
            su - tata -c cmd
            fi

            là je fais un controle si je suis tata je lance, sinon je lance en tant que tata, c'est ça?

            en tout cas merco

            • [^] # Re: id

              Posté par (page perso) . Évalué à 3.

              Il y a probablement plus de deux utilisateurs sur ton système … je veux dire des UIDs autres que 0 et 20001, il faudrait donc faire deux tests.

          • [^] # Re: id

            Posté par . Évalué à 3.

            il y a une variable d'environnement $USER en shell : pas besoin de se compliquer la vie à coup de awk dorsal.

            • [^] # Re: id

              Posté par . Évalué à 2.

              c'est vrai, mais il y a des pièges vicieux avec les variables d'environnement :

              ~# su - gab -c "echo $USER"
              root
              ~# su - gab -c 'echo $USER'
              gab
              ~# su - gab -c 'id -un'
              gab
              
              
  • # Lancer en tant que tata dans tous les cas

    Posté par . Évalué à 1.

    Pourquoi ne pas lancer le script en tant que tata tout le temps ?

  • # sécurite

    Posté par (page perso) . Évalué à 0.

    Il y a pas mal de services qui fonctionnent comme cela, pour ne pas avoir une démon qui tourne sous le compte root : postgresql par exemple (du moment qu'ils n'ont pas besoin d'ouvrir un port < 1024). Tu peux prendre exemple sur leurs scripts de démarrage.

    Les plus sécurisé effectuent en plus un chroot pour éviter la corruption de la racine, en cas d'attaque.

  • # résolu

    Posté par . Évalué à 0.

    Merci à tous pour vos réponses,

    j'ai résolu mon problème est mon service se lance bien avec mon utilisateur.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.