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.
Sommaire
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
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
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
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
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
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
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
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
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'
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
Voyons ce qui se passe lorsque nous essayons de l’exécuter.
./run-maryq.sh
La runuser
La commande se plaint car elle est exécutée par un utilisateur normal. Recommençons avec sudo
.
sudo ./run-maryq.sh
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.