Als Antwort auf den Kommentar von @Chris, dass
Dies funktioniert nur für Gruppen ohne Leerzeichen im Namen!
Ich sollte erwähnen, dass die akzeptierte Lösung von @c4f4t0r und die Lösung von @bibi in den meisten Fällen funktionieren werden. Ich verwende Cygwin und den Windows
Ein Teil der Gleichung ist wahrscheinlich, warum ich dieses Problem häufiger treffe. Trotzdem könnte eine Gruppe mit nicht standardmäßigen Zeichen in normalem Linux erstellt werden (glaube ich), also gebe ich die Lösung für Gruppennamen mit Leerzeichen. Mit Spaces macht das Leben immer Spaß!
Ich werde schnell ein Beispiel geben, wo Leerzeichen ein Problem verursachen. Um die Gruppennamen mit Leerzeichen zu sehen, sehen wir uns die gesamte Ausgabe von id
an
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(Anmerkung:Ich habe die Ausgabe hier auf StackOverflow etwas ansprechender gestaltet.)
Daraus sehen wir, dass die Gruppen {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
sind
Wir können das Problem mit der akzeptierten Lösung in diesem Fall sehen.
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
Ein paar Gruppen bekommen ihre Namen aufgeteilt. Um die gewünschte Ausgabe zu erhalten, müssen wir den id-Befehl verwenden, der einen --zero
akzeptiert ( -z
) Flagge. Weitere Einzelheiten zu allen an id
übergebenen Flags , siehe hier.
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
Unser Ansatz muss sich etwas von den oben genannten unterscheiden, aber weitgehend denselben Prinzipien folgen:
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
Der Grund dafür, dass wir einen etwas komplizierteren awk
haben ist, dass immer ein NUL
nachgestellt wird , was wir in diesem Fall nicht wollen. Die \
ermöglicht es mir, mit demselben Befehl in der nächsten Zeile fortzufahren, was das Lesen erleichtert. Der Befehl ist äquivalent zu:
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
Soweit ich sehe, versuchen Sie, die Gruppen Ihres Benutzers in einen yaml
umzuwandeln Array, versuchen Sie es mit:
echo "groups:" ; for i in $(id -Gn myuser);do echo " - $i" ;done
groups:
- users
- lp
- vboxusers
- kvm
Sie können auch verwenden:
echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"
groups: [ myuser, lp, vboxusers, kvm ]
mit bash
:
for i in `groups`; do echo $i; done
mit tr
:
groups | tr \ \\n