Pertanyaan pendek:
Mengapa kita dapat memanipulasi file read-only di Vim menggunakan :+ w+ q+ !bahkan tanpa menjadi administrator?
Pertanyaan panjang:
Saya memiliki file teks (myFile.txt) yang hanya-baca untuk semua orang:
navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt
Saya bisa membukanya dengan Vim tanpa memiliki hak admin:
navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt
Saya memodifikasinya dan tekan: Esc+ :+ w+ q+ Enterdan saya melihat pesan kesalahan ini:
E45: 'readonly' option is set (add ! to override)
Sejauh ini, semuanya masuk akal. Tetapi ketika saya menekan: Esc+ :+ w+ q+ !+ Enter, Vim menyimpan perubahan.
Saya menggunakan Ubuntu 16.04 dan VIM 7.4.
command-line
permissions
vim
chmod
read-only
Navid Vafaei
sumber
sumber
Modifying a file and replacing a file are two different things
Jawaban:
Seperti yang telah disebutkan @Rob , Anda hanya dapat melakukan ini jika Anda memiliki akses tulis ke direktori yang berisi file. Mencoba melakukan hal yang sama ke file di, misalnya,
/etc
akan gagal.Adapun bagaimana
vim
melakukan ini, ia menghapus file dan membuatnya kembali. Untuk menguji ini, saya membuat file yang dimiliki oleh root:Dan kemudian melanjutkan untuk mengedit file dengan
vim
cara yang Anda gambarkan, tetapi lampirkan prosesstrace
untuk melihat apa yang terjadi:Saya kemudian memeriksa
strace.out
dan menemukan:Jadi, file itu pertama kali dihapus (
unlink("fff")
), kemudian file baru dengan nama yang sama dibuat (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) dan modifikasi yang saya buat ditulis untuk itu (write(4, "foasdasdao\n", 11)
). Jika Anda mencoba ini di rumah, Anda akan melihat bahwa setelah Anda mengeditnyavim
, file sekarang akan menjadi milik Anda dan bukan root.Jadi, sebenarnya,
vim
bukan mengedit file yang Anda tidak memiliki akses tulis. Itu menghapus file dari direktori di mana Anda memiliki akses tulis dan kemudian membuat file baru yang, sekali lagi, Anda memiliki akses tulis.sumber
rename(2)
untuk mengganti file lama. Maka tidak ada jendela waktu di mana data Anda tidak ada pada disk.Selama Anda memiliki direktori induk, Anda dapat menghapus, atau mengganti file, apa pun izinnya karena Anda dapat mengubah konten direktori :).
Cobalah dengan perintah lain seperti rm, itu akan meminta Anda tetapi Anda masih bisa melakukannya. Buat direktori tidak dapat ditulisi dan itu harus menghentikannya.
Tambahan:
Hanya mencobanya tetapi selama saya memiliki file saya masih dapat memodifikasinya, bahkan dengan folder hanya baca. Namun ketika saya mengubah kepemilikan menjadi root: root tidak dapat membuka file untuk ditulis. Jadi, selesaikan memodifikasi file yang dimiliki oleh root (atau orang lain)
sumber
Menggunakan
w!
Anda menghapus file asli ( yang diizinkan untuk Anda lakukan ) dan menulis versi Anda.Ketika Anda memiliki akses tulis ke direktori, Anda dapat: membuat, memindahkan, atau menghapus file di dalam direktori itu.
Sekarang izinkan saya beralih pengguna saya dan ubah file
Sekarang lihat apa yang ada di sana:
sumber
Lihat
:help write-readonly
:Karena Anda memiliki izin menulis pada direktori (artinya Anda dapat membuat, menghapus, atau mengganti nama file di dalamnya), sistem mengizinkannya.
Nilai default dari
cpoptions
tidak mengandungW
:sumber
Ini adalah peringatan VIM untuk Anda yang mungkin relatif penting mengingat cara kerja izin di UNIX. Ketidaktepatan yang terlihat dari ini adalah karena sistem file UNIX memiliki izin untuk file yang disimpan dalam i-node file. Struktur direktori entah bagaimana terpisah dan hanya menghubungkan simpul-simpul ini. Direktori juga memiliki izin yang menyatakan apakah Anda dapat menautkan / membatalkan tautan file ke dalamnya, atau membacanya atau melintasi sub-direktori. Desain ini memungkinkan file yang sama dapat muncul di beberapa tempat berbeda dalam struktur direktori (melalui tautan keras). Dengan mengatakan "tambahkan! Untuk menimpa" VIM berusaha memperingatkan Anda bahwa file asli akan dibatalkan tautannya (sehingga akan tetap di semua tempat lain yang tidak tersentuh) dan file baru akan dibuat dan ditautkan ke tempat asli dalam struktur direktori. Jika jumlah tautan dari file asli berkurang menjadi nol, file asli akan dibebaskan, tetapi jika tidak, Anda secara efektif mengkloning file tersebut. Pembukaan file juga dianggap sebagai tautan, jadi jika beberapa program membuka file dan Anda setuju untuk "menambahkan! Untuk menimpa", program tidak akan melihat perubahan yang dilakukan pada file oleh Anda dengan VIM. File hanya akan dibatalkan tautannya dari direktori oleh VIM dan setelah menutup file oleh program lain, file tersebut akan dibebaskan, kecuali jika ditautkan di tempat lain.
Harap dicatat bahwa di Windows, izin untuk file disimpan dalam direktori, jadi dari sudut pandang paradigma izin Windows, perilaku vim ini mungkin memang terlihat aneh. Untuk menulis ke file, Windows secara logis mungkin juga memeriksa beberapa izin direktori, bahkan izin super-direktori. Seperti dikatakan di atas, dalam UNIX, izin direktori tidak relevan untuk manipulasi dengan file sejauh Anda dapat membuat daftar dan membukanya (yaitu ada x untuk semua direktori super). File yang dibuka di UNIX mungkin bahkan tidak memiliki nama file lagi jika itu diputuskan tautannya dari semua direktori setelah dibuka.
Misalnya, Anda memiliki file / home / user1 / foo dan itu adalah file yang sama dengan (yaitu hardlinked to) / home / user2 / foo dan file tidak dapat ditulisi oleh siapa pun dan saat ini dibuka oleh program P (dibuka baca-tulis oleh program dimulai oleh root). Jika user1 membukanya dengan vim dan menimpa, ia membuat salinan sendiri dan tidak lagi melihat file asli. Jika kemudian user2 membuka tautannya dengan vim dan menulis ke dalamnya, tautan itu akan dibatalkan tautannya lagi dan ia akan membuat salinan lain. Program P masih akan melihat file asli dan dapat dengan bebas membaca atau menulis di dalamnya. Segera setelah program menutup file, file tersebut akan hilang (dibebaskan oleh filesystem).
sumber
Baik editor vim Anda dan file Anda membawa
kepemilikan sehingga Anda juga bisa keluar
dan Anda mungkin menebak bahwa pada suatu waktu bahkan lebih sederhana
(hanya membutuhkan + w, ut unlink izin pada. dan bahkan kepemilikan) menjadi terlalu sering bagi seseorang untuk mengetik sehingga vim diprogram ulang untuk secara otomatis menawarkan dan berdasarkan permintaan secara otomatis melakukan operasi seperti itu.
Cobalah menimpa kakakmu
sebagai navid belaka dan taruhan adalah vim Anda memberi Anda penolakan yang Anda inginkan.
sumber
Ini bukan jawaban yang tepat, tetapi jika Anda benar-benar ingin mengatur file sehingga tidak ada yang dapat mengubah atau menghapusnya, Anda dapat membuatnya tidak berubah.
Biasanya, bahkan ketika file dimiliki oleh root, Anda masih dapat menghapus file jika Anda memiliki izin menulis ke folder. Tetapi ketika Anda membuat file tidak dapat diubah, bahkan root tidak dapat memodifikasi atau menghapusnya.
Untuk membuat file tidak berubah (Anda perlu
sudo
):Anda dapat melihat ini dengan
lsattr
(hurufi
di hasil):Untuk membuat file kembali normal:
Untuk memperjelas: Ketika suatu file tidak dapat diubah, itu tidak dapat dihapus, diganti namanya, dimodifikasi, atau bahkan dihubungkan dengan keras.
Ini layak dibaca
man chattr
, karena file dapat memiliki sejumlah atribut yang bermanfaat.Anda mungkin juga menemukan "penghapusan terbatas" berguna. Jika ditempatkan pada folder (bukan file), ini berarti bahwa siapa pun yang membuat file di dalam folder diizinkan untuk memodifikasi atau menghapus file itu, tetapi tidak ada orang lain (kecuali root). Folder
/tmp
memiliki set bendera ini. Anda dapat melihat ini dengant
bendera di/tmp
:Untuk mengatur atau menghapus bendera penghapusan terbatas pada folder:
sumber