Å få root rettigheter på en fil inne i vi?

stemmer
229

Ofte mens du redigerer config filer, vil jeg åpne en med VI og deretter når jeg går for å redde den innse at jeg ikke skriver

sudo vi filename

Er det noen måte å gi VI sudo privilegier for å lagre filen? Jeg synes å huske å se noe om dette mens du ser opp noen ting om vi en stund siden, men nå kan jeg ikke finne den.

Publisert på 04/08/2008 klokken 03:34
kilden bruker
På andre språk...                            


11 svar

stemmer
278

% er erstattet med den nåværende filnavn, slik at du kan bruke:

:w !sudo tee %

( vimVil oppdage at filen er blitt endret, og spør om du vil det skal lastes på nytt.)

Som en snarvei, kan du definere din egen kommando. Sett følgende i .vimrc:

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

Med ovennevnte kan du skrive :W<Enter>lagre filen. Siden jeg skrev dette, har jeg funnet en bedre måte (etter min mening) for å gjøre dette:

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

På denne måten kan du skrive :w!!og det vil bli utvidet til hele kommandolinjen, slik at markøren på slutten, slik at du kan erstatte den %med et filnavn av din egen, hvis du vil.

Svarte 31/08/2008 kl. 19:23
kilden bruker

stemmer
30

Vanligvis kan du ikke endre den effektive bruker-IDen til vi prosessen, men du kan gjøre dette:

:w !sudo tee myfile
Svarte 04/08/2008 kl. 06:52
kilden bruker

stemmer
13

vanlige Advarsler

Den mest vanlige metode for å komme rundt skrivebeskyttet fil problemet er å åpne et rør for strøm fil som superbruker, ved anvendelse av en implementering av sudo tee. Men alle de mest populære løsningene som jeg har funnet rundt på Internett har en kombinasjon av en flere mulige forklaringer:

  • Hele filen blir skrevet til terminalen, samt filen. Dette kan være treg for store filer, spesielt på langsomme nettverkstilkoblinger.
  • Filen mister sine moduser og lignende attributter.
  • Filbaner med uvanlige tegn eller mellomrom kan ikke håndteres riktig.

Solutions

For å komme rundt alle disse problemene, kan du bruke følgende kommando:

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

Disse kan bli forkortet, respektfullt:

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

Forklaring

:begynner kommandoen; du må skrive dette tegnet i normal modus for å begynne å skrive en kommando. Det bør utelates i skript.

sil[ent]undertrykker produksjonen fra kommando. I dette tilfellet ønsker vi å stoppe Press any key to continue-lignende meldingen som vises etter å ha kjørt :!kommandoen.

exec[ute]kjører en streng som en kommando. Vi kan ikke bare kjøre :writefordi det ikke vil behandle den nødvendige funksjonskall.

!representerer :!kommandoen: den eneste kommando som :writeaksepterer. Normalt :writetar en filstien til å skrive. :!i seg selv driver en kommando i et skall (for eksempel ved hjelp av bash -c). Med :write, det vil kjøre kommandoen i skallet, og deretter skrive hele filen til stdin.

sudobør være åpenbart, siden det er derfor du er her. Kjør kommando som superbruker. Det finnes mye informasjon rundt 'nettet om hvordan det fungerer.

teerør stdintil den gitte filen. :writevil skrive til stdin, så super-brukeren teefår filinnholdet og skrive filen. Det vil ikke opprette en ny fil - bare overskrive innhold - så filen moduser og attributter vil bli bevart.

shellescape()unnslipper spesielle tegn i en gitt fil banen som passer for den aktuelle skall. Med bare ett parameter, vil det vanligvis bare legge banen i anførselstegn som nødvendig. Siden vi sender til en full skall kommandolinje, vi ønsker å passere en annen verdi enn null som det andre argumentet for å muliggjøre skråstrek-rømming av andre spesialtegn som ellers kan turen opp skallet.

@%leser innholdet i %registeret, som inneholder den nåværende buffer filnavn. Det er ikke nødvendigvis en absolutt sti, så sørg for at du ikke har endret gjeldende katalog. I noen løsninger, vil du se den kommersielle-at symbol utelatt. Avhengig av plassering, %er et gyldig uttrykk, og har samme effekt som å lese %register. Nestet inne i et annet uttrykk hurtig er generelt ikke tillatt, men: som for eksempel i dette tilfellet.

