vi içinde bir dosya üzerinde kök izinlerini alma?

oy
227

yapılandırma dosyalarını düzenleme yaparken ben yazın vermedi fark kurtarmak için gittiğinizde Çoğu zaman, o zaman vi ile tek açarak edeceğiz

sudo vi filename

dosyayı kaydetmek için vi sudo ayrıcalıkları vermek için herhangi bir yolu var mı? Bir süre önce vi hakkında bazı şeyler ararken bu süre hakkında bir şey gördüğümü hatırlamıyorum görünüyor, ama şimdi bulamıyorum.

Oluştur 04/08/2008 saat 04:34
kaynak kullanıcı
Diğer dillerde...                            


11 cevaplar

oy
276

% Geçerli dosya adıyla değiştirilir, böylece kullanabilirsiniz:

:w !sudo tee %

( vimDosya değiştirildiğini tespit etmek ve bunun yeniden yüklenmesi için isteyip istemediğinizi soracaktır.)

Kısayol olarak, kendi komutunu tanımlayabilirsiniz. Gözlerinde farklı aşağıdaki koy .vimrc:

command W w !sudo tee % >/dev/null

Yukarıdaki ile yazabilirsiniz :W<Enter>dosyayı kaydedin. Bunu yazdıktan sonra bunu yapmak (Bence) daha güzel bir yol bulduk:

cmap w!! w !sudo tee >/dev/null %

Bu şekilde yazabilirsiniz :w!!ve sonunda imleci bırakarak tam komut satırına genişletilecek, bu nedenle yerini alabilir %isterseniz, kendinize ait bir dosya adıyla.

Cevap 31/08/2008 saat 20:23
kaynak kullanıcı

oy
29

Genel olarak, vi sürecin etkin kullanıcı kimliği değişmez, ancak bunu yapabilirsiniz:

:w !sudo tee myfile
Cevap 04/08/2008 saat 07:52
kaynak kullanıcı

oy
13

Ortak Uyarılar

Salt okunur dosya soruna almanın en yaygın yöntem bir uygulama kullanarak süper kullanıcı olarak geçerli dosyaya bir boru açmaktır sudo tee. Ancak, ben internette etrafında bulduk en popüler çözümlerin hepsi birkaç olası uyarılar bir arada var:

  • tüm dosya terminali yanı sıra dosyaya yazılmış. Bu, özellikle yavaş ağ bağlantıları üzerinden, büyük dosyalar için yavaş olabilir.
  • Dosya onun modları ve benzeri özelliklerini kaybeder.
  • olağandışı karakterler veya boşluklarla Dosya yolları doğru şekilde ele olabilir.

Çözümler

Bu konuların her yerinde almak için aşağıdaki komutu kullanabilirsiniz:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Bu saygılı, kısaltılabilir:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

açıklama

:Komut başlar; Eğer bir komut girmeye başlamak için normal modda bu karakteri yazmak gerekir. Bu komut çıkarılmalıdır.

sil[ent]komut çıkış bastırır. Bu durumda, biz durdurmak istiyor Press any key to continueçalıştırdıktan sonra görüntülenen benzeri istemi :!komutunu.

exec[ute]bir komut olarak bir dize yürütür. Biz sadece koşamam :writegerekli işlev çağrısını işlemez çünkü.

!temsil :!Sadece komutu: komutu :writekabul eder. Normalde, :writeyazma bir dosya yolu kabul eder. :!kendi başına (kullanarak, örneğin bir kabuk içinde bir komut çalıştırır bash -c). Ile :write, bu kabukta komutunu çalıştırın ve sonra dosyanın tamamını yazacak stdin.

sudoBurada olman bu yüzden beri açık olmalı. süper kullanıcı olarak komutunu çalıştırın. O nasıl çalıştığı hakkında 'net etrafında Orada pek çok bilgi var.

teeBorular stdinverilen dosyaya. :writeyazacağına stdin, daha sonra süper kullanıcı teedosya içeriğini almak ve dosyasına yazacaktır. Bu yeni bir dosya oluşturmak olmaz - sadece içeriğini üzerine - bu yüzden dosya modları ve nitelikleri korunacaktır.

shellescape()Geçerli kabuk için uygun olarak verilen dosya yolundaki özel karakterleri kaçar. Sadece bir parametre ile, tipik sadece gerektiği kadar tırnak içine alın yolunu olacaktır. Biz tam bir kabuk komut satırına gönderiyoruz yana, aksi kabuk çelme olabilecek diğer özel karakterlerin ters eğik çizgi-kaçılacağını etkinleştirmek için ikinci argüman olarak bir sıfır olmayan bir değer geçmek isteyeceksiniz.

@%içeriğini okur %şimdiki tamponunun dosya adını içeren kayıt. Mutlaka mutlak bir yol değil, bu yüzden mevcut dizin değişmemiştir emin olun. Bazı çözümlerde, ticari-de sembol atlanmış göreceksiniz. Yere bağlı olarak, %geçerli bir ifadedir ve okuma aynı etkiye sahiptir %kayıt. Bununla birlikte, kısa yol genel olarak izin başka ifade içinde yuvalanmış: örneğin bu durumda olduğu gibi.

