Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HS] systemd service utilisateur

20 réponses
Avatar
Alexandre Hoïde
--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

_@>

Voici un bidule systemd pour créer un répertoire temporaire à la
connexion utilisateur initiale. C'est ma première incursion dans
systemd : remarques bienvenues (celles concernant le script ou d'autres
manières de faire seront également méditées).

Fichiers :
/usr/local/bin/usertmp
~/.config/systemd/user/usertmp.service

Activation :
$ systemclt --user enable usertmp.service

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU        \ /    |      /
|          -- * --  |     o
| $ who ↲    / \    |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename=usertmp

#!/bin/sh

start() {
tDir=/tmp/${USER}.$$
userLink=/home/${USER}/tmp${USER}
(umask 077 && mkdir ${tDir}) && \
ln -f -s ${tDir} ${userLink} || \
exit 1
}

stop() {
userLink=/home/${USER}/tmp${USER}
tDir=$(readlink ${userLink})
rm -rf ${tDir}
rm -f ${userLink}
}

case $1 in
start|stop) "$1" ;;
esac

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usertmp.service"

[Unit]
Description=Create user tmp dir and symblink in home user

[Service]
Type=oneshot
ExecStart=/usr/local/bin/usertmp start
ExecStop=/usr/local/bin/usertmp stop
RemainAfterExit=yes

[Install]
WantedBy=default.target


--BOKacYhQ+x31HxR3--

10 réponses

1 2
Avatar
Alexandre Hoïde
--vkogqOf2sHV7VnPd
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

On Tue, Oct 20, 2015 at 06:49:51AM +0200, Alexandre Hoïde wrote:
Fichiers :
/usr/local/bin/usertmp
~/.config/systemd/user/usertmp.service

Activation :
$ systemclt --user enable usertmp.service



Modifiés selon mes premières auto-critiques.

Fichiers :
/usr/local/bin/usrtmp
~/.config/systemd/user/usrtmp.service

Activation :
$ systemctl --user usrtmp.service

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------

--vkogqOf2sHV7VnPd
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename=usrtmp

#!/bin/sh

userLink=/home/${USER}/tmpnp

start() {
tempDir=/tmp/${USER}.$$
(umask 077 && mkdir ${tempDir}) &&
ln -f -s ${tempDir} ${userLink} ||
exit 1
}

stop() {
tempDir=$(readlink ${userLink})
rm -rf ${tempDir}
rm -f ${userLink}
}

case $1 in
start|stop) "$1" ;;
esac

--vkogqOf2sHV7VnPd
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usrtmp.service"

[Unit]
Description=Create non persitant $USER /tmp dir and symblink in ~/.

[Service]
Type=oneshot
ExecStart=/usr/local/bin/usrtmp start
ExecStop=/usr/local/bin/usrtmp stop
RemainAfterExit=yes

[Install]
WantedByÞfault.target


--vkogqOf2sHV7VnPd--
Avatar
Alexandre Hoïde
Le « /home/$USER » au lieu de « $HOME » qui ne suscite ni remarques
ni moqueries semblerait indiquer que je monologue. Qu'à cela ne tienne.

Généralisation du bidule à tous les utilisateurs :
$ systemctl --user stop usrtmp.service
$ systemctl --user disable usrtmp.service
$ usrtmpS=~/.config/systemd/user/usrtmp.service
$ chmod 644 $usrtmpS
$ sudo chown root:root $usrtmpS
$ sudo mv $usrtmpS /etc/systemd/user/

Charge à chaque utilisateur de
$ systemctl --user enable usrtmp.service
pour un démarrage automatique à chaque première connexion ou
$ sudo systemctl --user start/stop usrtmp.service
pour une dés/activation à la demande.

Encore quelques petits doutes quant à la sécurité du bidule, mais bon,
peut-être que l'autocritique et quelques RTFM en viendront à bout. Sinon
ça marche.

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
Avatar
Charles Plessy
Le Wed, Oct 21, 2015 at 12:58:28AM +0200, Alexandre Hoïde a écrit :

Le « /home/$USER » au lieu de « $HOME » qui ne suscite ni remarques
ni moqueries semblerait indiquer que je monologue. Qu'à cela ne tienne.



Bonjour Alexandre,

