Lancer une commande sous un groupe différent

Lorsque vous lancez une commande sous GNU/Linux, l’uid correspond à votre uid (jusque là, normal), par contre le gid correspond à l’identifiant de votre groupe primaire:

$ id
uid=1000(tuxce) gid=1000(tuxce) groupes=10(wheel),19(log),90(network),91(video),92(audio),93(optical),100(users),1000(tuxce)

Ici, ca sera 1000(tuxce).
Or il arrive parfois qu’on ait besoin de lancer certaines commandes avec un autre identifiant de groupe.
Pour cela, on peut utiliser la commande newgrp qui ouvre un nouveau
shell avec comme groupe primaire celui passé en argument:

$ newgrp network
$ id
id=1000(tuxce) gid=90(network) groupes=10(wheel),19(log),90(network),91(video),92(audio),93(optical),100(users),1000(tuxce)

On peut s’arrêter là, mais un souci persiste… Dans un script, newgrp ne rend pas la main car elle exécute un nouveau shell!
Pour palier à cela, on peut utiliser la commande sg (qui est en fait un lien vers newgrp):

$ id
uid=1000(tuxce) gid=1000(tuxce) groupes=10(wheel),19(log),90(network),91(video),92(audio),93(optical),100(users),1000(tuxce)
$ sg network id
id=1000(tuxce) gid=90(network) groupes=10(wheel),19(log),90(network),91(video),92(audio),93(optical),100(users),1000(tuxce)

Précision: sg ne prend qu’un seul argument comme commande, il faut donc entourer la commande plus ses arguments entre ‘ ‘:

$ sg network 'qemu -kernel-kqemu disque_qemu.img -net nic -net tap,ifname=tap0,script=no -m 256'