位置決めコマンドは出力されません。

位置決めコマンドは出力されません。

Unix関連の質問はすべて、質問と回答形式で公開されていることをよく発見します。しかし、私はこの特別な質問のために私が過去1時間の間私を気にしなかったので、私はこのサイトで最初の質問をしなければならないと思いました。

質問

CentOS 5.11を実行する開発/ステージングサーバーがあります。locate通常のユーザーとして実行すると、出力は生成されません(エラーメッセージも表示されません)。

locate readdir

ただし、スーパーユーザーでコマンドを実行すると、有効な結果のリストが印刷されます。

$ sudo locate readdir
/home/anthony/repos/php-src/TSRM/readdir.h
/home/anthony/repos/php-src/ext/standard/tests/dir/readdir_basic.phpt
... etc.

strace通常、これらの問題をデバッグしてstrace locate readdirショーを実行するのに役立ちます。

stat64("/var/lib/mlocate/mlocate.db", 0xbff65398) = -1 EACCES (Permission denied)
access("/", R_OK|X_OK)                  = -1 EACCES (Permission denied)
exit_group(1)                           = ?

権限の確認

locateバイナリとプライマリデータベースの所有権と権限を確認しました。予想通り、コマンドはグループ所有者setgidとして機能し、データベースには適切な所有権と権限があります。slocate

$ ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 22280 Sep  3  2009 /usr/bin/locate

$ sudo ls -l /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 78395703 May  8 04:02 /var/lib/mlocate/mlocate.db

$ sudo ls -ld /var/lib/mlocate/
drwxr-x--- 2 root slocate 4096 Sep  3  2009 /var/lib/mlocate/

次のうち、珍しいファイル属性はありません。

$ sudo lsattr /usr/bin/locate /var/lib/mlocate/mlocate.db
------------- /usr/bin/locate
------------- /var/lib/mlocate/mlocate.db

作業システムとの比較

その間、本番サーバーのすべてが期待どおりに実行されます。ルートではなく通常のユーザーとして実行すると、locate readdir期待される結果のリストが返されます。

$ locate readdir
/usr/include/php/TSRM/readdir.h
/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/POSIX/readdir.al
/usr/share/man/man2/readdir.2.gz

比較のためにこのコマンドも実行しましたが、straceステージングサーバーと同じ権限拒否エラーが発生しました。を読むまで何が起こっているのか疑問に思いましたsudo昆虫部分:

setuidビットを使用するプログラムは、トレース時に有効なユーザーID権限を持っていません。

だから残念ながら、デバッグには使用できませんstrace

上記のすべてのコマンドの結果をステージングサーバーと本番サーバーで比較してみましたが、2つの間に違いはありません。どちらのシステムも、mlocate-0.15-1.el5.2図のようにファイルを変更せずにRPMを持ちますrpm -V mlocate

その他の考慮事項

問題のステージングサーバーでは、私のログインはWinbindを使用して認証されていますが、同じボックスに一般的なローカルユーザーを作成しましたが、まだ同じ問題があるという事実に関連していると思います。明らかに他のものが欠けているようですが、それが何であるかは全くわかりません。

私はこれがsetgidファイル権限、おそらくPAM、おそらくSELinuxに関連していると思います。私はPAMやSELinuxについてはよくわかりません。 Winbind認証を設定するとPAMのみが表示され、SELinuxはオペレーティングシステムと共にインストールされますが、使用したことはありません。

注:いくつかの実験では、本番サーバーは開発サーバーよりも多くの修正があります。

ベストアンサー1

問題は/(ルートディレクトリの)権限であり、手がかりは出力の次の行ですstrace

access("/", R_OK|X_OK)                  = -1 EACCES (Permission denied)

グループ読み取り権限設定がありません/。ただし、xディレクトリを参照する(実行)権限がまだあるため、ファイルシステム内のすべてのファイルにアクセスできます。これがまさにこれらの権限が適用されている間、ほとんどのタスクが機能し続ける理由です。あなたができない唯一のことはリストされていることです/。ほとんどのコマンドはlistを必要とせず、/現在のディレクトリに相対的なパス名を使用するか、ルートディレクトリ以外のよく知られている特定のディレクトリ(および/etc/varにアクセスする絶対パス名を使用します。

セキュリティ上の理由から、locate権限のあるユーザーが生成したファイル名の完全なリストにアクセスできますが、呼び出し側のユーザーがルートからファイルシステム全体を検索して検索できる結果のみを報告する必要があると主張します。を一覧表示できないため、/ルートから直接何も検索できないため、locate何も報告されません。

おすすめ記事