Saya memiliki kotak ReadyNAS bernama "penyimpanan" yang saya percaya didasarkan pada Debian. Saya bisa ssh sebagai root. Saya mencoba mengkonfigurasi ulang server web, tapi saya mengalami masalah izin file yang saya tidak mengerti. Saya tidak bisa melakukan apa pun dengan /etc/frontview/apache/apache.pem
bahkan sebagai root! Tampaknya tidak memiliki izin khusus dibandingkan dengan file lain di direktori yang sama dan saya dapat bekerja dengannya.
storage:~# whoami
root
storage:~# cd /etc/frontview/apache/
storage:/etc/frontview/apache# ls -lah apache.pem*
-rw------- 1 admin admin 4.0k Jul 10 2013 apache.pem
-rw------- 1 admin admin 4.0k Jun 9 05:57 apache.pem.2017-02-04
-rw------- 1 admin admin 1.5k Jun 9 05:57 apache.pem.orig
storage:/etc/frontview/apache# touch apache.pem
touch: creating `apache.pem': Permission denied
storage:/etc/frontview/apache# touch apache.pem.2017-02-04
storage:/etc/frontview/apache# rm -f apache.pem
rm: cannot unlink `apache.pem': Operation not permitted
Apa yang istimewa dari file ini sehingga tidak dapat disentuh? Saya tidak bisa menghapusnya. Saya tidak dapat mengubah izin di atasnya. Saya tidak dapat mengubah pemiliknya.
Direktori tampaknya baik-baik saja. Ruang tersisa, tidak dipasang hanya baca. Sebenarnya saya bisa mengedit file lain di direktori yang sama.
# ls -ld /etc/frontview/apache
drwxr-xr-x 8 admin admin 4096 Jun 9 05:44 /etc/frontview/apache
# df /etc/frontview/apache
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hdc1 2015824 504944 1510880 26% /
sumber
ls -ld /etc/frontview/apache
dandf /etc/frontview/apache
. Mungkin folder tersebut berada pada ruang disk yang terpasangro
?# mount
::/dev/hdc1 on / type ext3 (rw,noatime)
Jawaban:
Saya baru saja menemukan masalahnya. Atribut "immutable" diset pada file itu.
ls
tidak menunjukkannya. Anda memerlukan perintah berbeda untuk melihatnya:Setelah saya menghapus bit yang tidak dapat diubah, saya dapat mengedit file itu:
sumber
ls
tidak memiliki opsi untuk membuat daftar atribut. Saya lupa, tapi mungkin bahkan panggilan sistem untuk menanyakannya tidak portabel, jadi mungkin lebih mudah hanya menerapkannya dalam utilitas terpisah.)ls
menunjukkan bit itu, atau jika salah satu dari perintah lain yang saya gunakan memiliki pesan kesalahan yang lebih membantu (dan spesifik) tentang mengapa izin ditolak.touch
tahu adalah bahwa panggilan sistem yang dicoba (open("apache.pem", O_WRONLY|O_CREAT|..., 0666)
) gagalEACCESS
. (Gunakanstrace -efile touch apache.pem
untuk melihat panggilan sistem terkait file yang dibuatnya). Seperti halaman manual untuk panggilan sistem itu , ada banyak kemungkinan alasan untuk EACCESS, dan banyak dari mereka melibatkan direktori induk daripada file itu sendiri. Menulis kode untuk secara akurat menyimpulkan mengapa pemanggilan sistem mengembalikan kesalahan yang dilakukannya akan sangat sulit, karena sistem file dan OS yang berbeda berbeda ...errno
) dan mencetaknya. (Menggunakanperror
fungsi perpustakaan standar C , atau setara). Ini adalah salah satu kasus langka di mana itu tidak selalu cukup petunjuk bagi pengguna untuk dengan cepat menemukan masalah, tetapi sebagian besar waktu itu berfungsi dengan sangat baik. (Terutama ketika dikombinasikan denganstrace
jika ada keraguan tentang operasi yang menghasilkan kesalahan.) Itu tidak sempurna, tetapi bisa jauh lebih buruk (lih. MS Windows di mana yang terbaik Anda mendapatkan kode kesalahan ke google.)chattr +i
, dan melihat bahwarm foo
(tanpa-f
) petunjuknya:rm: remove write-protected regular file ‘foo’
. Karenafaccessat(AT_FDCWD, "/var/tmp/foo", W_OK) = -1 EACCES (Permission denied)
. POSIX mengharuskanrm
untuk meminta secara default sebelum menghapus file yang dilindungi tulis, dan, itulah sebabnya ia memeriksa di tempat pertama. Jadi Anda akan mendapatkan petunjuk besar lebih cepat jika Anda tidak menggunakannyarm -f
. : /access(3)
meminta kernel untuk memeriksa izin seolah-olah itu benar-benar terbuka untuk ditulis, jadi ia mengambil ACL dan atribut.