En réponse au commentaire de @Chris qui
Cela ne fonctionne que pour les groupes sans espaces dans les noms !
Je dois mentionner que la solution acceptée par @c4f4t0r et la solution par @bibi fonctionneront dans la plupart des cas. J'utilise Cygwin et le Windows
une partie de l'équation est probablement la raison pour laquelle je rencontre ce problème plus souvent. Pourtant, un groupe pourrait être créé avec des caractères non standard dans Linux normal (je pense), je vais donc donner la solution pour les noms de groupe avec des espaces. Les espaces rendent toujours la vie amusante !
Je vais rapidement donner un exemple où les espaces posent problème. Pour voir les noms de groupe avec des espaces, nous regardons la sortie entière de id
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(Remarque :j'ai rendu la sortie un peu plus agréable à l'œil ici sur StackOverflow.)
De cela, nous voyons que les groupes sont {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
Nous pouvons voir le problème avec la solution acceptée dans ce cas.
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
Quelques groupes voient leurs noms divisés. Pour obtenir la sortie que nous voulons, nous devons utiliser la commande id, qui prend un --zero
( -z
) drapeau. Pour plus de détails sur tous les drapeaux passés à id
, voir ici.
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
Notre approche devra être un peu différente de celles indiquées ci-dessus, mais suivre en grande partie les mêmes principes :
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
La raison pour laquelle nous avons un awk
un peu plus compliqué est qu'il y a toujours un NUL
à la fin , ce que nous ne voulons pas dans ce cas. Le \
me permet de passer à la ligne suivante avec la même commande, ce qui facilite la lecture. La commande est équivalente à :
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
D'après ce que je vois, vous essayez de convertir les groupes de votre utilisateur en un yaml
tableau, essayez d'utiliser :
echo "groups:" ; for i in $(id -Gn myuser);do echo " - $i" ;done
groups:
- users
- lp
- vboxusers
- kvm
Vous pouvez également utiliser :
echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"
groups: [ myuser, lp, vboxusers, kvm ]
en utilisant bash
:
for i in `groups`; do echo $i; done
en utilisant tr
:
groups | tr \ \\n