Saya menggunakan Vim tempo hari seperti biasa, ketika saya melihat sesuatu yang aneh. Inilah yang saya lakukan:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Lalu saya membuat perubahan, dan menabung dan berhenti bersama :wq
. Cukup normal. Namun, kemudian:
~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile
Jadi root harus memiliki akses r / w dan semua orang seharusnya hanya membaca. Edit file, coba simpan - Anda tidak bisa. Luar biasa, bekerja sebagaimana mestinya. Namun, jika Anda menyimpan dengan :w!
, vim entah bagaimana mengubah kepemilikan file kembali ke nama pengguna: usergroup dan file tersebut disimpan. Bahkan jika Anda melakukan ini:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Anda masih bisa menimpa :w!
! Apa yang terjadi? Bagaimana vim dapat melanggar hukum kepemilikan file dan izin seperti ini? Saya melihat halaman bantuan di vim dengan mengatakan :help :w
dan menemukan ini:
:w[rite]! [++opt] Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.
Saya tidak dapat menulis ke file dalam vim sebelumnya ketika saya tidak seharusnya, jadi saya kira inti sebenarnya dari pertanyaan saya adalah, bagaimana saya bisa membuat file tidak dapat diedit oleh vim dan mengapa tidak didasarkan pada file izin sistem, seperti yang saya harapkan, dan mekanisme apa yang digunakan vim untuk mengedit file yang tidak dapat digunakan oleh editor lain (gedit, nano)?
EDIT: Komputer tempat saya mencoba ini menggunakan kernel Linux 3.15.5-2-ARCH. Nomor versi Vim adalah 7.4.373-1, dan yang diinstal oleh pacman
- Saya tidak mengkompilasinya dari awal dengan opsi khusus.
CAP_CHOWN
diperlukan untuk menelepon chown(2)
. Ngomong-ngomong, saya bisa mereproduksi di Debian, dengan vim 7.4.