特定のユーザーが読み取れないファイルを見つけたい。
ユーザー名が「user123」であり、「user123」というグループに属していると想定します。 user123が所有している場合、u+rがオンになっているファイルを見つけたい。ファイルがグループuser123の場合、g+rをオンにする必要があります。 o+rをオンにできることに失敗しました。
GNU findには「読み取り可能」があるので、これを行うことができます:
sudo -u user123 find /start ! -readable -ls
ただし、プロセスはsudoアクセス権を持たないユーザーが実行する必要があります。したがって、私はこれを試しました:( o + rはチェックしませんが、現時点では重要ではありません)
find /start ( -user user123 ! -perm -u=r ) -o ( -group user123 ! -perm -g=r ) -ls
しかし、それはこのファイルをリストします:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
このファイルは、/start
の下にある唯一のファイルです g=r
のuser123が所有しています オフ。これは、findが-u=r
を解釈しているようです。 -g=r
として 。
ロジックを逆にして、代わりにnot ( truth )
をテストすることにしました。 代わりに:
find /etc/puppet ! ( ( -user puppet -perm -u=r ) -o ( -group puppet -perm -g=r ) -o ( -perm -o=r ) ) -ls
それはうまくいきます!
元のfind
を見つけたのはなぜですか 不合格? find
のバグですか (ありそうもない)または論理が間違っていますか?
更新: 論理が間違っていました。以下に指摘するように、
! (A || B || C)==(!A &&!B &&!C)
これらは2つの同等のステートメントです:
find /start ! ( ( -user user123 -perm -u=r ) -o ( -group user123 -perm -g=r ) -o ( ! ( -user user123 -o -group user123 ) -perm -o=r ) ) -ls
find /start ! ( -user user123 -perm -u=r ) ! ( -group user123 -perm -g=r ) ! ( ! ( -user user123 -o -group user123 ) -perm -o=r ) -ls
私の目標は、ユーザー/グループを2回テストする必要がないことでした。私が本当に必要としているのは、より複雑なif-then-else構造です。これは、おそらく-xor演算子が存在する場合にのみ可能です。 xorを構築することはできますが、上記の2つのソリューションよりも複雑になります。
承認された回答:
論理が間違っています。このファイルはuser123
が所有しているため、リストに表示されるべきではないと考えています。 ユーザーのr
があります ビットセット。ただし、2番目の基準(グループuser123
が所有)に一致するため、リストされています。 グループのr
があります ビット未設定)。
2番目のバージョンは、ド・モルガンの法則の1つが原因で機能します。つまり、ステートメントのグループの論理ORを否定することは、個々のステートメントの否定をANDすることと論理的に同等です。言い換えれば:
! ( A || B || C ) == ( !A && !B && !C )
したがって、機能するfind
- そうではありません(ユーザー
user123
が所有しています およびそのユーザーが読み取り可能)AND - そうではありません(グループ
user123
が所有しています および上記のグループが読み取り可能)AND - 誰でも読めるわけではありません。
最初のfind
- ユーザー
user123
が所有しています 上記のユーザーが読み取れない、または - グループ
user123
が所有しています そして、そのグループによって読めない、または(あなたがそれを完了した場合) - 世界中で読めるわけではありません
したがって、上記の3つの基準のいずれかに一致するファイル(必ずしもすべてではない)が、これまで見てきたようにリストされます。
編集
ちなみに(あなたのプロフィールを見た後)、私はあなたのO’Reillyの本の大ファンです🙂