Vra

Dikwels, terwyl die wysiging van konfigurasielêers, ek sal oop een met vi en dan wanneer ek gaan om dit te red besef dat ek nie die tipe

sudo vi filename

Is daar enige manier om te gee vi sudo voorregte om die lêer te stoor?Ek lyk om te onthou om te sien iets oor dit, terwyl op soek na'n paar dinge oor vi'n rukkie gelede, maar nou kan ek dit nie vind nie.

Was dit nuttig?

Oplossing

% vervang met die huidige lêernaam, dus jy kan gebruik:

:w !sudo tee %

(vim sal ontdek dat die lêer verander is en vra of jy wil dit te herlaai. Sê ja deur die keuse van [L] eerder as OK.)

As 'n kortpad, jy kan jou eie opdrag definieer. Sit die volgende in jou .vimrc:

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

Met die bogenoemde kan jy :W<Enter> om die lêer te stoor tik. Sedert ek dit geskryf het, het ek 'n mooier manier (in my opinie) om dit te doen gekry:

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

Op hierdie manier kan jy :w!! tik en dit sal uitgebrei word om die volle command line, die verlaat van die wyser aan die einde, sodat jy kan die % vervang met 'n lêer naam van jou eie, as jy wil.

Ander wenke

In die algemeen, kan jy nie verander die doeltreffende gebruiker id van die vi proses, maar jy kan dit doen:

:w !sudo tee myfile

Algemene Protest

Die mees algemene metode van die kry om die lees-alleen-lêer probleem is om oop te maak'n pyp aan die huidige lêer as die super-gebruiker met behulp van'n implementering van sudo tee.Maar, al van die mees populêre oplossings wat ek gevind het om die Internet het'n kombinasie van'n paar potensiële voorbehoude:

  • Die hele lêer kry wat geskryf is om die terminale, sowel as die lêer.Dit kan stadig wees vir groot lêers, veral oor stadige netwerk verbindings.
  • Die lêer verloor sy modes en soortgelyke eienskappe.
  • Lêer paaie met ongewone karakters of ruimtes kan nie korrek hanteer word.

Oplossings

Te kry om al hierdie kwessies, jy kan gebruik om die volgende opdrag:

" 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'

Hierdie kan verkort word, respek:

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

Verduideliking

: begin die opdrag;jy sal nodig het om te tik hierdie karakter in normale modus om te begin met'n opdrag.Dit moet weggelaat word in die skrifte.

sil[ent] onderdruk uitvoer van die opdrag.In hierdie geval, ons wil om te stop die Press any key to continue-soos gevra wat verskyn na die loop van die :! opdrag.

exec[ute] voer'n string as'n opdrag.Ons kan nie net loop :write want dit sal nie die proses die nodige funksie oproep.

! verteenwoordig die :! opdrag:die enigste opdrag wat :write aanvaar.Normaalweg, :write aanvaar'n lêer pad wat om te skryf. :! op sy eie loop'n opdrag in'n dop (byvoorbeeld, met behulp van bash -c).Met :write, dit sal loop van die bevel in die dop, en skryf dan die hele lêer te stdin.

sudo moet wees voor die hand liggend, aangesien dit is die rede waarom jy is hier.Voer die opdrag as die super-gebruiker.Daar is baie van die inligting rondom die " netto oor hoe dit werk.

tee pype stdin om die gegewe lêer. :write sal skryf aan stdin, is , dan is die super-gebruiker tee sal ontvang die lêer inhoud en skryf die lêer.Dit sal nie die skep van'n nuwe lêer-net vervang die inhoud-so lêer vorme en eienskappe sal bewaar word.

shellescape() ontsnap spesiale karakters in die gegewe lêer pad as geskik vir die huidige dop.Met net een parameter, dit sou tipies net sluit die pad in aanhalingstekens as wat nodig is.Sedert ons stuur om'n volledige dop opdrag lyn, ons sal wil hê om te slaag'n nie-nul waarde as die tweede argument in staat te stel agteroorskuisstreep-die ontsnapping van ander spesiale karakters wat anders kan reis op die dop.

@% lees die inhoud van die % registreer, wat bevat die huidige buffer se lêer naam.Dit is nie noodwendig'n absolute pad, so maak seker dat jy het nie verander van die huidige gids.In'n paar oplossings, sal jy sien die kommersiële-op-simbool weggelaat.Afhangende van die ligging, % is'n geldige uitdrukking, en het dieselfde effek as die lees van die % registreer.Geneste binne'n ander uitdrukking die kortpad is oor die algemeen verwerp het, maar:soos in hierdie geval.

