Jika saya membuat file sebagai pengguna yang tidak berhak, dan mengubah mode izin menjadi 400
, itu dilihat oleh pengguna itu sebagai hanya-baca, dengan benar:
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
Semua baik-baik saja.
Tapi kemudian root muncul:
# [ -w somefile ] && echo rw || echo ro
rw
Apa apaan? Tentu, root dapat menulis ke file read-only, tetapi seharusnya tidak membiasakannya: Praktik Terbaik cenderung mendikte bahwa saya harus dapat menguji bit izin tulis, dan jika tidak, maka ditetapkan seperti itu karena suatu alasan.
Saya rasa saya ingin memahami mengapa hal ini terjadi, dan bagaimana saya bisa mendapatkan kode pengembalian yang salah saat menguji file yang tidak memiliki bit tulis set?
permissions
test
readonly
Kaya
sumber
sumber
4.1.2(1)-release
) dan RHEL7 (4.2.46(2)-release
)./etc/dhcp/dhcpd.conf
, yang dimiliki oleh root. Saya menggunakan vendor yang disediakandhcpd
. Bencana total, ya? File diperiksa ke RCS, saya mengotomatisasi penggunaanrcsdiff
,ci
danco
karena kami memiliki operator yang perlu ... beroperasi. Pemeriksaan bit izin (-w
, seperti yang dijelaskan olehtest(1)
) akan menjadi baris pertama kegagalan, bekerja atas dasar yangci -u
membuat file hanya dapat dibaca. Saya membuang itu dan langsung kercsdiff -q
dan memeriksa$?
. Tidak berbahayadhcpd
? Itu akan dimiliki olehdhcpd
.bash
dantest
membuat saya percaya itu untuk apa[ -w
.Jawaban:
test -w
alias[ -w
tidak memeriksa mode file. Ia memeriksa apakah itu dapat ditulisi. Untuk root, itu.Cara saya akan menguji akan melakukan perbandingan bitwise terhadap output
stat(1)
("%a
Hak akses dalam oktal").Catatan subkulit
$(...)
perlu0
diawali sehingga outputstat
ditafsirkan sebagai oktal oleh(( ... ))
.sumber
(( ... & ... ))
. Satu kesalahan ketik dikoreksi :-)if
diperlukan, output oktal izin%a
tidak%d
, dan(( ... ))
perlu awalan0
untuk mengartikan outputstat
sebagai oktal.man stat
mengatakan "% d nomor perangkat dalam desimal", tetapi yang kita inginkan adalah "hak akses", bukan? Maksud Anda tentang perlu 0 awalan dibuat dengan baik, tapi saya kira kita hanya perlu mengolahnya di sana :).stat -c 0%a
...Saya pikir Anda telah salah mengerti apa yang
-w
terjadi. Itu tidak memeriksa untuk melihat apakah file tersebut memiliki "Izin menulis", itu memeriksa untuk melihat apakah file tersebut dapat ditulisi oleh pengguna yang memohon .Lebih khusus, itu panggilan
access(2)
atau sejenisnya.misalnya jika skrip memiliki
if [ -w /etc/shadow ]
maka jika Anda menjalankanstrace
skrip Anda dapat melihat baris yang miripKarena
root
dapat menulis ke file maka mengembalikan 0.mis. sebagai pengguna normal:
Sebagai root
Ini, terlepas dari kenyataan yang
/etc/shadow
memiliki izin000
pada mesin saya.Sekarang apa yang ingin Anda lakukan menjadi menarik dan tidak begitu sederhana.
Jika Anda ingin memeriksa izin sederhana maka periksa
ls
output, atau panggilanstat
atau yang serupa. Tetapi sadari bahwa ACL dapat melewati izin ini secara berlebihan. Hanya karena file adalah izin 400 tidak menghentikannya agar tidak dapat ditulisi ...sumber
-w
:test(1)
eksplisit: "FILE ada dan izin menulis diberikan", bukan " file dapat ditulis oleh pengguna saat ini ". Apa-apa tentang mengesampingkan izin, atau ACL.bash(1)
is cagey: "Benar jika file ada dan dapat ditulis ."ksh(1)
membuat petunjuk halus terhadap shenanigans: "-w file // Benar, jika file ada dan dapat ditulis oleh proses saat ini ."zsh(1)
menentangtest(1)
,zshmisc(1)
disebut sebagaiksh(1)
, danzshexpn(1)
merinci beberapa globbing berbasis izin yang menarik.csh(1)
sangat meriah: "Akses tulis".Pengguna root dapat melakukannya sesuka hati, izin file "normal" tidak terbatas. Itu tidak akan langsung menjalankan file biasa tanpa izin eXecute, hanya untuk sedikit asuransi terhadap praktik target kaki.
sumber