Saya ingin mencari file yang tidak dapat dibaca pengguna tertentu.
Asumsikan nama pengguna adalah "user123" dan mereka berada dalam grup yang disebut "user123". Saya ingin mencari file itu, jika mereka dimiliki oleh user123 memiliki u + r aktif; gagal bahwa jika file tersebut adalah grup user123 itu seharusnya memiliki g + r aktif; gagal karena dapat mengaktifkannya.
Karena GNU find memiliki "-baca", saya bisa melakukan ini:
sudo -u user123 find /start ! -readable -ls
Namun proses tersebut harus dijalankan oleh pengguna yang tidak memiliki akses sudo. Oleh karena itu saya mencoba ini: (tidak memeriksa o tapi r tapi itu tidak penting pada saat ini)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
tetapi daftar 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 tidak g=r
aktif. Seolah menemukan menafsirkan -u=r
sebagai -g=r
.
Saya memutuskan untuk mencoba membalikkan logika dan sebagai gantinya menguji not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
Itu bekerja!
Mengapa yang asli find
gagal? Apakah itu bug di find
(tidak mungkin) atau apakah logikanya salah?
Pembaruan: Logika saya salah. Seperti yang ditunjukkan di bawah, sejak! (A || B || C) == (! A &&! B &&! C) ini adalah dua pernyataan yang ekuivalen:
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 terjadi jika ada operator -xor. Saya dapat membangun xor dari dan / atau / tidak tetapi itu akan lebih kompleks daripada dua solusi di atas.
puppet
memiliki akses ke file dengan--wxrwxrwx puppet puppet
.Jawaban:
Logikanya salah. Anda berpikir file ini seharusnya tidak terdaftar karena dimiliki oleh
user123
dan memilikir
bit set pengguna. Namun, ini terdaftar karena cocok dengan kriteria kedua (dimiliki oleh grupuser123
danr
sedikit tidak disetel).Versi kedua Anda berfungsi karena salah satu hukum de Morgan : meniadakan logika ORing dari sekelompok pernyataan secara logika setara dengan ANDing negasi dari masing-masing pernyataan. Dengan kata lain:
Jadi pengerjaannya
find
sedang mencari file ituuser123
dan dapat dibaca oleh pengguna tersebut) DANuser123
dan dapat dibaca oleh grup tersebut) DANsedangkan yang pertama
find
mencari file ituuser123
dan tidak dapat dibaca oleh pengguna tersebut ATAUuser123
dan tidak dapat dibaca oleh grup tersebut ATAU (jika Anda telah menyelesaikannya)Jadi file yang cocok dengan salah satu dari 3 kriteria di atas (dan belum tentu semua) akan terdaftar seperti yang Anda lihat.
Edit
Kebetulan (setelah melihat profil Anda), saya penggemar buku O'Reilly Anda :)
sumber
( !A && !B && !C )
tetapi saya pindah!
ke bagian dalam setiap bagian, yang tidak valid. Terima kasih!Ada banyak hal lain yang perlu dipertimbangkan untuk memeriksa apakah pengguna memiliki akses ke file melalui jalur yang diberikan:
Singkat dari benar-benar beralih semua uids dan gids ke pengguna dan periksa, sangat sulit untuk menerapkan logika yang sama dengan apa yang dilakukan sistem.
Dengan zsh, Anda dapat melakukan (sebagai root):
Atau dengan
perl
:Itu dalam kedua kasus, turun pohon direktori sebagai
root
tetapi uji untuk akses file sebagai pengguna yang sesuai.Berjalan
find -readable
sepertisome-user
tidak dalam kasus karena tidak akan dapat melewati direktori yang pengguna tidak memiliki akses atau tidak memiliki izin baca (tetapi mungkin mengakses).Bahkan ketika hanya mempertimbangkan izin dan kepemilikan file itu sendiri (dan bukan ACL atau komponen path ...), Anda memerlukan setidaknya (di sini sintaksis GNU):
Gagasannya adalah bahwa jika file tersebut dimiliki oleh pengguna, semua izin lainnya tidak relevan. Jika tidak, maka jika file tersebut milik grup oleh salah satu grup pengguna, maka izin "lain" tidak relevan.
sumber
access()
karena menggunakan kode kernel yang sama denganopen()
. Dengan demikiansudo -u user123 find /start -readable
adalah solusi terbaik jikasudo
merupakan opsi.sudo -u user123 find -readable
, itu tidak akan melaporkan file dalam direktori yang tidak dapat Anda masukkan, atau dalam direktori Anda tidak dapat membaca (jadi akan ada negatif palsu dan positif palsu). Itu sebabnya saya sarankan menggunakanzsh
untuk turun pohon direktori sebagai root dan doaccess()
([ -r ... ]
) sebagai pengguna yang sebenarnya (pengaturan$USERNAME
dalamzsh
mengubah semua uids dan gids sepertisudo
mau).