>NULog >/dev/nullomdirigere stdouttil plattformens null enhet. Selv om vi har stilnet kommandoen, ønsker vi ikke alle av overhead forbundet med rør stdintilbake til vim - best å dumpe det så tidlig som mulig. NULer null enhet på DOS, MS-DOS og Windows, ikke en gyldig fil. Per i Windows 8 omadresseringer til NUL ikke resultere i en fil som heter NUL blir skrevet. Prøv å lage en fil på skrivebordet som heter NUL, med eller uten en filtype: vil du være i stand til å gjøre det. (Det finnes flere andre enhetsnavn i Windows som kan være verdt å bli kjent.)

~ / .Vimrc

Platform-Dependent

Selvfølgelig, du fortsatt ikke ønsker å huske dem og skrive dem ut hver gang. Det er mye lettere å kartlegge den aktuelle kommandoen til en enklere brukerkommando. For å gjøre dette på POSIX, kan du legge til følgende linje i ~/.vimrcfilen, og skaper den hvis den ikke allerede finnes:

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

Dette vil tillate deg å skrive: W (store og små bokstaver) kommandoen til å skrive den aktuelle filen med superbrukertillatelser - mye enklere.

Plattformuavhengig

Jeg bruker en plattformuavhengig ~/.vimrcfil som synkroniserer flere maskiner, så jeg lagt multi-plattform funksjonalitet til mine. Her er en ~/.vimrcmed bare de relevante innstillinger:

#!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
Svarte 13/10/2012 kl. 06:54
kilden bruker

stemmer
10

Hvis du bruker Vim , det er et script tilgjengelig heter sudo.vim . Hvis du finner ut at du har åpnet en fil som du trenger root-tilgang til å lese, type

: E sudo:%
Vim erstatter% med navnet på den aktuelle filen, og sudo:instruerer sudo.vim skriptet til å ta over for lesing og skriving.

Svarte 24/09/2008 kl. 04:12
kilden bruker

stemmer
7

Ryan råd er generelt god, men hvis følgende trinn 3, ikke flytte den midlertidige filen; det vil ha feil eierskap og rettigheter. I stedet sudoeditriktig fil og leses i innholdet (ved hjelp :reller lignende) av den midlertidige filen.

Hvis følgende trinn 2, kan du bruke :w!for å tvinge den filen som skal skrives.

Svarte 04/08/2008 kl. 04:04
kilden bruker

stemmer
3

Når du går inn i innsettingsmodus på en fil du trenger sudo tilgang til å redigere, får du en statusmelding som sier

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

Hvis jeg går glipp av det, som regel gjør jeg

:w ~/edited_blah.tmp
:q

..deretter..

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

..eller..

sudo mv edited_blah.tmp /etc/blah

Det er sannsynligvis en mindre rundkjøring måte å gjøre det, men det fungerer.

Svarte 12/08/2008 kl. 18:37
kilden bruker

stemmer
1

Her er en annen som har dukket opp siden dette spørsmålet ble besvart, en plugin kalt SudoEdit som gir SudoRead og SudoWrite funksjoner, som vil som standard prøver å bruke sudo først og su hvis det mislykkes: http://www.vim.org/scripts/ script.php? SCRIPT_ID = 2709

Svarte 29/01/2010 kl. 17:21
kilden bruker

stemmer
1

Et raskt Google ser ut til å gi dette rådet:

  1. Ikke prøv å redigere hvis det er skrivebeskyttet.
  2. Du kan være i stand til å endre rettighetene på filen. (Hvorvidt det vil la deg lagre er opp til eksperimentering.)
  3. Hvis du fortsatt redigert uansett, lagre til en midlertidig fil og deretter flytte den.

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

Svarte 04/08/2008 kl. 03:39
kilden bruker

stemmer
0

Jeg har dette i min ~ / .bashrc:

alias svim='sudo vim'

Nå når jeg trenger å redigere en config fil jeg bare åpne den med svim.

Svarte 19/03/2009 kl. 12:51
kilden bruker

stemmer
-2

En rask hack du kan vurdere er å gjøre en chmod på filen du redigerer, lagre med vim, og deretter chmod tilbake til hva filen opprinnelig var.

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)

Selvfølgelig anbefaler jeg ikke denne tilnærmingen i et system hvor du er bekymret for sikkerheten, som i noen sekunder hvem som helst kan lese / endre filen uten at du realisere.

Svarte 05/08/2008 kl. 22:20
kilden bruker

stemmer
-7

bruke gksudo stedet for sudo for gvim dvs.

cmap w!! w !gksudo tee >/dev/null %
Svarte 30/11/2010 kl. 06:33
kilden bruker

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