de mon côté je tarde à répondre car il me semblait que systemd permettait
d'isoler les utilisateurs les uns des autres (dans des « slices » ?), y compris
au niveau des fichiers temporaires, mais je peine à retrouver où j'aurais pu
lire une chose pareille...

Si ce que j'ai écrit plus haut n'est pas faux, il serait donc plus naturel
de laisser sytemd donner son répertoire temporaire à chacun, et si nécessaire
créer un répertoire temporaire commun via « /etc/tmpfiles.d ».

Librement,

Charles

--
Charles Plessy
Tsurumi, Kanagawa, Japon
Avatar
Alexandre Hoïde
On Wed, Oct 21, 2015 at 03:54:49PM +0900, Charles Plessy wrote:
Le Wed, Oct 21, 2015 at 12:58:28AM +0200, Alexandre Hoïde a écrit :
>
> Le « /home/$USER » au lieu de « $HOME » qui ne suscite ni remarques
> ni moqueries semblerait indiquer que je monologue. Qu'à cela ne tienne.

Bonjour Alexandre,



Salut Charles et merci,


de mon côté je tarde à répondre car il me semblait que systemd permettait
d'isoler les utilisateurs les uns des autres (dans des « slices » ?), y compris
au niveau des fichiers temporaires, mais je peine à retrouver où j'aurais pu
lire une chose pareille...

Si ce que j'ai écrit plus haut n'est pas faux, il serait donc plus naturel
de laisser sytemd donner son répertoire temporaire à chacun, et si nécessaire
créer un répertoire temporaire commun via « /etc/tmpfiles.d ».




