V reakci na komentář @Chris that
Toto funguje pouze pro skupiny bez mezer v názvech!
Měl bych zmínit, že přijaté řešení od @c4f4t0r a řešení od @bibi bude ve většině případů fungovat. Používám Cygwin a Windows
součástí rovnice je pravděpodobně důvod, proč jsem na tento problém narážel častěji. Přesto by skupina mohla být vytvořena s nestandardními znaky v normálním Linuxu (myslím), takže uvedu řešení pro názvy skupin s mezerami. Prostory vždy dělají život zábavou!
Rychle uvedu příklad, kdy mezery způsobují problém. Abychom viděli názvy skupin s mezerami, podíváme se na celý výstup id
$ id
uid=1(me) gid=545(Users)
groups=545(Users),66049(CONSOLE LOGON),11(Authenticated Users),
4095(CurrentSession),66048(LOCAL)
(Poznámka:Zde na StackOverflow jsem udělal výstup trochu příjemnějšímu pro oko.)
Z toho vidíme, že skupiny jsou {'Users', 'CONSOLE LOGON', 'Authenticated Users', 'CurrentSession', 'LOCAL'}
V tomto případě vidíme problém s přijatým řešením.
$ echo "groups:" ; for i in $(id -Gn);do echo " - $i" ;done
groups:
- Users
- CONSOLE
- LOGON
- Authenticated
- Users
- CurrentSession
- LOCAL
Několik skupin si rozdělí jména. Abychom získali požadovaný výstup, musíme použít příkaz id, který má --zero
( -z
) vlajka. Další podrobnosti o všech příznacích předaných do id
, viz zde.
$ man id | grep -A 1 "\-\-zero"
-z, --zero
delimit entries with NUL characters, not whitespace;
Náš přístup se bude muset trochu lišit od těch, které jsou uvedeny výše, ale řídit se mnoha stejnými zásadami:
$ echo "groups:"; printf "%s" " - "; id -Gnz | \
awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
groups:
- Users
- CONSOLE LOGON
- Authenticated Users
- CurrentSession
- LOCAL
Důvod, proč máme trochu komplikovanější awk
je, že vždy je na konci NUL
, což v tomto případě nechceme. \
umožňuje mi pokračovat na další řádek se stejným příkazem, což usnadňuje čtení. Příkaz je ekvivalentní:
$ echo "groups:"; printf "%s" " - "; id -Gnz | awk 'BEGIN{FS="\0"; OFS="\n - "}{NF--; print}'
Z toho, co vidím, se snažíte převést skupiny svého uživatele na yaml
pole, zkuste použít:
echo "groups:" ; for i in $(id -Gn myuser);do echo " - $i" ;done
groups:
- users
- lp
- vboxusers
- kvm
Můžete také použít:
echo "groups: [ $(groups myuser | sed -e 's/.\+\s\+:\s\+\(.\+\)/\1/g' -e 's/\(\s\+\)/, /g') ]"
groups: [ myuser, lp, vboxusers, kvm ]
pomocí bash
:
for i in `groups`; do echo $i; done
pomocí tr
:
groups | tr \ \\n