Comment exécuter des commandes en tant qu'autre utilisateur dans des scripts Linux

Publié: 2022-07-13
Terminal Linux sur un ordinateur portable sur fond bleu.
fatmawati achmad zaenuri/Shutterstock.com

Assez naturellement, lorsque vous exécutez une commande ou un script, le système l'exécute comme un processus que vous avez lancé. Mais vous pouvez exécuter des commandes et des scripts en tant qu'autre utilisateur.

Les processus ont des propriétaires

Lorsqu'un programme ou un script est exécuté, Linux crée un processus. Ce processus a un propriétaire. Le propriétaire est soit un autre processus, soit le nom d'un compte utilisateur si une personne l'a lancé.

La propriété d'un processus définit certaines des capacités et l'environnement du processus. Selon la façon dont le processus a été lancé, il hérite de certains attributs de son processus parent ou de l'utilisateur. Ou, plus strictement, le processus utilisé par l'utilisateur pour lancer le programme, qui est généralement un shell.

Comment gérer les processus à partir du terminal Linux : 10 commandes à connaître
CONNEXION Comment gérer les processus à partir du terminal Linux : 10 commandes que vous devez connaître

L'exécution d'une commande ou d'un script en tant qu'autre utilisateur peut être utile car la propriété de tous les fichiers créés par le processus appartiendra à l'utilisateur approprié.

Chaque fois que nous utilisons sudo , nous exécutons une commande en tant qu'un autre utilisateur. Le compte d'utilisateur par défaut utilisé par sudo est l'utilisateur root ou 'super'. Pour cette raison, sudo est souvent considéré à tort comme super utilisateur do . Mais ce n'est qu'un jargon lâche. Il représente en fait l' utilisateur substitut do .

Avec sudo , vous pouvez exécuter des commandes en tant que n'importe quel autre utilisateur, pas seulement en tant que root. Ironiquement, vous avez besoin des privilèges root pour le faire. Mais lancer un programme ou un script appartenant à un autre utilisateur n'est pas la même chose que d'exécuter ce processus en tant qu'autre utilisateur. Vous l'exécuterez toujours en tant que root.

Voici comment exécuter réellement un processus en tant qu'un autre utilisateur et comment exécuter des commandes à partir d'un script comme si elles avaient été exécutées par un autre utilisateur.

Exécuter un script en tant qu'autre utilisateur

Nous utilisons un ordinateur sur lequel plusieurs utilisateurs sont configurés. L'une est Mary, qui a le nom d'utilisateur maryq, et l'autre est Dave avec le nom d'utilisateur dave.

Mary a un script appelé "other-user.sh" dans son répertoire personnel. Ceci est le texte du script.

 #!/bin/bash

echo "Nom du script :" $0
echo "Répertoire de travail :" $(pwd)
echo "Script en cours d'exécution en tant qu'utilisateur :" $(whoami)

Il imprime le nom du script, qui est contenu dans la variable d'environnement $0 . Il utilise ensuite pwd pour imprimer le répertoire de travail. Enfin, il utilise la commande whoami pour imprimer le nom de l'utilisateur qui a lancé le script. Ou qui, selon lui , a lancé le script.

Copiez le texte du script dans un éditeur et enregistrez-le sous "other-user.sh" dans le répertoire d'accueil d'un autre compte d'utilisateur.

Nous devrons rendre le script exécutable. Nous allons utiliser la commande chmod et utiliser l'option +x (exécuter) et l'option -u (utilisateur) pour définir l'indicateur d'exécution pour le propriétaire uniquement. Cela signifie que seule Marie peut exécuter le script. Nous allons vérifier les permissions du fichier avec ls .

 chmod u+x autre-utilisateur.sh
 ls 

Définition de l'autorisation d'exécution du script afin que seul l'utilisateur Mary puisse l'exécuter

De gauche à droite, les autorisations se lisent :

  • Le propriétaire peut lire, écrire et exécuter le fichier.
  • Les membres du groupe peuvent lire et écrire le fichier.
  • Les autres ne peuvent que lire le fichier.

Ainsi, les seuls utilisateurs capables d'exécuter le script sont Mary et root. Voici ce qui se passe lorsque Marie exécute le script :

 ./autre-utilisateur.sh 

La sortie lorsque Mary exécute le script

On nous dit que le répertoire de travail actuel du script est le répertoire personnel de Mary et que le propriétaire du script est le compte d'utilisateur maryq.

Comme prévu, Dave ne peut pas exécuter le script.

 /home/maryq/autre-utilisateur.sh 

L'utilisateur Dave ne peut pas exécuter le script, l'autorisation est refusée

