Tôi đã sử dụng Vim vào một ngày khác như thường lệ, khi tôi nhận thấy một điều kỳ lạ. Đây là những gì tôi đã làm:
~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile
Sau đó, tôi đã thực hiện một thay đổi, và lưu và thoát với :wq
. Khá bình thường. Sau đó, tuy nhiên:
~$ 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
Vì vậy, root nên có quyền truy cập r / w và mọi người khác chỉ nên đọc. Chỉnh sửa tập tin, cố gắng lưu - bạn không thể. Tuyệt vời, làm việc như dự định. Tuy nhiên, nếu bạn lưu với :w!
, vim bằng cách nào đó thay đổi quyền sở hữu tệp trở lại tên người dùng: nhóm người dùng và tệp được lưu. Ngay cả khi bạn làm điều này:
~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile
Bạn vẫn có thể ghi đè lên :w!
! Chuyện gì đang xảy ra vậy? Làm thế nào vim có thể phá vỡ luật sở hữu tập tin và cho phép như thế này? Tôi đã xem trang trợ giúp trong vim bằng cách nói :help :w
và tìm thấy điều này:
: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.
Tôi đã không thể ghi vào một tập tin trong vim trước đây khi tôi không nên, vì vậy tôi đoán trung tâm thực sự của câu hỏi của tôi là, làm thế nào tôi có thể tạo một tập tin không thể di chuyển bằng vim và tại sao nó không dựa trên tập tin quyền hệ thống, như tôi mong đợi, và vim đang sử dụng cơ chế nào để chỉnh sửa tệp mà các trình soạn thảo khác (gedit, nano) không thể sử dụng?
EDIT: Máy tính tôi đã thử này sử dụng kernel Linux 3.15.5-2-ARCH. Số phiên bản của Vim là 7.4.373-1 và là phiên bản được cài đặt bởi pacman
- Tôi đã không biên dịch nó từ đầu với bất kỳ tùy chọn đặc biệt nào.
CAP_CHOWN
là cần thiết để gọi chown(2)
. Nhân tiện, tôi có thể sao chép trên Debian, với vim 7.4.