Citation
Zeurkk
Bonjour à tous.
Je voudrais creer un script que j'executerais en
tant que simple utilisateur mais qui lancerais des
commandes en tant que root.
Mais je ne vois pas comment faire.
J'ai creer le script en tant que root, mais en
l'executant en tant que simple utilisateur, ça me
met permision non accordés ( normal me dirait vous
)
Alors comment je dois faire ?
Merce de vos reponses
Déjà, c'est tout à fait normal que le script que tu lances prenne tes droits et non les droits du propriétaire du script. Si cela n'était pas, les permissions n'auraient plus aucun sens. N'importe qui pourrait lancer "/bin/sh" qui appartient à root et il aurait un shell sous root.
Ensuite, il t'es possible de faire en sorte qu'un programme (pas un script, un programme compilé) soit lancé avec d'autres droits. C'est le cas du programme "/bin/passwd" qui se lance avec les droits de root pour pouvoir modifier ton mot de passe.
Pour ça, il faut donner le "setuid" au programme.
=> chmod 4111 prog (oui, 4 chiffres). Ce 4° chiffre placé en première position correspond aux droits spéciaux.
Une fois que c'est fais, quand tu fais "ls -l prog" tu vois "--s--x--x". Ce petit "s" signifie que le setuid est positionné. Avec ce setuid, quiconque lance "prog" lancera ce programme non pas en étant lui-même mais en étant le propriétaire du programme. Si ce propriétaire est "root", ben le programme sera lancé avec les droits de root.
Mais s'il t'es possible d'exécuter un programme en tant que "root" il ne t'es pas possible d'exécuter un script. C'est parce qu'un script n'est pas réellement exécuté, il n'est qu'interprété par le shell et le shell n'a pas les droits de root (CQFD).
Donc, pour que tu puisses lancer ton script avec les droits de root, faut que tu écrives un programme en C qui lance ce script... puis que tu compiles ce programme et que :
1) tu rends "root" propriétaire de l'exécutable
2) tu lui mets le setuid
Ce programme n'est vraiment pas compliqué
#include <unistd.h>
main(int argc, char *argv[], char *envp[])
{
// On modifie le nom du programme pour que le script ait la bonne valeur
// C'est pas vraiment propre mais ça marche
argv[0]="chemin/script.sh";
// On lance le script avec les arguments et l'environnement local
execve("chemin/script", argv, envp);
}
Une fois compilé, tu peux lancer le programme avec des paramètres. Ceux-ci seront transmis au script ainsi que l'environnement dans lequel tu évolues.
Voila.