GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada file yang selalu ada dan pengguna 'normal' tidak dapat mengaktifkannya?

Pada sistem Linux modern, Anda seharusnya dapat menggunakan /proc/1/fdinfo/0 (informasi untuk deskriptor file 1 (stdout) dari proses id 1 (init di root pid namespace yang harus dijalankan sebagai root )).

Anda dapat menemukan daftar dengan (sebagai pengguna biasa):

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

(hapus -type f jika Anda tidak ingin membatasi ke file biasa).

/var/cache/ldconfig/aux-cache adalah kandidat potensial lainnya jika Anda hanya perlu mempertimbangkan sistem Ubuntu. Ini harus bekerja pada sebagian besar sistem GNU sebagai /var/cache/ldconfig dibuat read+write+searchable ke root hanya dengan ldconfig perintah yang disertakan dengan libc GNU.


Melihat halaman manual lstat(2) Anda bisa mendapatkan beberapa inspirasi pada kasus yang mungkin membuatnya gagal dengan kesalahan selain ENOENT (file tidak ada.)

Yang paling jelas adalah:

EACCES Izin penelusuran ditolak untuk salah satu direktori di awalan jalur jalur .

Jadi, Anda memerlukan direktori tempat Anda tidak dapat menelusuri.

Ya, Anda dapat mencari yang sudah ada di sistem Anda (mungkin /var/lib/private jika ada?) Tetapi Anda sebaiknya membuatnya sendiri, dengan persamaan:

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

Operasi lstat(2) akan gagal dengan EACCES di sini. (Menghapus semua izin dari direktori memastikan hal itu. Mungkin Anda bahkan tidak membutuhkan sebanyak itu dan chmod -x menghapus izin eksekusi sudah cukup, karena izin eksekusi pada direktori diperlukan untuk mengakses file di bawahnya.)

Ada cara kreatif lain untuk membuat lstat(2) gagal, dengan melihat halaman manualnya:

ENOTDIR Komponen awalan jalur dari path bukan direktori.

Jadi, coba akses file seperti /etc/passwd/nonexistent harus memicu kesalahan ini, yang sekali lagi berbeda dari ENOENT ("Tidak ada file atau direktori") dan mungkin sesuai dengan kebutuhan Anda.

Satu lagi adalah:

ENAMETOOLONG jalur terlalu panjang.

Namun Anda mungkin memerlukan nama yang sangat panjang untuk nama ini (saya yakin 4.096 byte adalah batas umum, tetapi sistem/sistem file Anda mungkin memiliki nama yang lebih panjang.)

Akhirnya, sulit untuk mengatakan apakah salah satu dari ini akan sebenarnya berguna untuk Anda. Anda mengatakan Anda menginginkan sesuatu yang tidak memicu skenario "file tidak ada". Meskipun biasanya itu berarti kesalahan ENOENT, dalam praktiknya banyak pemeriksaan tingkat tinggi hanya akan menafsirkan kesalahan apa pun dari lstat(2) sebagai "tidak ada". Misalnya 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 bahwa file tersebut ada, yang pasti tidak kasusnya.


Anda dapat find itu sendiri.

Menggunakan /etc -- direktori file konfigurasi sebagai titik awal:

sudo find /etc -type f -perm 0400 -user root

Di sistem saya, ini tidak mengembalikan apa pun.

Anda dapat menjadi kurang ketat dan mengizinkan grup root (hanya pengguna root harus menjadi anggota grup root ), dan mencari izin 440 :

sudo find /etc -perm 0440 -user root -group root

Di sistem saya ini mengembalikan:

/etc/sudoers.d/README
/etc/sudoers

Edit:

Berdasarkan hasil edit Anda, Anda sedang mencari direktori yang tidak memiliki izin yang memadai bagi pengguna pemanggil untuk mencegah daftar direktori:

sudo find / -perm o-rwx -type d -user root -group root 

di sini saya mencari direktori (-type d ) yang tidak memiliki bit perm read-write-execute untuk orang lain (o-rwx ) dan dimiliki oleh root:root .

Secara teknis, hanya tidak adanya eksekusi (x ) bit akan mencegah daftar direktori (lstat(2) ) pada direktori.

Dalam output saya menemukan /run/systemd/inaccessible/ pada sistem berbasis Systemd init saya.

Mengenai file di /proc , /sys , /dev :

  • Filesystem ini adalah FS virtual yaitu berada di memori, bukan di disk

  • Jika Anda berencana untuk mengandalkan /proc , gunakan /proc/1/ yaitu mengandalkan sesuatu di bawah PID 1, bukan PID selanjutnya yang memiliki keandalan/konsistensi karena PID (proses) selanjutnya tidak dijamin ada.


Linux
  1. Perbedaan Antara Pengguna Sudo Dan Pengguna Root?

  2. Cara mengelola Izin/Kepemilikan File dan Direktori di Linux

  3. Bagaimana saya bisa memeriksa file yang ada dan menjalankan perintah jika tidak?

  1. Bagaimana cara mengosongkan (memotong) file di linux yang sudah ada dan dilindungi?

  2. Temukan file lalu cd ke direktori itu di Linux

  3. Bagaimana saya bisa memeriksa apakah ada direktori?

  1. mkdir -p gagal saat direktori ada

  2. Tidak dapat menghapus direktori di Unix

  3. Bagaimana saya bisa menemukan file/direktori yang bisa berada di mana saja di baris perintah linux?