ユーザー名にスペースが含まれている場合は、ユーザーグループをどのようにリストしますか?

ユーザー名にスペースが含まれている場合は、ユーザーグループをどのようにリストしますか?

私たちのウェブサイトはActive Directoryを使用しており、多くのグループ名にスペースが含まれています。これにより、目視でも出力を安定的に解析することはできませんgroups(「London」および「Developers」グループはありますか、それとも「London Developers」グループはありますか?)。

groups別の区切り文字(改行またはNULが使用)を使用したり、GID別にグループをリストしたりする方法はありません。

一部のグループ名にスペースが含まれている場合は、ユーザーグループのリストを確実に取得する方法はありますか?

私はUbuntu 18.04.3を使用しており、より多くのパッケージをインストールしたりスクリプトを作成したいです!

答え1

groupsnullで区切られた項目のオプションはないようですが、少なくとも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とユーティリティの変数によって処理されます($)perlgroupsid実際の/有効なgidを$(/前に追加します$)が、返されたリストから削除しません)。 )getgroups(2)

関連情報