Forum Linux.débutant Programmation de .sh

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
30
oct.
2017

Bonjours à tous,

Actuellement je fait un peu de scrypt shell et j'aimerais savoir comment peut-on se loguer dans un .sh que l'on lance en root avec un user de ce type sans revenir à la commande :

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

Quand je lance dans un .sh cette commande, je me retrouve à taper dans le shell et devoir faire exit pour continuer le programme :

su www-data -s /bin/bash

La solution c'est de mettre exit après cette cmd ?

Voici le script :

#!/bin/bash

su www-data -s /bin/bash
echo "OKEY WWW-DATA"

su
echo "OKEY ROOT"

exit

Merci d'avance

  • # man su

    Posté par  . Évalué à 2.

    Le manuel indique:

    -s, --shell=SHELL
    run SHELL if /etc/shells allows it

    et

    -c, --command=COMMAND
    pass a single COMMAND to the shell with -c

    Vue la longueur de la manpage, certains pourraient se poser des questions sur temps de recherche de solution…

    • [^] # Re: man su

      Posté par  . Évalué à 1.

      Pourquoi ne pas se loguer avec le user www-data plutot que de lancer des cmd de cette facon ?

      Comment dans ce cas enchainer les cmd suivantes en étant sur de ce que l'on fait :

      cd /var
      mkdir test

      => est-on dans /var ?

      exemple :

      su -c 'cd /var | mkdir test' -s /bin/bash www-data

      J'enlève le -s comme on a dit et après ?

      • [^] # Re: man su

        Posté par  . Évalué à 3.

        Pourquoi ne pas se loguer avec le user www-data plutot que de lancer des cmd de cette facon ?

        Oui, on pourrait peut-être lancer tout le script avec le user www-data, faut voir… ça dépend…

        Son script peut éventuellement devoir lancer des commandes avec différents utilisateurs. Dans ce cas le script doit être lancé par un compte qui peut « faire un su » sur tous ces différents utilisateurs (soit root, soit il configurer PAM : https://unix.stackexchange.com/questions/113754/allow-user1-to-su-user2-without-password).

        Faudrait connaître son besoin sous-jacent avant d’aller plus loin…

    • [^] # Re: man su

      Posté par  . Évalué à 3.

      Oui… Je profite de ton commentaire pour préciser que l’option -s est ici nécessaire car le shell par défaut de l’utilisateur www-data est /usr/sbin/nologin, sinon ce n’est pas nécessaire.

      De plus, il faut bien prendre soin, comme je l’ai fait en utilisant des guillemets simples ('…'), d’« échapper » la ligne de commande que l’on fournit à la commande su via l’option -c, sinon c’est le shell qui lance su qui va d’abord interpréter des trucs.

      Je pense que tu le sais, j’écris ça surtout pour d’autres débutants…

      • [^] # Re: man su

        Posté par  . Évalué à 1.

        Je trouve ça quand même assez fastidieux de taper des commandes comme ceci à chaque fois qu'on veut changer de user mais si c'est comme cela qu'on fait.

        • [^] # Re: man su

          Posté par  . Évalué à 4.

          Au lieu de :

          <commande>
          

          tu fais :

          su -c '<command>' <user>
          

          (avec éventuellement -s pour spécifier le shell)

          Et tu trouves ça fastidieux ?

          On peut aussi mettre le script en "setuid" pour qu’il s’exécute avec son utilisateur propriétaire plutôt que celui qui lance le script. Par contre il faut éviter de faire ça quand c’est root qui est propriétaire du fichier.

          En interactif, si tu est loggé en userA, la commande à taper c’est su - userB (ou su userB, selon ce qu’on veut comme environnement) pour changer d’utilisateur (« lancer un shell avec cet utilisateur » pour être précis). Dans ce shell, faire exit te « ramènera » sur le shell du premier utilisateur (celui qui a appelé su)

          Non, vraiment, je ne comprends pas « fastidieux »…

          • [^] # Re: man su

            Posté par  . Évalué à 6.

            On peut aussi mettre le script en "setuid" pour qu’il s’exécute avec son utilisateur propriétaire plutôt que celui qui lance le script.

            Non, on ne peut pas. Le bit SUID ne fonctionne que sur les binaires, pas les scripts qui sont exécutés par ceux-ci (et il ne faut SURTOUT PAS faire un bash, ou autre, en SUID).

            • [^] # Re: man su

              Posté par  . Évalué à 3.

              Merci pour la correction. Ce n’est en effet plus possible depuis belle lurette.

      • [^] # Re: man su

        Posté par  . Évalué à 2.

        Malgré le shebang?

        j’écris ça surtout pour d’autres débutants…

        Je t'avoue que je n'avais pas noté le coup du www-data, en fait.

  • # Bonjour

    Posté par  . Évalué à 3.

    peut-on se loguer dans un .sh

    Ça ne veut rien dire.

    Tu ne peux pas procéder comme tu le fais…

    Par contre tu peux faire comme ceci :

    Le script :

    #!/usr/bin/env bash
    
    su -c 'echo $(whoami)' -s /bin/bash www-data
    echo $(whoami)

    ça donne, lancé en root :

    root@medusa:/tmp# ./tt.sh 
    www-data
    root
    

    Note que je peux ajouter un exit à la fin du script, c’est même une bonne pratique, ça ne change rien, là il est implicite.

    scrypt shell

    Un script, avec un i… Pas courante cette faute :) "Okey" en lieu et place de "Okay" l’est un peu plus ;)

  • # mauvais usage de su

    Posté par  . Évalué à 2.

    #!/bin/bash
    su www-data -s /bin/bash
    echo "OKEY WWW-DATA"
    su
    echo "OKEY ROOT"
    exit

    devient

    #!/bin/bash
    su www-data -c 'echo "OKEY en WWW-DATA"'
    
    su root -c 'echo "OKEY en ROOT"'
    exit
    • [^] # Re: mauvais usage de su

      Posté par  . Évalué à 1.

      D'accord merci et dans ce cas :

      su -c 'echo -e "(quit)" | ccl --load $wwwhome/turtl/api/start.lisp' -s /bin/bash www-data

      Comment placer une variable de type $wwwhome dans cette commande ?

      • [^] # Re: mauvais usage de su

        Posté par  . Évalué à 2.

        su -c 'echo -e "(quit)" | ccl --load $wwwhome/turtl/api/start.lisp' -s /bin/bash www-data
        Comment placer une variable de type $wwwhome dans cette commande ?

        en le sortant du -c

        su -c 'echo -e "(quit)" | ccl --load' $wwwhome '/turtl/api/start.lisp' -s /bin/bash www-data

        par contre le -s bash n'est pas obligatoire si l'utilisateur dispose deja du shell bash

        • [^] # Re: mauvais usage de su

          Posté par  . Évalué à 1.

          d'accord merci

          • [^] # Re: mauvais usage de su

            Posté par  . Évalué à 1.

            J'ai tenté ta commande mais ça ne fonctionne pas avec les variables $

            • [^] # Re: mauvais usage de su

              Posté par  . Évalué à 2.

              à tout hasard ton $wwwhome ce ne serait pas le home de www-data ?
              auquel cas cette variable n'a pas besoin d'etre precisé car tu seras deja dans son home avec le su www-data

              sinon tu peux utiliser la notation ~www-data/ qui enverra dans le home de l'utilisateur www-data

              • [^] # Re: mauvais usage de su

                Posté par  . Évalué à 1.

                Pour toi je peux utiliser ceci ?

                su -c 'echo -e "(quit)" | ccl --load ~www-data/turtl/api/start.lisp' -s /bin/bash www-data

Suivre le flux des commentaires

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