GNU/Linux >> Linux の 問題 >  >> Linux

常に存在し、「通常の」ユーザーが lstat できないファイルはありますか?

最新の Linux システムでは、 /proc/1/fdinfo/0 を使用できるはずです (id 1 (init) のプロセスのファイル記述子 1 (stdout) の情報 root として実行されているルート pid 名前空間で )).

(通常のユーザーとして) リストを見つけることができます:

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

(-type f を削除 通常のファイルに制限したくない場合)。

/var/cache/ldconfig/aux-cache Ubuntu システムのみを検討する必要がある場合は、もう 1 つの潜在的な候補です。 /var/cache/ldconfig として、ほとんどの GNU システムで動作するはずです。 ldconfig によってのみルートに対して読み取り+書き込み+検索可能に作成されます コマンドは GNU libc に付属しています。


lstat(2) の man ページを見ると、ENOENT (ファイルが存在しない) 以外のエラーで失敗する可能性があるケースについてヒントを得ることができます。

最も明白なものは次のとおりです:

<ブロック引用>

EACCES path のパス プレフィックスのディレクトリの 1 つに対する検索権限が拒否されました .

そのため、検索できないディレクトリが必要です。

はい、システムに既にあるものを探すことができます (おそらく /var/lib/private 存在する場合は?) しかし、同等のものを自分で作成することもできます:

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

ここで、lstat(2) 操作は EACCES で失敗します。 (ディレクトリからすべての権限を削除すると、それが保証されます。おそらく、それほど多くは必要なく、 chmod -x ディレクトリの下のファイルにアクセスするには、ディレクトリに対する実行権限が必要なので、実行権限を削除するだけで十分です。)

lstat(2) を失敗させる別の独創的な方法があり、man ページを参照してください:

<ブロック引用>

ENOTDIR path のパス プレフィックスのコンポーネント ディレクトリではありません。

/etc/passwd/nonexistent のようなファイルにアクセスしようとしています。 これも ENOENT (「そのようなファイルまたはディレクトリはありません」) とは異なり、ニーズに合っている可能性があります。

もう 1 つは:

<ブロック引用>

エナメトゥーロン パス は長すぎます。

ただし、これには非常に長い名前が必要になる場合があります (一般的な制限は 4,096 バイトだと思いますが、システム/ファイルシステムにはもっと長い名前があるかもしれません)。

最後に、これらのいずれかが実際になるかどうかを判断するのは困難です あなたに役立ちます。 「ファイルが存在しない」シナリオをトリガーしないものが欲しいと言います。通常、これは ENOENT エラーを意味しますが、実際には、多くの高レベルのチェックは、lstat(2) からのエラーを単純に「存在しない」と解釈します。例:test -e または同等の [ -e ...] 特に、別のエラーメッセージを返す良い方法がなく、エラーを返さないとファイルが存在することを意味するため、上記のすべてを単に「存在しない」と解釈するだけかもしれません。


findできます

/etc の使用 -- 開始点としての構成ファイル ディレクトリ:

sudo find /etc -type f -perm 0400 -user root

私のシステムでは、これは何も返しません。

制限を緩和して、グループ root を許可できます (ユーザー root のみ グループ root のメンバーである必要があります )、および 440 の許可に注意してください :

sudo find /etc -perm 0440 -user root -group root

私のシステムでは、これが返されます:

/etc/sudoers.d/README
/etc/sudoers

編集:

あなたの編集に基づいて、呼び出し元のユーザーがディレクトリのリストを防ぐのに十分な権限を持っていないディレクトリを探しています:

sudo find / -perm o-rwx -type d -user root -group root 

ここでディレクトリを探しています (-type d ) 他のもの (o-rwx) の read-write-execute perm ビットを欠いている ) であり、root:root が所有しています .

技術的には、実行がないだけです (x ) ビットは、ディレクトリの一覧表示を妨げます (lstat(2) ) ディレクトリに

出力で /run/systemd/inaccessible/ を見つけました Systemd init ベースのシステムで。

/procのファイルについて 、 /sys/dev :

  • これらのファイルシステムは仮想 FS です。つまり、ディスクではなくメモリ上に存在します

  • /proc に依存する場合 、 /proc/1/ を使用 つまり、後の PID (プロセス) が存在することが保証されていないため、後の PID ではなく、PID 1 の下にあるものに依存して信頼性/一貫性を確保します。


Linux
  1. Linux でファイルとディレクトリのアクセス許可/所有権を管理する方法

  2. ファイルの存在を確認し、存在しない場合はコマンドを実行するにはどうすればよいですか?

  3. すでに存在し、何らかの形で保護されているLinux上のファイルを空にする(切り捨てる)方法は?

  1. ディレクトリが存在するかどうかを確認するにはどうすればよいですか?

  2. Unix でディレクトリを削除できない

  3. Linuxコマンドラインのどこにでもある可能性のあるファイル/ディレクトリを見つけるにはどうすればよいですか?

  1. Sudoユーザーとrootユーザーの違いは?

  2. MP3 ファイルの不具合を検出 (可能であれば修正) できるツールはありますか?

  3. このファイルを root として削除できないのはなぜですか?