GNU/Linux >> Belajar Linux >  >> Linux

Temukan File yang Tidak Dapat Dibaca Pengguna?

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.
Terkait:Linux – Diberikan git commit hash, bagaimana cara mengetahui rilis kernel mana yang memuatnya?

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


Linux
  1. Mendapatkan Semua File Yang Telah Dimodifikasi Pada Tanggal Tertentu?

  2. Bisakah Skrip Dapat Dieksekusi Tetapi Tidak Dapat Dibaca?

  3. Temukan File Terbesar Secara Rekursif?

  1. Linux – Bisakah Seorang Pengguna Tunggal Memiliki Banyak File Crontab?

  2. Bagaimana Menemukan Semua File yang Dimiliki oleh Pengguna Tertentu di Unix/Linux?

  3. Bagaimana saya bisa menggunakan xargs untuk menyalin file yang memiliki spasi dan tanda kutip di namanya?

  1. Bisakah read(2) mengembalikan nol saat tidak di EOF?

  2. Mencari file yang TIDAK dimiliki oleh pengguna tertentu

  3. Bagaimana menemukan file teks yang tidak mengandung teks di Linux?