In risposta al commento di @Chris that
Funziona solo per i gruppi senza spazi nei nomi!
Devo menzionare che la soluzione accettata da @ c4f4t0r e la soluzione da @bibi funzioneranno nella maggior parte dei casi. Sto eseguendo Cygwin e Windows
parte dell'equazione è probabilmente il motivo per cui ho riscontrato questo problema più spesso. Tuttavia, un gruppo potrebbe essere creato con caratteri non standard nel normale Linux (credo), quindi fornirò la soluzione per i nomi di gruppo con spazi. Gli spazi rendono sempre la vita divertente!
Darò rapidamente un esempio in cui gli spazi causano un problema. Per vedere i nomi dei gruppi con gli spazi, esaminiamo l'intero output di id
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(Nota:ho reso l'output un po' più gradevole alla vista qui su StackOverflow.)
Da questo, vediamo che i gruppi sono {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
Possiamo vedere il problema con la soluzione accettata in questo caso.
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
Un paio di gruppi si dividono i nomi. Per ottenere l'output che vogliamo, dobbiamo usare il comando id, che accetta un --zero
( -z
) bandiera. Per maggiori dettagli su tutti i flag passati a id
, vedere qui.
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
Il nostro approccio dovrà essere leggermente diverso da quelli indicati sopra, ma seguire molti degli stessi principi:
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
Il motivo per cui abbiamo un awk
leggermente più complicato è che c'è sempre un NUL
finale , che non vogliamo in questo caso. L'\
mi permette di continuare sulla riga successiva con lo stesso comando, rendendo le cose più facili da leggere. Il comando è equivalente a:
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
Da quello che vedo, stai cercando di convertire i gruppi del tuo utente in un yaml
array, prova a usare:
echo "groups:" ; for i in $(id -Gn myuser);do echo " - $i" ;done
groups:
- users
- lp
- vboxusers
- kvm
Puoi usare anche tu:
echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"
groups: [ myuser, lp, vboxusers, kvm ]
utilizzando bash
:
for i in `groups`; do echo $i; done
utilizzando tr
:
groups | tr \ \\n