Vi, salt okunur olmasına rağmen dosyaya yazabilir


12

Aşağıdaki örnek, yalnızca okuma izinlerine sahip bir dosyanın nasıl oluşturulacağını gösterir. Gördüğümüz gibi, aldığım echo komutunu kullanarak bu dosyaya yazmaya çalıştığımda Permission denied,.

Ama neden biz vi kullanmak bu durumda yaptığımız değil almak Permission denied? Burada görülebileceği gibi, dosya salt okunur olsa bile dosyaya yazabiliriz.

Burada ne oluyor? Bu bir vi hatası mı?

[admin@madona-machine1 ~]$ touch test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-rw-r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ chmod -w  test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-r--r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ echo try_to_write > test-file
-bash: test-file: Permission denied
[admin@madona-machine1 ~]$ vi test-file

I am good singer,

 ~
 ~
 ~
 ~
 ~
 ~
 ~                                                
   "test-file" 1L, 4C written

1
FYI bunun için bir beta SE sitesi var - vi.stackexchange.com
Raystafarian

Yanıtlar:


28

Not : Eski lisanslama nedenlerinden dolayı, çoğu GNU / Linux dağıtımı, Bill Joy tarafından yazılan orijinal vi programını içermez. Bunun yerine, vi komutu Vim'i vi-uyumluluk modunda çalıştırarak sağlanır. Aşağıdaki cevap, Vim'i vi-uyumluluk moduyla çalıştırmaya dayanmaktadır.

Salt okunur bir dosyayı değiştirme

Vim, salt okunur bir dosyanın arabelleğini değiştirmeleri durumunda kullanıcıyı uyarır W10: Warning: Changing a readonly file. Kullanıcı bu dosyaya yazmaya çalışırsa, aşağıdaki hata iletisini alır 'readonly' option is set (add ! to override).

Üst dizin Vim kullanıcısı tarafından yazılabilir olduğunda

Vim, yardımcı olmak, onlar zorla, bir ünlem işareti ekleyerek yazma ısrar anlamına kullanıcı bildirir !için wkomuta. Write komutunun bu güçlü sürümü kullanılırsa, Vim orijinal dosyayı siler (yalnızca Vim backupseçenek kümesi ile Vim kullanılıyorsa , orijinal dosya aslında yedek dosyayla aynı olarak yeniden adlandırılır ). Daha sonra orijinaliyle aynı ada sahip yeni bir dosya açar (oluşturur) ve arabelleğinin içeriğini bu yeni dosyaya yazar. Bu, Vim'i çalıştırmadan önce ve sonra dosyanın inode'unu kontrol ederek gözlemlenebilir :

$ ls -l --inode t

131529 -r--r--r-- 1 anthony anthony 0 Apr 13 09:23 t

$ vi t
$ ls -l --inode t

131649 -r--r--r-- 1 anthony anthony 4 Apr 13 09:23 t

Not: Bu aynı zamanda dosyanın iznini ve sahipliğini ve kopma (sembolik) bağlantılarını da değiştirebilir, örn. Orijinal dosya başka bir kullanıcıya aitse, yeni dosya Vim çalıştıran kullanıcıya ait olacaktır.

Bir işlem yalnızca dosyanın üst dizini için yazma iznine sahipse bunu yapabilir. Genel olarak, bir programın bir dosyayı değiştiremediğinden emin olmak için hem dosyanın hem de üst dizinin izinleri güvence altına alınmalıdır.

Üst dizin Vim kullanıcısı tarafından yazılamadığında

Ancak, bu durumda bile, Vim ısrar eden kullanıcının dosyayı aşırı yazmasına yardımcı olmak için elinden gelenin en iyisini yapar. Vim kullanıcısı dosyanın sahipliğine sahipse, Vim dosyanın iznini geçici olarak değiştirerek ( chmodsistem çağrısını kullanarak ), arabelleği dosyaya yazarak, dosyayı kapatıp izinleri geri. Vi'yi strace üzerinden çalıştırırken yapılan sistem çağrılarının bir özeti strace -o ../vi.trace vi t:

getuid()                                = 501
chmod("t", 0100644)                     = 0
open("t", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18)     = 18
fsync(4)                                = 0
close(4)                                = 0
chmod("t", 0100444)                     = 0

Not: Vim kullanıcısı sahip olmadığı bir dosyayı düzenliyorsa, Vim dosya izinlerini değiştiremezse bu gerçekleşmez.

ek

Bir dosyanın değiştirilemeyeceğinden emin olmak için (GNU / Linux sisteminde), chattrkomutu süper kullanıcı olarak çalıştırın :

sudo chattr +i filename

Gönderen man chattr:

'İ' özniteliğine sahip bir dosya değiştirilemez: silinemez veya yeniden adlandırılamaz, bu dosyaya bağlantı oluşturulamaz ve dosyaya veri yazılamaz. Yalnızca süper kullanıcı veya CAP_LINUX_IMMUTABLE özelliğine sahip bir işlem bu özelliği ayarlayabilir veya temizleyebilir.


2
Kutsal duman, bu tam!
Camille Goudeseune

4
@CamilleGoudeseune Cevabımın ilk sürümünü gönderdikten sonra, bazı deneyler yaptım ve farklı durumlarda sahnelerin arkasında ne yaptığını görmek için Vim'i çalıştırarak yaklaşık bir saat harcadım (her iki dosyanın farklı izinleri ve sahipliği ve Ana Dizin). Bazen taşınıyorum ama bir cevap yayınladıktan sonra, söylediklerimin doğru olduğundan emin olmak istedim.
Anthony Geoghegan

5

Çoğu hepsi değilse viuygulamaları ya böyle komuta tasarruf düzenli kullanırsanız dosyayı yazmaya engel ZZ, :w, :wqveya :xile örneğin vim:

:w
E45: 'readonly' option is set (add ! to override)

Öte yandan, viizinlerine rağmen dosyayı yazmayı söylerseniz , :x!veya gibi bir şey kullanarak :wq!, düzenleyici dosyanın yazılmasına izin vermek için izinleri geçici olarak gevşetir:

...
stat("test-file", {st_mode=S_IFREG|0444, st_size=7, ...}) = 0
getuid()                                = 1000
chmod("test-file", 0100644)             = 0
...
open("test-file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18)               = 18
fsync(4)                                = 0
close(4)                                = 0
chmod("test-file", 0100444)             = 0
....

Bu durumda, inode numarası değişmeden kalır.

Son olarak, bu, dosya izinlerini değiştirmenize izin verilmiyormuş gibi bir hata değildir, değiştiremezsiniz vi.


Hah! Cevabımı gönderdikten sonra, bazı deneyler yaptım ve farklı durumlarda sahnelerin arkasında ne yaptığını görmek için Vim'i çalıştırarak bir saat kadar harcadım (farklı izin izinleri ve hem dosya hem de üst dizinin sahipliği). Sadece denemelerimin sonuçlarını özetlemeyi bitirdikten sonra cevabınızı gördüm. İyi bir öğrenme deneyimiydi.
Anthony Geoghegan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.