以下の出力が異なる理由がわかりません。私の理解では、ユーザーを指定しないグループは、現在ログインしているユーザーがメンバーであるすべてのグループを提供します。
jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare
jacob@box:~$ groups jacob
jacob : jacob
また、「現在のプロセスのグループ」(グループのマニュアルページから)とはどういう意味ですか?彼らはどこに設置されていますか?
注:私のディストリビューションはUbuntuです。
次のいずれかになります。
グループは/etc/group
で設定されます。
すべてのプロセスに現在の実際の有効なユーザーIDと実際の有効なグループIDがあるのと同様に、 補足グループのリスト もあります。これらはnumbers(名前ではありません)すべてカーネルによって維持されます。これらは、ユーザーIDと同様に、ログイン時にログインプロセス(またはディスプレイマネージャー)によって設定されます。これらは、ユーザーIDと同様に、サブプロセスによって継承されます。
引数なしでgroups
を実行すると、最終的に getgroups() が呼び出され、カーネルから補足グループリストが取得されます。 (私のLinuxシステムでは、/ usr/bin/groupsは「id-Gn」を実行するシェルスクリプトであり、これによりgetgroups()が呼び出されます。)
groups username
を実行すると、コマンドは、そのユーザーがログインしたときに補足グループがどうなるかを「推測」する必要があります。これは通常、/ etc/groupを読み取るか、NISに話しかけるか、nscdに話しかけるか...まあ、それが機能するかもしれない多くの方法があります。
観察していることは、現在の実際のユーザーIDと/ etc/passwdのエントリに一貫性がないことを発見することに似ています。これは、システムの構成に少し奇妙なことがあることを意味しますが、さらに調査しなければ何を言うのは難しいです。
(備考:groups
コマンドは、まだ便利ですが、ほとんどの場合、 idコマンド に置き換えられています。)
ユーザーには、ログインに使用するファイル/etc/passwd
ファイルで従来定義されているプライマリグループがありますが、現在は他のソースがある可能性があります。彼は、従来はファイル/etc/groups
で指定されていた、セカンダリグループまたは補足グループと呼ばれる追加グループのメンバーである場合もありますが、今日では、追加ソース(NIS、LDAP、SAMBAなど)から取得または暗示されることもあります。 )。
プライマリグループと補足グループはログイン時に定義され、currentのままです。ただし、ユーザーはnewgrp
コマンドを使用して、いつでも現在アクティブなプライマリグループを変更できます。
ログインプロセスにより、プライマリグループと補足グループが設定されます。後者の場合、通常はlibc関数 initgroups を呼び出します。この関数は、補足グループデータのリストをコンパイルし、それを setgroups 関数に渡します。この関数は、処理する。
initgroups
の情報源は次のとおりです。
GNU Cライブラリおよびその他の特定のアプリケーションが、さまざまなカテゴリのネームサービス情報を取得するソースを決定するために使用します。情報の各カテゴリは、データベース名。
groups
コマンドは、グループを現在ユーザーに適用されているとして表示し、リストは現在のプライマリグループに続いて、ログイン時からの補足グループ。ログイン後からのデータのソースへの変更は、表示されるリストに反映されません。
groups username
コマンドは、Linuxにそのユーザーのグループを計算するように要求します。これは、主にファイル/etc/password
と/etc/groups
そして追加のソース。これはシステムファイルの現在の状況を反映し、ログイン時からまだ有効な現在のグループと等しくない場合があります。
groups username
コマンドは、ログインプロセスが補足グループの計算に使用したすべてのソースを使用しない場合、異なる結果をもたらす可能性があります。これは、明らかにあなたの場合に起こったことです。これらのソースは、ログインからアクセスできない場合や、コマンドによって参照されない場合があります。
id username
コマンドを使用すると、より良い結果が得られる場合がありますが、ログインプロセスほど完全であるとは限りません。 id
コマンドは、古いgroups
コマンドよりも新しいものであり、より正確であることが意図されていました。
groups
コマンドは正確で正しい結果を提供しますが、groups username
コマンドに依存して同じことを行うことはできないことを十分に示しています。
groups
コマンドのソースコードを調べずに、Linuxディストリビューションでのgroups username
コマンドの実装は/etc/groups
を分析すると思いますが、あなたの場合は何も含まれていませんが、すべての補足グループの元となった/etc/nsswitch.conf
は使用しないでください。したがって、プライマリグループ名jacob
のみが表示されます。
詳細については、以下を参照してください。