Comment utiliser set et pipefail dans les scripts Bash sous Linux
Agence web » Actualités du digital » Comment exécuter des commandes en tant qu’autre utilisateur dans des scripts Linux

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

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.

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’autre utilisateur. Le compte utilisateur par défaut utilisé par sudo est l’utilisateur root ou « super ». À cause de ça, sudo est souvent considéré à tort comme représentant super utilisateur faire. Mais ce n’est qu’un jargon mou. Il représente en fait utilisateur de remplacement faire.

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 comme cet 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 "Script name:" $0
echo "Working directory:" $(pwd)
echo "Script running as user:" $(whoami)

Il imprime le nom du script, qui est contenu dans le $0 variables d’environnement. Il utilise alors pwd pour imprimer le répertoire de travail. Enfin, il utilise le whoami commande pour imprimer le nom de l’utilisateur qui a lancé le script. Ou qui c’est pense lancé le scénario.

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 utiliserons le chmod commandez et utilisez le +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 vérifierons les autorisations de fichier avec ls .

chmod u+x other-user.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 :

./other-user.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/other-user.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 la sudo -u option (utilisateur). Cela vous permet de spécifier l’utilisateur sous lequel vous souhaitez exécuter la commande. Si vous n’utilisez pas le -u option, 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 au sudo commande.

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 ». Bien echo du texte et redirigez la sortie dans un fichier appelé « mary.txt ».

#!/bin/bash

echo "Script name:" $0 
echo "Working directory:" $(pwd) 
echo "Script running as user:" $(whoami)
echo "This is going into a file in /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.

./other-user.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.


La commande runuser

Vous pourriez utiliser le sudo -u commandes que nous avons utilisées jusqu’à présent dans un script, mais il existe une autre commande, runuser, qui est conçu pour exécuter des processus en tant qu’utilisateur différent des 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 runuser La commande doit être exécutée par root, mais cela est accompli en exécutant l’intégralité du script en tant que root. Vous n’avez pas besoin d’utiliser sudo à l’intérieur du script. La runuser La commande 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.

cat /home/maryq/mary.txt

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

Nous pouvons jeter un coup d’œil à l’intérieur du fichier en utilisant runuser, toutefois. La - (login) 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. -c L’option (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 runuser La commande se plaint car elle est exécutée par un utilisateur normal. Recommençons 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 tu dois utiliser sudo avec runuser de toute façon, autant utiliser sudo tout seul.

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

★★★★★