İzinsiz açıldığında bir dosyayı düzenlemeye zorlamak için vim kullanma


51

Bir dosyayı düzenlemek için vim kullanıyorum. Bazen uygun izinlere sahip olmayı unuttum. Vim ve dosyayı salt okunur bir dosya olarak çalıştırıyorum. Değişiklikler yapabilirim, ancak değişiklikleri gerçekten yazamıyorum. Arada bir, bir dosya açıp üzerinde değişiklikler yapıyorum, onu sudo'da çalıştırmadığımı fark ettim, kendime bağırdım ve sonra bırakıp tekrar root kullanıcısı olarak açmaya zorladım.

Bunun için bir geçici çözüm var mı? Dosyanın salt okunur durumuna rağmen değişiklikleri dosyaya zorlayabilir miyim? En azından değişiklikleri kaydedebilir, bir fark çalıştırabilir ve dosyaları bir araya getirebilir miyim?


3
Bu soru zaten burada cevaplanmış gibi görünüyor: stackoverflow.com/questions/1005/…
Sonbahar

Özür dilerim. Bu cevabı bulamadım. Teşekkür ederim.
andor kesselman

3
[Vim sudo hilesiyle yaz] [1] kullanın: w! Sudo tee% [1]: stackoverflow.com/questions/2600783/…
Mattias Åslund

Yanıtlar:


81

Mevcut sorununuza bağlı olarak bazı farklı yaklaşımlar var gibi görünüyor:

  1. Salt okunur tarafından vi. Dosya varsa :set readonlyyapabilirsiniz
    • :w!Yazmaya zorlamak için kullanın veya
    • Sorun :set noreadonlyve sonra sadece normal kullanın:w
  2. Bir izin sorunu ( sudo ): yazamazsınız ancak sudo haklarınız vardır.
    • Sayı: :w !sudo tee %. Bu, arabelleğe tee, boru bilgilerini alan ve dosyalara yazabilen bir komut olarak yazacaktır. Ve tee sudo güçleriyle çalıştırıldığı için, tee dosyayı değiştirebilir.
  3. Bir izin sorunu ( sudo yok ): dosyayı yazma hakkınız yok ve yönetici erişiminiz yok.
    • :w! ~/tempfile.extDeğişikliklerinizi geçici bir dosyaya yazmak için kullanın ve ardından geçici dosyayı dizine taşımak için önlemler alın (geçici dosyayı dizin sahibine / yöneticiye gönderin).

Burada daha fazla okuyabilirsiniz:

  1. StackOverflow'tan
  2. Geekyboy'dan
  3. Veri Agaric'ten

Kısayol

Sıklıkla 2 numaralı vaka problemi olduğu için ( sudo ile izin problemi ), aşağıdaki kısayolu kullanabilirsiniz:/etc/vim/vimrc~/.vimrc

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

O zaman sudo güçleriyle :w!!tasarruf etmek için yazabilirsiniz . Burada açıklamayacağım ancak yukarıdaki referanslar birçok kısayolu kapsıyor.


1
Ve senin adın gibi senin necromancer rozeti kazandım! Teşekkürler! Şimdi Mordor'u savunmak istiyorum. ;)
Dr Beco

5

Bunu yapmanın iki yolunu düşünebilirim.

İlk yöntem, dosyanın size ait olduğunu varsayar, ancak dosya HAZIRDIR.

Kendi READONLY dosyanızın üzerine yazmaya zorlamak için vi'nin ünlem işareti sonekini write komutuna (: w!) Kullanın. Elbette bu, geçerli klasörde yazma ve yürütme izniniz olduğunu varsayar.

:w!

vi'nın orijinal READONLY dosyasının üzerine yazmasına neden olacaktır.

İkinci yol, başkasının dosyaya sahip olduğunu varsayar ve değişikliklerinizi bu dosyaya kaydetmek istersiniz.

Bunu başarmanın bir yolu, orijinal dosyada yapılan değişiklikleri, bir ed betiği olarak vi içinden kaydetmektir. Bu ed betiği, orijinal dosyaya (veya benzeri dosyalara), vi satırı dışında, ed satırı düzenleyicisiyle daha sonra uygulanabilir.

Geçerli düzenleme oturumunu bir ed betiği olarak kaydetmenin bir yolu, orijinal dosya adını ve düzenlenen vi arabelleğini --ed komut satırı anahtarı ile diff yardımcı programına standart girdi olarak iletmektir;

Böylece, düzenlenmiş bir vi tamponu varsayarak, aşağıdakileri yapın

:.,$!diff --ed [original_file] -

Bu, mevcut dosyayı (., $!) İçindeki tüm satırları, orijinal dosyayı mevcut arabellek içeriğine dönüştürmek için gerekli olan diff tarafından oluşturulan ed betiği (diff --ed [original_file] -) ile değiştirir. Daha sonra bu ed betiğini güvenli bir yere kaydetmek ve betiği yazabileceğimiz orijinal dosyanın bir sürümüne uygulamak istiyoruz. Bu yüzden, komut dosyasını yazılabilir bir yere, örneğin giriş klasörünüze kaydedin:

:w ~/my_ed_script

Şimdi vi'den çıkın ve ilk etapta kaydedilemeyen düzenlenmiş dosyayı elde etmek için bu ed betiğini kullanın. Bash komut satırı isteminde '$' komutunun nasıl elde edileceği aşağıda açıklanmıştır:

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Bu komut dizisinin kelimelerle yaptığı şey, diff ile oluşturduğumuz betiği katıştırmak ve ed yazma komutunu 'w', ed'nin standart girişine eko yapmaktır. Ed daha sonra bu betiği orijinal dosyanın yazılabilir kopyasına uygular ve bu değiştirilmiş tampon değişikliklerini dosyaya geri yazar.

Bu, vi'de yapılan çalışmaları, başlangıçta vi, diff ve ed kullanan bir başkasına ait olan bir dosyaya kaydetmenin bir yoludur.


1

Sadece dosya yazma izni olmadığında büyük / küçük harf yazmak istediğinizde.

:!chmod +w %
:w!

Arada vim dosyalarındaki değişiklikler hakkında şikayet edecek (bayrakların değişmesi nedeniyle) - açıkça görmezden gelmek güvenli


0

Su ayrıcalıklarına sahip olmadığınız bir diğer olasılık, Ryan Fox'a:w /somewhere/where/i/have/permissions/foo.txt göre daha sonra izin sorununu kullanmak ve kullanmaktır .

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.