>NULve >/dev/nullyönlendirme stdoutplatformun boş cihaza. Biz komutunu susturulmuş ettik olsa da, boru ile ilişkili ek yükü tüm istemiyoruz stdiniyi mümkün olduğunca erken bunu dökümü - vim geri. NULDOS, MS-DOS ve Windows, geçerli bir dosya üzerinde boş bir cihazdır. Windows'un itibariyle NUL 8 yönlendirmeler NUL adlı bir dosya yazılırken sonuçlanmaz. Ile veya bir dosya uzantısı olmadan, NUL adlı masaüstünüzde bir dosya oluşturmayı deneyin: bunu yapmak mümkün olmayacaktır. (Tanımaya değer olabilir Windows'daki birçok cihaz isimler var.)

~ / .vimrc

Platform-Bağımlı

Tabii ki, yine bu ezberlemek ve her defasında tipi onları istemiyoruz. Daha basit bir kullanıcı komutuna uygun komutu eşleştirmek için çok daha kolaydır. POSIX Bunu yapmak için, aşağıdaki satırı ekleyebilirsiniz ~/.vimrczaten mevcut değilse onu oluştururken, dosyanın:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

çok daha kolay - W (harf duyarlı) süper kullanıcı izinleriyle Geçerli dosyayı yazmak için komut: Bu tip sağlayacaktır.

Platform bağımsız

Bir platformdan bağımsız kullanmak ~/.vimrcbilgisayarlar arasında senkronize dosyası, bu yüzden benim için çok platformlu işlevselliği eklendi. İşte bu ~/.vimrcsadece ilgili ayarlarla:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
Cevap 13/10/2012 saat 07:54
kaynak kullanıcı

oy
10

Eğer kullanıyorsanız Vim , bir komut dosyası mevcut adında var sudo.vim . Eğer okumak root erişimi gereken bir dosyayı açtıktan fark ederseniz, tip

: E Sudo:%
Vim geçerli dosyanın adıyla% değiştirir ve sudo:okuma ve yazma için devralmaya sudo.vim senaryoyu talimatını verir.

Cevap 24/09/2008 saat 05:12
kaynak kullanıcı

oy
7

3. adımda aşağıdaki geçici dosya taşımak yoksa Ryan'ın tavsiye, ancak, genellikle iyidir; Yanlış sahiplik ve izinlere sahip olacak. Bunun yerine, sudoeditdoğru dosya ve (kullanarak içerikleri okumak :rgeçici dosya veya benzeri).

2. adımı takip ederse, kullanmak :w!yazılacak dosyayı zorlamak için.

Cevap 04/08/2008 saat 05:04
kaynak kullanıcı

oy
3

Düzenlemek sudo erişmesi gereken bir dosya üzerinde komut moduna geri dön zaman, diyerek bir durum mesajı almak

-- INSERT IGNORE  -- W10: Warning: Changing a readonly file

Bunu kaçırırsanız, genellikle yapmam

:w ~/edited_blah.tmp
:q

..sonra..

sudo "cat edited_blah.tmp > /etc/blah"

..veya..

sudo mv edited_blah.tmp /etc/blah

Orada bunu yapmak için daha az dolambaçlı bir yol muhtemelen, ama işe yarıyor.

Cevap 12/08/2008 saat 19:37
kaynak kullanıcı

oy
1

İşte o başarısız olursa, varsayılan olarak birinci ve su sudo kullanmaya çalışır, bu soruya cevap beri göründü diğeri, SudoRead ve SudoWrite işlevlerini sağlayan bir eklenti olarak adlandırılan SudoEdit, var: http://www.vim.org/scripts/ script.php? SCRIPT_ID = 2709

Cevap 29/01/2010 saat 18:21
kaynak kullanıcı

oy
1

Hızlı bir Google bu tavsiye vermek görünüyor:

  1. o salt okunur eğer düzenlemeye kalkmayın.
  2. Dosyanın izinlerini değiştirmek mümkün olabilir. (Bu kaydetmek izin verir olsun veya olmasın deney kadardır.)
  3. Hala zaten düzenlenmiş ise geçici bir dosyaya kaydedin ve ardından taşıyın.

http://ubuntuforums.org/showthread.php?t=782136

Cevap 04/08/2008 saat 04:39
kaynak kullanıcı

oy
0

Ben de bu var benim ~ / .bashrc:

alias svim='sudo vim'

Şimdi ben sadece svim ile açın bir yapılandırma dosyasını düzenlemek gerektiğinde.

Cevap 19/03/2009 saat 13:51
kaynak kullanıcı

oy
-2

Eğer düşünebilirsiniz hızlı kesmek vim ile kaydetmek düzenlerken dosya üzerinde bir chmod yapıyor, ve sonra geri dosyası başlangıçta ne kadar chmod edilir.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

Tabii ki kimsenin / oku farkında olmadan dosyayı değiştirebilir birkaç saniye olarak, güvenlik konusunda endişeleniyorsanız bir sistemde bu yaklaşımı önermiyoruz.

Cevap 05/08/2008 saat 23:20
kaynak kullanıcı

oy
-7

kullanmak gksudo yerine sudo GVIM yani için

cmap w!! w !gksudo tee >/dev/null %
Cevap 30/11/2010 saat 07:33
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more