Dalam skrip shell, bagaimana cara saya dengan mudah dan non-invasif menguji akses tulis ke file tanpa benar-benar mencoba untuk memodifikasi file?
Saya dapat mem-parsing output stat
, tetapi itu tampaknya sangat kompleks, dan mungkin rapuh, meskipun saya tidak yakin berapa banyak output stat berbeda di seluruh implementasi dan waktu.
Saya dapat menambahkan ke akhir file dan melihat apakah itu berhasil, tetapi itu berpotensi berbahaya, karena dua alasan yang dapat saya pikirkan:
- Saya sekarang harus menghapus tambahan, dan kalau-kalau ada proses lain menulis ke file, ini segera menjadi non-sepele karena baris saya tidak lagi yang terakhir.
- Setiap proses membaca file mungkin memiliki persyaratan sewenang-wenang pada konten file itu, dan saya mungkin telah merusak aplikasi itu.
sumber
man test
atauman [
type -a
test
kegunaaneuidaccess
yang hanya memeriksa izin bit . Apakah tidak ada faktor lain (mis. SELinux) yang dapat melarang akses tulis?&&
dan||
memiliki prioritas yang sama. Mereka dievaluasi dari kiri ke kanan.Pendekatan lain:
Ini akan mencoba untuk membuka file untuk ditambahkan, dan, jika berhasil, jalankan tanpa perintah (yaitu, jalankan perintah null ) dengan output ke file.
Hati-hati karena ini membuat file kosong jika tidak ada.
The
-w
operator daritest
perintah hanya mungkin melakukanstat
dan kemudian mencoba untuk mencari tahu apakah sepertinya Anda harus memiliki akses. Alternatif saya (di atas) lebih dapat diandalkan daripadatest
pendekatan dalam beberapa kondisi khusus, karena memaksa pemeriksaan akses dilakukan oleh kernel daripada shell. Sebagai contoh,stat
mungkin mengembalikan nilai mode yang menyesatkan.sumber
touch
file yang saya miliki tetapi tidak punya akses tulis, dan berhasil. Saya kira ituchmod
file danchmod
itu kembali. Jaditouch
tampaknya sama sekali tidak berguna sebagai jawaban atas pertanyaan itu.vim
memiliki perilaku mengubah izin dengan cepat ketika dipaksa untuk menulis pada file read-only. Aku memeriksa denganstrace
,touch
'sopen
gagal denganEACCES
, tetapi panggilan berikutnya untukutimensat
berhasil, itulah sebabnya saya pikirtouch
secara keseluruhan keluar berhasil.utimensat(2)
mengatakan, " Persyaratan izin: 1. akses tulis (atau) 2. ID pengguna efektif penelepon harus cocok dengan pemilik file, ....">> file
tidak portabel (misalnya, menjalankan NULLCMD di zsh), gunakantrue >> file
saja. Dan jika file tersebut bernama pipa, ia memiliki efek samping yang buruk.G-man benar:
[ -w ]
tidak akan selalu mengatakan yang sebenarnya. Di sini untuk mengatasi file yang tidak ada dan Izin pesan ditolak dari shell:Pembaruan : Terlihat menakutkan, bukan? Ya, benar. Hmm ... bagaimana cara mengucapkannya ... JANGAN GUNAKAN INI, kecuali jika Anda benar-benar tahu Anda berada dalam kondisi yang diminta untuk bekerja seperti yang diharapkan. Lihat komentar Stephane.
Apa yang harus disimpulkan? Sekalipun
[ -w ]
tidak mengatakan yang sebenarnya, itu adalah satu perintah yang dimaksudkan untuk melakukan pekerjaan itu. Jika tidak, kami akan menyalahkannya, menulis laporan bug, dan itu akan berhasil di masa depan. Lebih baik memeriksa kondisi di mana ia bekerja dan digunakan[ -w ]
; tulis kode khusus untuk kasus khusus. Penanganan masalah memiliki kondisi mereka sendiri.adalah yang terbaik a priori .
sumber
test -w
di sebagian besar implementasi penggunaanaccess(2)
jadi harus cukup untuk menguji izin.