>NUL en >/dev/null lei stdout om die platform se null-toestel.Selfs al het ons stilgemaak die opdrag, ons wil nie al die oorhoofse wat verband hou met pype stdin terug na vim--beste te stort dit so vroeg as moontlik. NUL is die nul-toestel op DOS, MS-DOS en Windows, nie'n geldige lêer.As van Windows 8 doorverwijzing na NUL nie gevolg in'n lêer met die naam NUL geskryf.Probeer om die skep van'n lêer op jou rekenaar met die naam NUL, met of sonder'n lêer uitbreiding:jy sal nie in staat wees om dit te doen.(Daar is verskeie ander toestel name in die Vensters wat dalk die moeite werd wees om te weet.)

~/.vimrc

Platform-Afhanklike

Van die kursus, kan jy nog steeds nie wil hê om te onthou diegene en die tipe van hulle elke keer.Dit is baie makliker om die kaart van die toepaslike opdrag om'n eenvoudiger gebruiker opdrag.Om dit te doen op die POSIX, kan jy voeg die volgende lyn aan jou ~/.vimrc lêer, skep dit as dit nie reeds bestaan nie:

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

Dit sal toelaat dat jy om te tik die :W (geval-sensitiewe) opdrag om te skryf die huidige lêer met'n super-gebruiker regte-baie makliker.

Platform-Onafhanklike

Ek gebruik'n platform-onafhanklike ~/.vimrc lêer wat synchroniseert oor rekenaars, so ek het bygevoeg multi-platform funksionaliteit te myn.Hier is'n ~/.vimrc met slegs die betrokke instellings:

#!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

As jy Vim , daar is 'n script beskikbaar met die naam sudo.vim . As jy vind dat jy 'n lêer wat jy toegang wortel moet lees oopgemaak het, tipe

:e sudo:%
Vim vervang die% met die naam van die huidige lêer en sudo: opdrag die sudo.vim script om oor te neem vir lees en skryf .

Ryan se raad is oor die algemeen goed, maar as volgende stap 3, moenie die tydelike lêer beweeg; dit sal die verkeerde eienaarskap en regte het. In plaas daarvan, sudoedit die korrekte lêer en lees in die inhoud (die gebruik van :r of dies meer) van die tydelike lêer.

As volgende stap 2, gebruik :w! om die lêer te dwing om geskryf.

As jy in insetsel af te gaan op 'n lêer wat jy sudo toegang nodig om te verander, kry jy 'n status boodskap wat sê

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

As ek dit mis, oor die algemeen ek doen

:w ~/edited_blah.tmp
:q

.. dan ..

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

.. of ..

sudo mv edited_blah.tmp /etc/blah

Daar is waarskynlik 'n minder ompad om dit te doen, maar dit werk.

'n vinnige Google blyk om hierdie raad te gee:

  1. Moenie probeer om net te lees as dit wysig.
  2. Jy kan in staat wees om die regte op die lêer verander. (Of dit sal jou laat red is tot eksperimentering.)
  3. As jy nog in elk geval geredigeer nie, behalwe om 'n tydelike lêer en dan beweeg dit.

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

Hier is nog een wat verskyn het sedert hierdie vraag beantwoord, 'n plugin genoem SudoEdit wat SudoRead en SudoWrite funksies bied, wat by verstek sal probeer om sudo eerste en gebruik su as dit misluk: http://www.vim.org/scripts/script.php?script_id=2709

Ek het hierdie in my ~ / .bashrc:

alias svim='sudo vim'

Nou wanneer ek nodig het om 'n config lêer wysig ek dit oopmaak net met svim.

'n vinnige hack jy kan oorweeg is besig met 'chmod op die lêer wat jy verwerk, te red met vim, en dan chmod terug na wat die lêer was oorspronklik.

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)

Natuurlik het ek nie hierdie benadering aanbeveel in 'n stelsel waar jy bekommerd is oor sekuriteit, soos vir 'n paar sekondes iemand kan lees / die lêer verander sonder dat jy besef.

gebruik gksudo in plaas van sudo vir gvim d.w.z.

cmap w!! w !gksudo tee >/dev/null %
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top