Saya sedang mengerjakan aplikasi web LAMP dan ada proses terjadwal di suatu tempat yang terus membuat folder bernama shop
di root situs. Setiap kali ini muncul itu menyebabkan konflik dengan aturan penulisan ulang di app, tidak bagus.
Sampai saya menemukan skrip yang menyinggung, apakah ada cara untuk mencegah folder yang disebut shop
dibuat di root? Saya tahu bahwa saya dapat mengubah izin pada folder untuk mencegah isinya diubah, tetapi saya belum menemukan cara untuk mencegah folder dengan nama tertentu dibuat.
linux
directory
directory-structure
Andrew
sumber
sumber
Jawaban:
Anda tidak bisa, mengingat pengguna yang membuat direktori memiliki izin yang cukup untuk menulis di direktori induk.
Sebagai gantinya, Anda dapat memanfaatkan kumpulan
inotify
panggilan sistem yang disediakan oleh kernel Linux, untuk mengawasi pembuatan (dan opsionalmv
-ing) direktorishop
dalam direktori yang diberikan, jika dibuat (atau secara opsionalmv
-ed),rm
direktori.Program userspace yang Anda butuhkan dalam hal ini adalah
inotifywait
(datang denganinotify-tools
, instal dulu jika diperlukan).Dengan asumsi direktori
shop
akan berada di/foo/bar
direktori, mari kita atur pemantauan untuk/foo/bar/shop
pembuatan, danrm
langsung jika dibuat:inotifywait -qme create /foo/bar
/foo/bar
direktori jam tangan untuk file / direktori apa pun yang mungkin dibuat, misalnya pantaucreate
acara apa punJika dibuat,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
periksa apakah file tersebut merupakan direktori dan namanya adalahshop
(/,ISDIR shop$/
), jika demikianrm
direktori (system("rm -r -- /foo/bar/shop")
)Anda perlu menjalankan perintah sebagai pengguna yang memiliki izin menulis pada direktori
/foo/bar
untuk dihapus darishop
direktori.Jika Anda ingin memantau
mv
operasi juga, tambahkan tontonan untukmoved_to
acara juga:Sekadar diketahui, jika Anda mencari file, bukan direktori, bernama
shop
:sumber
inotifywait
untuk melakukan ini, juga mungkin bahwa pemicunya juga mungkin dapat menangkap proses denganps -ef
Untuk menjawab secara harfiah berdasarkan pertanyaan mencegah folder dari nama tertentu yang akan dibuat.
touch shop
Anda tidak dapat membuat direktori jika ada file dengan nama identik
mkdir: cannot create directory ‘shop’: File exists
sumber
chattr +i shop
untuk membuatnya tidak berubah. Sampai bendera yang tidak dapat diubah dihapus, itu bahkan tidak dapat diganti namanya / dihapus.rename(2)
masih berfungsi, karena nama bukan bagian dari inode, tetapi tidak. Pencarian internet cepat tidak mengungkapkan alasannya. Ada petunjuk?rename
bekerja.Bagaimana dengan membajak
mkdir
syscall denganLD_PRELOAD
...?Perhatikan bahwa di dalam handler ini Anda dapat mencatat PID proses yang ingin membuat direktori ini:
Anda perlu menempatkan ini di
~/.bashrc
root (atau siapa pun yang menjalankan aplikasi Anda) untuk memastikan ini akan digunakan:sumber
LD_PRELOAD
hacks seperti ini pada dasarnya selalu salah, dan kecuali Anda tahu apa yang Anda lakukan, mereka bisa buruk mematahkan program yang memuat mereka ke dengan melanggar sifat seperti async-sinyal-keselamatan fungsi yang Anda mengganti.fopen
seharusnya"a"
bukan"w"
, sehingga dapat menyimpan log sebelumnya(Akan mengomentari jawaban Miati tetapi tidak dapat mengingat akun lama saya dan tidak memiliki reputasi yang cukup untuk yang baru ini ...)
Anda dapat memblokir penciptaan dengan membuat file dan kemudian mengubah atribut file.
Maka segala upaya untuk melakukan apa pun dengan file itu akan diblokir - bahkan jika pengguna menjadi root.
sumber
Buat symlink yang menunjuk ke lokasi yang tidak ada di dalam direktori yang tidak ada. Ini memiliki beberapa implikasi menyenangkan:
EEXIST
(File ada).ENOENT
(Tidak ada file atau direktori seperti itu)ENOENT
. lstat tentu saja akan mengembalikan informasi tentang symlink.Ini memiliki dua keunggulan dibandingkan beberapa solusi lain yang diusulkan di sini: (a) Anda tidak perlu menjalankan layanan yang melacak pembuatan direktori dan (b) nama tersebut tampaknya tidak ada di sebagian besar perintah.
Anda harus mencobanya, tetapi saya curiga bahwa apa pun aturan penulisan ulang yang Anda miliki, mereka tidak menggunakan lstat atau perintah non-dereferensi lain, membuatnya gagal.
sumber