UIDとGIDを理解してください。
さまざまなオンライン読書を通じて私のUIDがに保存されていると信じていますが/etc/passwd
、私が作業しているサーバーではそうではありません。
$ whoami
user1
$ cat /etc/passwd | grep user1
$
/etc/passwd
私のUIDを含めることができるこのファイル以外に他のファイルはありますか?
(どこかにUIDを含むファイルがあるため、UIDがGIDに似ているとします。そのファイルで興味のあるGIDを見つけました/etc/group
。)
コマンドを使用してUIDを取得できることを知っていますが、id -u
この質問については特にUIDがあるかどうかを知りたいです。文書それを含んでいます。
ベストアンサー1
「は」/etc/passwd
ユーザーアカウントデータベースを保存して照会するいくつかの方法の1つです。
多くのUnixシリーズシステムでは、ネームサービススイッチ(元のSolarisでは)さまざまな方法でいくつかのシステム名をIDに変換することを担当します。
その構成は通常/etc/nsswitch.conf
。
ここでは、多くのデータベースのエントリとそのデータベースの処理方法(グループ、パスワード、サービス、ホスト、ネットワーク...)を見つけることができます。hosts
ホスト名をネットワークプロトコルアドレスに変換するために使用されるデータベースの場合/etc/hosts
。
プロセスがユーザー名に関する情報を要求するとき(標準機能を使用するなど)、エントリを見つけるためにgetpwnam()
使用する方法をこのファイルで見つけます。passwd
これがメソッドであればfiles
照会され/etc/<db>
ます。 GNUシステムでは、通常、/lib/<system>/libnss_files.so.<version>
動的にロードされるいくつかのモジュールによってこれが行われます。
ただし、NIS+、LDAP、SQLなど、より多くのものを持つこともできます。これらの方法のいくつかはGNU libcに含まれており、いくつかは別々にインストールできます。 Debian または派生製品では、apt-cache search 'NSS module'
例の出力を参照してください。
ユーザーデータベースが集中化されたエンタープライズ環境で最も広く使用されている中央データベースはNISで、その後はNIS +であり、現在はLDAPまたはMicrosoftのActive Directory(またはUnixレプリカ)です。
存在する場合は、get{pw/host/grp}...()
GNU libcの関数もクエリします。ネームサービスキャッシュデーモン/run/nscd/socket
完全なNSSスタックを呼び出し、バックエンドデータベースを直接クエリする代わりに。その後、nscd
将来のクエリを高速化するために、キャッシュによってクエリが完了します。一部のNSSモジュールは独自にキャッシュすることもできます。
GNU/Linux システムで広く使用されているアプローチは、以下を使用することです。システムセキュリティサービス(sss
)。sssd
要求を処理し、それを他のデータベース(LDAP / ADなど)に転送すると同時に、一部のキャッシュも実行する別のデーモン()が付属しています。その後、ほとんどのDBで動作する方法が/etc/nsswitch.conf
あり、sss
バックエンドはsssd
構成で構成されます。sssd
この場合、PAM(認証担当)は通常クエリを実行します。
これは通常、コマンドラインクエリ/etc/passwd
(または/etc/group
... /etc/hosts
)からアカウント(またはグループ/ホスト...)情報を取得するのが間違った理由を明確にするのに役立ちます。ほとんどの最新システムには、getent
コマンドの代わりに(Solarisでも)コマンドがあるか、より便利にはperl
すべての標準機能にアクセスするために使用できるインターフェースがありますget<db>*()
。
$ getent passwd bin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
$ perl -le 'print for getpwnam("bin")'
bin
x
2
2
bin
/bin
/usr/sbin/nologin
$ getent services domain
domain 53/tcp
$ perl -le 'print for getservbyname("domain", "tcp")'
domain
53
tcp
$ perl -le 'print for getservbyname("domain", "udp")'
domain
53
udp