Si je comprends bien¹ (mais rien n'est moins sûr), le « contexte »
user.slice est invoqué/utilisé en arrière plan par systemd, pour les
processus utilisateurs (tel que mon usrtmp.service, par exemple).
Mais au niveau où je l'exploite, il me semble que ce devrait être
« transparent ».

Grâce à toi j'ai donc découvert l'existence de [man] systemd-tmpfiles
et tmpfiles.d, dont je ne comprends pas encore la logique et la manière
de l'utiliser pour le substituer à mon usrtmp.service actuel. Je vais
creuser un peu et peut-être qu'une version « pure systemd » suivra.

Accessoirement[trollesquement], plus je découvre systemd, plus
l'impression d'enfermement, d'hégémonie et d'usine à gaz s'installe.
Mais bon, les dev's Debian se sont prononcés. Ainsi soit-il. Peut-être
n'est-ce que par ignorance que la claustro me gagne.

1. http://www.freedesktop.org/software/systemd/man/systemd.special.html

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
Avatar
Alexandre Hoïde
--gBBFr7Ir9EOA20Yy
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

On Wed, Oct 21, 2015 at 06:20:56PM +0200, Alexandre Hoïde wrote:
On Wed, Oct 21, 2015 at 03:54:49PM +0900, Charles Plessy wrote:
> de mon côté je tarde à répondre car il me semblait que systemd permettait
> d'isoler les utilisateurs les uns des autres (dans des « slices » ?), y compris
> au niveau des fichiers temporaires, mais je peine à retrouver où j'aurais pu
> lire une chose pareille...
>
> Si ce que j'ai écrit plus haut n'est pas faux, il serait donc plus naturel
> de laisser sytemd donner son répertoire temporaire à chacun, et si nécessaire
> créer un répertoire temporaire commun via « /etc/tmpfiles.d ».



Voici une petite version pure systemd-tmpfiles, écrite pour me motiver
un peu à lire les docs. Ça n'a probablement pas beaucoup de sens de le
faire ainsi et je n'ai pas trouvé d'autre moyen que d'écrire en dur un
fichier /etc/tmpfiles.d/usrtmp_<user>.conf (pas de substitutions,
variables, …). Je serais curieux de savoir si c'est possible et comment
(en restant pur systemd). Peut-être ne suis-je pas encore tombé sur le
bon bout de doc concernant les slices ^^

Fichier service générique :
/etc/systemd/user/usrtmp.service

Fichier tmpfiles.d pour chaque utilisateur :
/etc/tmpfiles.d/usrtmp_fictif.conf

(Toujours « systemctl --user enable usrtmp.service » pour activer
automatiquement à chaque première connexion)

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------

--gBBFr7Ir9EOA20Yy
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usrtmp.service"

[Unit]
Description=Creates non persitant user /tmp dir and symblinks to ~/tmpnp.

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/systemd-tmpfiles --create /etc/tmpfiles.d/usrtmp_%u.conf
ExecStop=/bin/systemd-tmpfiles --remove /etc/tmpfiles.d/usrtmp_%u.conf

[Install]
WantedByÞfault.target


--gBBFr7Ir9EOA20Yy
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="usrtmp_fictif.conf"

d /tmp/fictif_usrtmp 0700 fictif fictif
L /home/fictif/tmpnp - - - - /tmp/fictif_usrtmp
r /home/fictif/tmpnp
R /tmp/fictif_usrtmp

--gBBFr7Ir9EOA20Yy--
Avatar
S
Le mercredi 21 octobre 2015 à 0:58, Alexandre Hoïde a écrit :
Le « /home/$USER » au lieu de « $HOME » qui ne suscite ni remarques
ni moqueries semblerait indiquer que je monologue. Qu'à cela ne tienne.



Certains monologues sont intéressants et ce n'est pas parce que tu monologues
qu'on ne t'écoute pas…

Sur ce, j'ai une autre réponse à poster dans ton fil.

Sébastien
Avatar
S
Le mercredi 21 octobre 2015 à 18:20, Alexandre Hoïde a écrit :
On Wed, Oct 21, 2015 at 03:54:49PM +0900, Charles Plessy wrote:
> de mon côté je tarde à répondre car il me semblait que systemd permettait
> d'isoler les utilisateurs les uns des autres (dans des « slices » ?), y compris
> au niveau des fichiers temporaires, mais je peine à retrouver où j'aurais pu
> lire une chose pareille...

Si je comprends bien¹ (mais rien n'est moins sûr), le « contexte »
user.slice est invoqué/utilisé en arrière plan par systemd, pour les
processus utilisateurs (tel que mon usrtmp.service, par exemple).
Mais au niveau où je l'exploite, il me semble que ce devrait être
« transparent ».



J'ai compris son fonctionnement comme toi. Je n'ai pas encore lu trop de doc sur
le sujet et ce que j'en ai compris est surtout empirique. Si ton service est
lancé à l'ouverture de session par l'utilisateur (là je suppose puisque je n'ai
pas lu la doc), alors l'isolation a déjà eu lieu et les différentes commandes
lancées se trouvent dans le « slice ».

On voit tout ça à l'œuvre lorsqu'on ouvre une session (graphique ou non), des
messages apparaissent sur les consoles (mais c'est peut-être parce que j'ai
passé Systemd en debug), mais également lorsque des tâches cron sont lancées.

D'ailleurs ce second point me fait penser à un cas que tu devrais vérifier.
Est-ce que ton service utilisateur est lancé également lors du démarrage de
tâches cron d'un des utilisateurs qui l'aurait activé ?

Sébastien
Avatar
Alexandre Hoïde
On Tue, Oct 27, 2015 at 01:19:08PM +0100, Sébastien NOBILI wrote:
Le mercredi 21 octobre 2015 à 18:20, Alexandre Hoïde a écrit :
> On Wed, Oct 21, 2015 at 03:54:49PM +0900, Charles Plessy wrote:
> > de mon côté je tarde à répondre car il me semblait que systemd permettait
> > d'isoler les utilisateurs les uns des autres (dans des « slices » ?), y compris
> > au niveau des fichiers temporaires, mais je peine à retrouver où j'aurais pu
> > lire une chose pareille...
>
> Si je comprends bien¹ (mais rien n'est moins sûr), le « contexte »
> user.slice est invoqué/utilisé en arrière plan par systemd, pour les
> processus utilisateurs (tel que mon usrtmp.service, par exemple).
> Mais au niveau où je l'exploite, il me semble que ce devrait être
> « transparent ».

J'ai compris son fonctionnement comme toi. Je n'ai pas encore lu trop de doc sur
le sujet et ce que j'en ai compris est surtout empirique. Si ton service est
lancé à l'ouverture de session par l'utilisateur (là je suppose puisque je n'ai
pas lu la doc), alors l'isolation a déjà eu lieu et les différentes commandes
lancées se trouvent dans le « slice ».

On voit tout ça à l'œuvre lorsqu'on ouvre une session (graphique ou non), des
messages apparaissent sur les consoles (mais c'est peut-être parce que j'ai
passé Systemd en debug), mais également lorsque des tâches cron sont lancées.

D'ailleurs ce second point me fait penser à un cas que tu devrais vérifier.
Est-ce que ton service utilisateur est lancé également lors du démarrage de
tâches cron d'un des utilisateurs qui l'aurait activé ?




Oui, hé hé : Voilà un empirisme exigeant ! Mon intuition bordélique
me dirait que cron n'est pas exécuté avec l'identité des contrab's des
utilisateurs [et donc, logind ne verrait pas de connexion qui déclencherait
le default.target de l'utilisateur]… mais la question valait bien un
test (après avoir « enabled » le usrtmp.service pour l'utilisateur
« fictif » et déconnecté fictif partout) :

$ sudo -u fictif contrab -l
10 18 27 10 * sleep 5 && [ -d /tmp/fictif_usrtmp ] && touch /tmp/test-cron-systemd-oui || touch /tmp/test-cron-systemd-non

et à 18h12 :
$ ls /tmp/test-cron-systemd-*
/tmp/test-cron-systemd-non

et en effet, journalctl ne montre aucun « starting » correspondant (ce
qui ne veut pas encore dire que mon intuition est la bonne… faudrait que
je RTFM cron comme il faut ^^).

C'est sympa d'être venu prêter main forte à Charles pour me
démonologuer. Merci Sébastien.

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
Avatar
Alexandre Hoïde
On Tue, Oct 27, 2015 at 06:27:27PM +0100, Alexandre Hoïde wrote:
$ sudo -u fictif contrab -l
10 18 27 10 * sleep 5 && [ -d /tmp/fictif_usrtmp ] && touch /tmp/test-cron-systemd-oui || touch /tmp/test-cron-systemd-non

et à 18h12 :
$ ls /tmp/test-cron-systemd-*
/tmp/test-cron-systemd-non



note : le même test réalisé avec « $ sudo -u fictif … » ou avec un
changement d'identifiant « su - fictif », depuis mon compte normal, ne
déclenchent pas plus le usrtmp.service que cron. Donc 1) mon intuition ne vaut
pas grand chose, et 2) il faudrait aussi RTFM logind et que sais-je encore.

D'ailleurs, lorsque j'essaie « systemctl --user start usrtmp.service »,
en su ou en sudo, j'obtiens :
Failed to connect to bus: Aucun fichier ou dossier de ce type
je suppose que su/sudo ne passent pas par logind. Ça ne fonctionne qu'à partir
d'une « vraie » connexion depuis la console/tty ou un gestionnaire d'affichage.

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
Avatar
Alexandre Hoïde
On Wed, Oct 28, 2015 at 02:55:58AM +0100, Alexandre Hoïde wrote:
note : le même test réalisé avec « $ sudo -u fictif … » ou avec un
changement d'identifiant « su - fictif », depuis mon compte normal, ne
déclenchent pas plus le usrtmp.service que cron. Donc 1) mon intuition ne vaut
pas grand chose, et 2) il faudrait aussi RTFM logind et que sais-je encore.

D'ailleurs, lorsque j'essaie « systemctl --user start usrtmp.service »,
en su ou en sudo, j'obtiens :
Failed to connect to bus: Aucun fichier ou dossier de ce type
je suppose que su/sudo ne passent pas par logind. Ça ne fonctionne qu'à partir
d'une « vraie » connexion depuis la console/tty ou un gestionnaire d'affichage.



note 2 : installation du paquet « systemd-container ». Utilisation de
la commande « $ machinectl login » pour connecter mon utilisateur
« fictif » à partir de mon compte normal, et là, miracle! les commandes
systemctl fonctionnent.

[… je dis miracle, mais il commence à me les briser un peu le machin
de Lennart. À quand le s/GNU/LENNART/Linux ? Bon, restons positif et
continuons *burp* la découverte ]

--
 ___________________
| $ post_tenebras ↲ |       waouh !
| GNU         /    |      /
|          -- * --  |     o
| $ who ↲    /     |_-- ~_|
| Alexandre Hoïde   |  _/| |
 -------------------
1 2