特定のユーザーが読み取ることができないファイルを見つけたいのですが。
ユーザー名が「user123」であり、「user123」というグループに属しているとします。user123が所有している場合にu + rがオンになっているファイルを見つけたい。ファイルがグループuser123の場合、g + rがオンになっている必要があります。o + rをオンにすることができないことに失敗しました。
GNU findには「読み取り可能」なので、これを行うことができます。
sudo -u user123 find /start ! -readable -ls
ただし、このプロセスは、sudoアクセス権のないユーザーが実行する必要があります。したがって、IIはこれを試しました(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
user123が所有する、g=r
off の唯一のファイルです。findが-u=r
asを解釈しているかのよう-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を使ってxorを構築できますが、上記の2つのソリューションよりも複雑になります。
puppet
ファイルにアクセスできると言うので、2番目のロジックも間違っています--wxrwxrwx puppet puppet
。