Si Dave a des privilèges d'utilisateur root, il peut essayer d'exécuter le script en tant que root, en utilisant sudo .

 sudo /home/maryq/other-user.sh 

La sortie lorsque le script est exécuté par root

C'est une réussite partielle. Le script s'exécute, mais le propriétaire du script est root, pas maryq.

L'astuce que nous devons utiliser est l'option sudo -u (utilisateur). Cela vous permet de spécifier l'utilisateur sous lequel vous souhaitez exécuter la commande. Si vous n'utilisez pas l'option -u , sudo utilise par défaut root. Si nous voulons exécuter la commande en tant que Mary, nous devons transmettre le nom de leur compte d'utilisateur à la commande sudo .

sudo -u maryq /home/maryq/autre-utilisateur.sh

Utilisation de l'option -u user avec root pour exécuter le script en tant qu'utilisateur Mary

Cette fois, le script signale que le propriétaire du processus est maryq.

Ajoutons une ligne au script « other-user.sh ». Nous allons echo à du texte et rediriger la sortie dans un fichier appelé "mary.txt".

 #!/bin/bash

echo "Nom du script :" $0 
echo "Répertoire de travail :" $(pwd) 
echo "Script en cours d'exécution en tant qu'utilisateur :" $(whoami)
echo "Ceci va dans un fichier dans /home/maryq/" > /home/maryq/mary.txt

Nous créons le nouveau fichier dans le répertoire personnel de Mary. C'est parfaitement bien parce que nous exécutons le script en tant que Mary.

 ./autre-utilisateur.sh 

Exécuter le script une fois de plus pour qu'il crée un fichier texte

Si nous vérifions dans le répertoire personnel de Mary, nous verrons que le fichier a été créé et que la propriété du fichier appartient au compte d'utilisateur maryq.

 ls -hl mary.txt 

Vérification de la propriété du fichier créé par le script

C'est le même comportement que nous verrions si Mary avait effectivement lancé le script elle-même.

CONNEXION: Comment utiliser la commande chmod sous Linux

La commande runuser

Vous pouvez utiliser les commandes sudo -u que nous avons utilisées jusqu'à présent dans un script, mais il existe une autre commande, runuser , conçue pour exécuter des processus en tant qu'utilisateur différent à partir de scripts internes. Il a une meilleure gestion du code de retour du processus lancé et il a moins de frais généraux que sudo .

La commande runuser doit être exécutée par root, mais cela se fait en exécutant l'intégralité du script en tant que root. Vous n'avez pas besoin d'utiliser sudo dans le script. La commande runuser peut également être utilisée sur la ligne de commande, elle n'est donc pas limitée à l'utilisation de scripts, bien qu'il s'agisse de la méthode préférée pour les scripts.

Dave ne peut pas répertorier le fichier "mary.txt" car il se trouve dans le répertoire personnel de Mary et il n'y a pas accès.

 chat /home/maryq/mary.txt 

L'utilisateur Dave ne peut pas lire le fichier de Mary, l'autorisation est refusée

Nous pouvons cependant jeter un coup d'œil à l'intérieur du fichier en utilisant runuser . L'option - (connexion) lance un nouveau shell avec un environnement très proche de l'environnement shell que Mary aurait si elle s'était réellement connectée. L'option -c (commande) est suivie de la commande que nous voulons exécuter.

 sudo runuser - maryq -c 'cat mary.txt' 

Lecture du fichier de Mary à l'aide de la commande runuser

Notez que la commande n'a pas besoin du chemin d'accès complet au fichier. Nous pouvons référencer le fichier de la même manière que Marie le ferait, par rapport à son répertoire personnel.

En tant qu'utilisateur Dave, nous allons créer un script appelé "run-maryq.sh" avec ce texte :

 #!/bin/bash

runuser -l maryq -c 'cat mary.txt'

Nous allons le rendre exécutable :

 chmod +x run-maryq.sh 

Rendre le script exécutable avec chmod

Voyons ce qui se passe lorsque nous essayons de l'exécuter.

 ./run-maryq.sh 

Exécuter le script avec runuser à l'intérieur, en tant qu'utilisateur normal

La commande runuser se plaint car elle est exécutée par un utilisateur normal. Exécutons-le à nouveau avec sudo .

 sudo ./run-maryq.sh 

Exécuter le script avec runuser à l'intérieur, en tant que root

Cela fonctionne comme nous le voudrions, et comme si Mary avait elle-même lancé le script.

Lequel utiliser ?

Sur la ligne de commande, il n'y a pas beaucoup de choix entre eux. Mais comme vous devez de toute façon utiliser sudo avec runuser , autant utiliser sudo seul.

Mais dans un script, runuser est la commande préférée.

CONNEXION: 10 commandes Linux de base pour les débutants