Saya perlu ini untuk tes unit. Ada fungsi yang tidak lstat pada path file yang dilewatkan sebagai parameternya. Saya harus memicu jalur kode tempat lstat
gagal (karena cakupan kode harus mencapai 90%)
Tes dapat berjalan hanya di bawah satu pengguna, oleh karena itu saya bertanya-tanya apakah ada file di Ubuntu yang selalu ada, tetapi pengguna normal tidak memiliki akses baca untuk itu, atau ke foldernya. (Jadi lstat
akan gagal kecuali dieksekusi sebagai root.)
File yang tidak ada bukanlah solusi, karena ada jalur kode terpisah untuk itu, yang sudah saya picu.
EDIT: Kurangnya akses baca ke file saja tidak cukup. Dengan itu lstat
masih bisa dieksekusi. Saya dapat memicunya (pada mesin lokal saya, di mana saya memiliki akses root), dengan membuat folder di / root, dan file di dalamnya. Dan pengaturan izin 700 pada folder. Jadi saya mencari file yang ada di folder yang hanya dapat diakses oleh root.
sumber
/etc/shadow
/proc/1/fd/0
harus dilakukan.Jawaban:
Pada sistem Linux modern, Anda harus dapat menggunakan
/proc/1/fdinfo/0
(informasi untuk deskriptor file 1 (stdout) dari proses id 1 (init
di root namespace pid yang seharusnya dijalankan sebagairoot
)).Anda dapat menemukan daftar dengan (sebagai pengguna normal):
(hapus
-type f
jika Anda tidak ingin membatasi file biasa)./var/cache/ldconfig/aux-cache
adalah kandidat potensial lain jika Anda hanya perlu mempertimbangkan sistem Ubuntu. Ini harus bekerja pada kebanyakan sistem GNU seperti/var/cache/ldconfig
yang dibuat read + write + dapat dicari untuk root hanya denganldconfig
perintah yang datang dengan libc GNU.sumber
/proc/1/fdinfo/0
berfungsi di Ubuntu 16.04 dan 18.04, itu lebih dari cukup./proc/1/fdinfo/0
tidak selalu berfungsi dalam wadah (misalnya, wadah Docker), dan sering kali unit test dijalankan dalam wadah seperti itu di CI.Melihat halaman manual lstat (2) Anda bisa mendapatkan beberapa inspirasi pada kasus-kasus yang mungkin membuatnya gagal dengan kesalahan selain ENOENT (file tidak ada.)
Yang paling jelas adalah:
Jadi Anda memerlukan direktori yang tidak dapat Anda cari.
Ya, Anda dapat mencari yang sudah ada di sistem Anda (mungkin
/var/lib/private
jika ada?) Tetapi Anda juga bisa membuatnya sendiri, dengan yang setara dengan:Operasi lstat (2) akan gagal dengan EACCES di sini. (Menghapus semua izin dari direktori memastikan hal itu. Mungkin Anda bahkan tidak terlalu membutuhkannya dan
chmod -x
menghapus izin eksekusi sudah cukup, karena mengeksekusi izin pada direktori diperlukan untuk mengakses file di bawahnya.)Ada cara kreatif lain untuk membuat lstat (2) gagal, melihat halaman manualnya:
Jadi, mencoba mengakses file seperti
/etc/passwd/nonexistent
seharusnya memicu kesalahan ini, yang lagi berbeda dengan ENOENT ("Tidak ada file atau direktori") dan mungkin sesuai dengan kebutuhan Anda.Yang lain adalah:
Tetapi Anda mungkin perlu nama yang sangat panjang untuk yang ini (saya percaya 4.096 byte adalah batas tipikal, tetapi sistem / sistem file Anda mungkin memiliki yang lebih panjang.)
Akhirnya, sulit untuk mengatakan apakah semua ini benar - benar bermanfaat bagi Anda. Anda mengatakan Anda menginginkan sesuatu yang tidak memicu skenario "file tidak ada". Walaupun biasanya itu berarti kesalahan ENOENT, dalam praktiknya banyak pemeriksaan tingkat tinggi hanya akan menafsirkan kesalahan dari lstat (2) sebagai "tidak ada". Sebagai contoh
test -e
atau setara[ -e ...]
dari shell mungkin hanya menafsirkan semua hal di atas sebagai "tidak ada", terutama karena tidak memiliki cara yang baik untuk mengembalikan pesan kesalahan yang berbeda dan tidak mengembalikan kesalahan akan menyiratkan file tersebut ada, yang pasti bukan itu masalahnya.sumber
Anda bisa
find
melakukannya sendiri.Menggunakan
/etc
- direktori file konfigurasi sebagai titik awal:Di sistem saya, ini tidak mengembalikan apa pun.
Anda dapat menjadi kelompok yang tidak terlalu membatasi dan mengizinkan
root
(hanya pengguna yangroot
harus menjadi anggota gruproot
), dan melihat keluar untuk izin440
:Di sistem saya ini mengembalikan:
Edit:
Berdasarkan hasil edit Anda, Anda mencari direktori yang tidak memiliki izin yang memadai bagi pengguna yang meminta untuk mencegah daftar direktori:
di sini saya mencari direktori (
-type d
) yang tidak memiliki bit perm baca-tulis-eksekusi untuk yang lain (o-rwx
) dan dimiliki olehroot:root
.Secara teknis, tidak adanya
x
bit eksekusi ( ) akan mencegah daftar direktori (lstat(2)
) pada direktori.Dalam output saya temukan
/run/systemd/inaccessible/
di sistem berbasis init Systemd saya.Mengenai file dalam
/proc
,/sys
,/dev
:Sistem file ini adalah virtual FS yaitu mereka berada di memori, bukan pada disk
Jika Anda berencana untuk mengandalkan
/proc
, gunakan/proc/1/
yaitu mengandalkan sesuatu di bawah PID 1, bukan PID yang lebih baru untuk memiliki keandalan / konsistensi karena PID (proses) selanjutnya tidak dijamin ada.sumber
find / -type d -perm 0400 -user root
saya telah menemukan direktori/proc/20/map_files/
, jika saya merujuk ke nama file yang dibuat di dalam folder itu, seperti/proc/20/map_files/asdasd
, maka selalu gagal. Apakah folder itu selalu ada di Ubuntu?/proc/1/
mungkin lebih aman, karena init selalu ada. Tapi ituproc
, bukan sistem file biasa, kalau-kalau itu penting./proc/1/fdinfo/0
berfungsi pada Ubuntus modern.-perm o-rwx
seperti-perm 0
, bit semuanya dimulai dengan. Di sini, Anda ingin! -perm -1
.