[LXDE] Script à l'ouverture de session

Salut les gens,

J’ai besoin d’envoyer un script (bash) à la connexion d’un utilisateur. Ce script fait des “cp”, du “ln” et du “chown”.
Le problème du “chown” c’est qu’il nécessite d’être root, mais ce chown utilise la variable d’environnement $USER. Donc, si c’est root qui exécute le bouzin, le propriétaire sera root, or j’ai besoin que ce soit l’Utilisateur qui se connecte.

Voici le script en question: (dans /usr/local/bin/transfertPOL.sh)

        #!/bin/bash
        #transfert de POL au démarrage de la session
        groupe=$(id -gn $1)
        uid=$(id -u $1)
        POL=/var/POL
        home=$(eval echo ~$1)
        lien=$home/.PlayOnLinux
        #changement de propriétaire du dossier
        sudo chown -h -R $1:$groupe $POL
        ln -s $POL $lien
        sudo chown -h -R $1:$groupe $lien
        #Copie des raccourcis sur le Bureau
        cp --preserve=ownership $POL/shorcuts/*.desktop $home/Desktop  

J’ai appris que pour lancer un script au démarrage de session, il fallait créer un fichier .desktop (doc LXDE). Voici mon Desktop Entry: (dans /etc/xdg/autostart/transfertPOL.desktop)

    [Desktop Entry]

    Type=Application

    Exec=sh /usr/local/bin/transfertPOL.sh 

Et comme ce script a besoin de sudo, j’ai edité /etc/sudoers.d/transfert avec:

    %users ALL=NOPASSWD: /usr/local/bin/transfertPOL.sh

(J’ai au passage décommenté la dernière ligne de /etc/sudoers : includedir /etc/sudoers.d/)

Donc, le script marche, mais pas le chown… C’est gênant.
Vous remarquerez que mon Desktop Entry n’a pas de sudo dans la commande… et bien l’exécution du Desktop Entry ne fonctionne pas en mettant Exec= sudo sh …

Une idée pour que mon rêve devienne une réalité ?

Merci les amiches.

Salut,

Dans ton fichier sudoers tu peux pas utiliser de variable, mais ne t’embête pas avec sudo dans ce cas.

La solution est de passe par un SetUid qui va te permettre de lancer ton script avec les droits root sans être root.

Commence par modifier les droits de ton script en mettant root en user. Il faudra que tes user ai le droit de lire et exécuter le script, donc soit en positionnant le groupe user avec les bons droits, soit en passant par les droits publiques.
Autrement dit :

  • Droit au groupe user
# chown root:user /usr/local/bin/transfertPOL.sh
# chmod 4750 /usr/local/bin/transfertPOL.sh
  • Droit aux users publiques
# chown root:root /usr/local/bin/transfertPOL.sh
# chmod 4755 /usr/local/bin/transfertPOL.sh

Le “chmod 4XXX” permet de positionner le SetUid qui fait parti des droits étendus sur Linux.
Après l’initialisation de ce droit étendu un utilisateur pourra lancer le script avec les droits root, fait donc attention au contenu du script et au faite que l’utilisateur ne puisse pas le modifier.

Pour info :

Merci à toi pour ton support.

J’avoue ne pas avoir tout pigé (mais je vais prếter attention à l’article wikipédia).

Ce dont je suis sûr (oui, je dis les choses en deux fois):
-> Je ne peux pas ajouter root au groupe user, car il n’existe pas.
Mes ordinateurs s’identifient sur un serveur LDAP. Lorsqu’un utilisateur se connecte ça lui crée un /home/groupe/utilisateur. C’est un collège donc il y a autant de groupes que de classes… et puis seul le home est créé, il n’y a pas de création de groupe en local. Donc, je ne peux vraiment pas ajouter root au groupe des users, ou alors faut que j’étudie de plus prêt ma config de PAM.

-> Ainsi, j’ai fait le chmod 4755 sur /usr/local/bin/transfertPOL.sh, ça ne résoud pas mon problème, dans le sens ou le script se lance, il fait tout ce que je lui demande, sauf le “chown”. J’ai même ajouté un mkdir dans ce script, que j’arrive à supprimer en tant que user, donc, les droits à l’exécution sont bons… ya que le chown…

Le but n’est pas d’ajouter root dans le groupe user, mais de mettre root en propriétaire du script et ensuite via le SetUid, d’autoriser un utilisateur à lancer le script avec les droits du propriétaires.
As tu tenter de passer la commande :
chown root:root /usr/local/bin/transfertPOL.sh

Par contre le script sera lancer avec les variables d’environnement de root, mais rien ne t’empêche de passer les variables de ton user en argument de ton script.

Oui, j’ai fait le chown que tu m’as suggéré, et à supposer (je vais tester ça demain) que le chown fonctionne, ma variable $id deviendra root, or, j’ai besoin que ce soit l’utilisateur de la session et non root. Là est la difficulté pour moi. Je veux mettre tout à root, mais comment dire à root que le dossier /var/POL doit appartenir à l’utilisateur connecté et non à root ?

Il va falloir faire un script un peu plus complexe en effet.

Ce que je te propose pour ne pas avoir de problème de sécurité, c’est d’avoir 2 scripts :
1 - /usr/local/bin/transfertPOL.sh avec aucun droit en écriture pour l’utilisateur

#!/bin/bash #transfert de POL au démarrage de la session groupe=$(id -gn $1) uid=$(id -u $1) POL=/var/POL home=$(eval echo ~$1) lien=$home/.PlayOnLinux #changement de propriétaire du dossier sudo chown -h -R $1:$groupe $POL ln -s $POL $lien ./ChownSec.sh $1 $groupe $lien #Copie des raccourcis sur le Bureau cp --preserve=ownership $POL/shorcuts/*.desktop $home/Desktop

2- /usr/local/bin/ChownSec.sh avec le droit SetUid et aucun droit en écriture pour l’utilisateur

# On vérifie que l'appel est bien fait par le script if `ps u -p $$ | grep $$ | tr -s " " | cut -d " " -f 11` = "/usr/local/bin/transfertPOL.sh" then chown -h -R $1:$2 $2 fi

J’ai pas tester le code, mais cela devrais le faire.

Un dernier truc pour ta commande Exec respect ton shebang (#!/bin/bash) en utilisant plutôt ça :
Exec=bash /usr/local/bin/transfertPOL.sh

Salut à toi,

J’ai fait la modification que tu m’as suggérées, mais le résultat final n’est pas celui voulu, mon dossier /var/POL appartient toujours à root.

Je vais mener plus loin mes investigations, mais j’avoue ne rien comprendre au code que tu m’as fait rajouter. Idem, je vais approfondir ça.

Verifie que tu as bien retiré le droit SetUid sur le script /usr/local/bin/transfertPOL.sh

Pour ce qui est du code en plus je renvoi le chown dans un script dédié avec des droits plus fort, je fait donc une vérification sur l’appelle du script ChownSec.sh, le test permet de savoir si il est bien lancé pas transfertPOL.sh et pas par un utilisateur mal intentionné.

La partie complexe vient du faite de récupérer le nom du binaire qui appelle le script ChownSec.sh
chose que je fait avec ps u -p $$ | grep $$ | tr -s " " | cut -d " " -f 11

En détaille ça donne :

Contient le PID de l’exécutant du script :

Récupère les info lié au PID

Prend juste la ligne avec le PID

Formate la ligne en supprimant les doublons d’espace

Récupère la 11ème colonne de ma ligne, avec espace pour définir un saut de colonne

Et donc si le résultat n’est pas “/usr/local/bin/transfertPOL.sh”, il ne joue pas la commande chown.

Merci beaucoup pour ces précisions. J’ai enlevé le SetUid, et le script ne fait pas ce que je souhaite :slight_smile:

Alors voici un petit “ls -alh” du dossier /usr/local/bin :

total 16K
drwxrwsr-x  2 root staff 4,0K avril 22 10:40 .
drwxrwsr-x 10 root staff 4,0K sept. 26  2014 ..
-rwsr-x---  1 root staff  222 avril 22 10:28 ChownSec.sh
-rwxr-xr-x  1 root root   460 avril 22 10:28 transfertPOL.sh

Voici un retour des scripts avec un petit mode verbeux aux chowns.

http://pastebin.com/wxMb2ZZt

Mais je pense que les retours intéressants mais que je n’arrive pas à corriger sont:

p { margin-bottom: 0.25cm; line-height: 120%; }


/usr/local/bin/transfertPOL.sh:

13: /usr/local/bin/transfertPOL.sh: ./ChownSec.sh: not found.

et le fait qu’il ne mette pas le nom de l’USER pour le chown, on a juste un " :c6g1"…

Le script n’est pas lancé depuis le répertoire /usr/local/bin/ d’ou l’erreur. Il faut retirer le lien relatif que j’ai suggéré pour le lancement du ChownSec.sh

Concernant l’utilisateur est t’il dans le groupe staff ?

Si non fait un chmod 755 sur le script ChownSec.sh

Je pense aussi que tu as un soucis avec l’utilisation du $1, cela permet de récupérer une variable passé en argument du script, hors tu n’en passe aucune. Utilise plutôt des commandes du type

  • whoami -> pour récupérer le nom de l’utilisateur lançant le script
  • echo ~ te donne son home
    Et pour le groupe, met la même chose que l’utilisateur

Et puis j’avais pas vu que tu avais 2 chown :confused:

Bref le tout devrais donner ça :

#!/bin/bash
#transfert de POL au démarrage de la session
POL=/var/POL
userme=`whoami`
home=`echo ~`
lien=$home/.PlayOnLinux
#changement de propriétaire du dossier
./ChownSec.sh $userme $userme $POL
ln -s $POL $lien
./ChownSec.sh $userme $userme $lien
#Copie des raccourcis sur le Bureau
cp --preserve=ownership $POL/shorcuts/*.desktop $home/Desktop

Le script ChownSec.sh reste le même

Bonjour

[quote=“vanson, post:10, topic:69268”]…
userme=whoami
home=echo ~

[/quote]

pourquoi ne pas utiliser directement $HOME et $USER ce qui serait bien plus parlant que le whoami et le tilde

Exacte c’est plus simple :slight_smile:

Question de mauvaise habitude que j’ai prise :smile:

Souvent, (enfin, en ce qui me concerne), c’est parce que je suis concentré sur une autre partie du script.

Et puis on voit plus facilement les erreurs des autres que les siennes.

Bon alors, compte tenu de vos remarques, et après de nombreuses tentatives, je ne parviens pas au résultat voulu.
Voici mes droits sur les deux scripts:

 -rwxr-xr-x  1 root staff  224 avril 29 10:45 ChownSec.sh
 -rwxr-xr-x  1 root staff  376 avril 29 10:48 transfertPOL.sh

(j’ai enlevé le SetUid sur le transfertPOL.sh, mais pas plus de succès avec)

Mes deux scripts à l’heure actuelle :
/usr/local/bin/transfertPOL.sh

#!/bin/bash
groupe=$(id -gn $1)
POL=/var/POL
lien=$HOME/.PlayOnLinux
userme=$USER

#changement de propriétaire du dossier de POL
sh /usr/local/bin/ChownSec.sh $userme $userme $POL

ln -s $POL $lien
mkdir $HOME/Bureau/OUAIS
sh /usr/local/bin/ChownSec.sh $userme $userme $lien

#copie des raccourcis sur le Bureau
cp --preserve=ownership $POL/shortcuts/*.desktop $HOME/Bureau

et le deuxième:
/usr/local/bin/ChownSec.sh

 #On vérifie que l'appel est bien fait par le script
if `ps u -p $$ | grep $$ | tr -s " " | cut -d " " -f 11` = "/usr/local/bin/transfertPOL.sh"
    then
        chown -v -h -R $1:$2 $2
        mkdir $HOME/Bureau/OUAIS2
fi

le mkdir me permet de tester le fonctionnement du script.

Lorsque je suis déjà connecté, je lance le script transfertPOL.sh en tant que simple user, et voici mon retour de console.

MaxdeConde@debian:~$ sh /usr/local/bin/transfertPOL.sh 
sh: 0: Can't open =
ln: impossible de créer le lien symbolique « /home/MaxdeConde/.PlayOnLinux/POL »: Permission non accordée
sh: 0: Can't open =
cp: impossible d'évaluer « /var/POL/shortcuts/*.desktop »: Aucun fichier ou dossier de ce type

Le premier mkdir se fait, le deuxième non.

Une idée des soucis ?

Merci pour votre lecture.

Alors j’ai modifié le ChownSec en enlevant le test de script. En passant directement donc le chown.
Le chown est maintenant bien exécuté, mais le retour est sans appel : opération non permise… Donc retour à la case départ…

Salut les gars,

Solution trouvée de l’autre côté, voici le petit lien pour avoir la solution.

https://www.debian-fr.xyz/viewtopic.php?p=3166#p3166

La bonne journée.