Saya ingin menemukan file yang tidak dapat dibaca oleh pengguna tertentu.
Asumsikan nama pengguna adalah "user123" dan mereka berada dalam grup yang disebut "user123". Saya ingin menemukan file yang, jika dimiliki oleh user123, memiliki u+r; gagal jika file tersebut adalah grup user123, seharusnya g+r aktif; gagal sehingga dapat mengaktifkan o+r.
Karena GNU find memiliki “-readable”, saya dapat melakukan ini:
sudo -u user123 find /start ! -readable -ls
Namun proses harus dijalankan oleh pengguna yang tidak memiliki akses sudo. Oleh karena itu saya mencoba ini:(tidak memeriksa o+r tetapi itu tidak penting pada saat ini)
find /start ( -user user123 ! -perm -u=r ) -o ( -group user123 ! -perm -g=r ) -ls
tetapi ini mencantumkan file ini:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
File ini adalah satu-satunya file di bawah /start
yang dimiliki oleh user123 dengan g=r
mati. Seolah-olah find menafsirkan -u=r
sebagai -g=r
.
Saya memutuskan untuk mencoba membalikkan logika dan sebagai gantinya menguji not ( truth )
sebagai gantinya:
find /etc/puppet ! ( ( -user puppet -perm -u=r ) -o ( -group puppet -perm -g=r ) -o ( -perm -o=r ) ) -ls
Itu berhasil!
Mengapa find
yang asli? gagal? Apakah ini bug di find
(tidak mungkin) atau logikanya salah?
Pembaruan: Saya salah logika. Seperti yang ditunjukkan di bawah ini, karena
! ( A || B || C ) ==( !A &&!B &&!C )
ini adalah dua pernyataan yang setara:
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
Tujuan saya adalah tidak harus menguji pengguna/grup dua kali. Yang benar-benar saya butuhkan adalah struktur if-then-else yang lebih rumit, yang mungkin hanya mungkin jika ada operator -xor. Saya dapat membuat xor dari dan/atau/tidak tetapi akan lebih kompleks daripada dua solusi di atas.
Jawaban yang Diterima:
Logikanya salah. Menurut Anda, file ini seharusnya tidak dicantumkan karena dimiliki oleh user123
dan memiliki r
. pengguna sedikit diatur. Namun, terdaftar karena cocok dengan kriteria kedua (dimiliki oleh grup user123
dan memiliki r
. grup sedikit tidak disetel).
Versi kedua Anda berfungsi karena salah satu hukum de Morgan:meniadakan logika ORing sekelompok pernyataan secara logis setara dengan ANDing negasi pernyataan individual. Dengan kata lain:
! ( A || B || C ) == ( !A && !B && !C )
Jadi find
yang berfungsi sedang mencari file yang
- Bukan (dimiliki oleh pengguna
user123
dan dapat dibaca oleh pengguna tersebut) DAN - Bukan (dimiliki oleh grup
user123
dan dapat dibaca oleh grup tersebut) DAN - Tidak dapat dibaca dunia.
sedangkan yang pertama find
sedang mencari file yang
- Dimiliki oleh pengguna
user123
dan tidak dapat dibaca oleh pengguna tersebut ATAU - Dimiliki oleh grup
user123
dan tidak dapat dibaca oleh grup tersebut ATAU (jika Anda telah menyelesaikannya) - Tidak dapat dibaca dunia
Jadi file yang cocok dengan APA PUN dari 3 kriteria di atas (dan belum tentu semua) akan terdaftar seperti yang Anda lihat.
Sunting
Kebetulan (setelah melihat profil Anda), saya penggemar berat buku O'Reilly Anda