私たちのウェブサイトはActive Directoryを使用しており、多くのグループ名にスペースが含まれています。これにより、目視でも出力を安定的に解析することはできませんgroups
(「London」および「Developers」グループはありますか、それとも「London Developers」グループはありますか?)。
groups
別の区切り文字(改行またはNULが使用)を使用したり、GID別にグループをリストしたりする方法はありません。
一部のグループ名にスペースが含まれている場合は、ユーザーグループのリストを確実に取得する方法はありますか?
私はUbuntu 18.04.3を使用しており、より多くのパッケージをインストールしたりスクリプトを作成したいです!
答え1
groups
nullで区切られた項目のオプションはないようですが、少なくともUbuntu 18.04 1id
のGNU CoreUtils実装ではそうです。
-z, --zero
delimit entries with NUL characters, not whitespace;
例えば
id -Gnz someuser
指定する必要がある補足グループ名の空で区切られたリストsomeuser
- 以下を使用して状況を確認できます。
id -Gnz someuser | xargs -0 printf '%s\n'
1POSIXはこのオプションを必要としないため、移植性はありません。例を見るオープングループ基本仕様
答え2
coreutilsもperlもありませんが、少なくともカンマや括弧を含まない一般的なグループ名を使用するAD管理者がいるシステムでは、次の出力を解析できますid
。
#!/usr/bin/env bash
list_of_groups="$(id | sed 's/^.* groups=//')"
one_group=
while [[ "$list_of_groups" != "$one_group" ]]
do {
one_group="${list_of_groups%%,*}"
list_of_groups="${list_of_groups#*),}"
echo $one_group
} done |
sed -e 's/^[0-9]*(//' -e 's/)$//'
答え3
GNU coreutilsを持たないシステムでは、Perlでも同じことができます。
perl -le 'print((getgrgid $_)[0]) for split " ", $)'
getegid(2)
同様に、getgroups(2)
標準インターフェイスバインディングを提供するすべての言語でgetgrgid(3)
。
getgroups(2)
リスト内のプロセスの有効な gid は返される場合もあり、返されない場合もあります。これはPerlとユーティリティの変数によって処理されます($)
perlgroups
はid
実際の/有効なgidを$(
/前に追加します$)
が、返されたリストから削除しません)。 )getgroups(2)
。