Om wortel permissions op'n lêer binnekant van vi?
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.
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
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:
- Moenie probeer om net te lees as dit wysig.
- Jy kan in staat wees om die regte op die lêer verander. (Of dit sal jou laat red is tot eksperimentering.)
- As jy nog in elk geval geredigeer nie, behalwe om 'n tydelike lêer en dan beweeg dit.
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 %