Získání oprávnění uživatele root na soubor uvnitř vi?

hlasů
227

Často při editaci konfiguračních souborů, otevřu jeden s vi, a pak, když jsem jít zachránit si uvědomit, že jsem neměl psát

sudo vi filename

Existuje nějaký způsob, jak dát sudo privilegia vi soubor uložit? Vzpomínám vidět něco o této chvíli vzhlédl nějaké věci o vi před chvílí, ale teď nemůžu najít.

Položena 04/08/2008 v 04:34
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
276

% je nahrazen aktuálním názvem souboru, takže můžete použít:

:w !sudo tee %

( vimZjistí, že soubor byl změněn a zeptejte se, zda si přejete, aby byl znovu zaveden.)

Jako zkratka, můžete definovat vlastní příkaz. Vložte následující skutečnosti .vimrc:

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

S výše můžete zadat :W<Enter>pro uložení souboru. Protože jsem napsal, jsem našel jiný způsob (podle mého názoru), jak toho dosáhnout:

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

Tímto způsobem můžete psát :w!!a bude rozšířen na celý příkazového řádku, takže kurzor na konec, takže můžete nahradit %s názvem souboru svůj vlastní, pokud se vám líbí.

Odpovězeno 31/08/2008 v 20:23
zdroj uživatelem

hlasů
29

Obecně platí, že nelze změnit efektivní ID uživatele procesu vi, ale můžete to udělat:

:w !sudo tee myfile
Odpovězeno 04/08/2008 v 07:52
zdroj uživatelem

hlasů
13

Běžné Upozornění

Nejběžnější způsob, jak se kolem tohoto problému soubor jen pro čtení je otevřít rouru do aktuálního souboru jako super-uživatele pomocí implementace sudo tee. Nicméně, všechny z nejoblíbenějších řešení, které jsem našel po internetu má kombinace několika možnými výhradami:

  • Celý soubor se zapíše do terminálu, stejně jako soubor. To může být pomalé pro velké soubory, a to zejména přes pomalé připojení k síti.
  • Soubor ztrácí režimy a podobné atributy.
  • Cesty k souborům s neobvyklými znaky nebo mezery nemusí být zpracovány správně.

řešení

Obejít všechny tyto otázky, můžete použít následující příkaz:

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

Ty mohou být zkráceny, uctivě:

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

Vysvětlení

:začíná příkaz; budete muset zadat tento znak v normálním režimu spusťte zadáním příkazu. Mělo by být vynechán ve skriptech.

sil[ent]potlačí výstup z příkazu. V tomto případě chceme zastavit Press any key to continue-jako výzvu, která se zobrazí po spuštění :!příkazu.

exec[ute]spustí řetězec jako příkaz. Nemůžeme jen tak spustit :write, protože to nebude zpracovávat potřebné volání funkce.

!představuje :!příkaz: jediný příkaz, který :writepřijímá. Za normálních okolností, :writepřijímá cestu k souboru, do kterého chcete psát. :!na jeho vlastní spustí příkaz v plášti (například za použití bash -c). S :write, bude to spustit příkaz shellu, a pak psát celý soubor stdin.

sudoby mělo být zřejmé, protože to je důvod, proč jste tady. Spustit příkaz jako super-uživatel. Je tu spousta informací kolem ‚netu o tom, jak to funguje.

teetrubky stdindo daného souboru. :writenapíše stdin, pak super-uživatel teeobdrží obsah souborů a zapsat soubor. Nebude-li vytvořit nový soubor - stačí přepsat obsah - tak bude zachována režimy souboru a atributy.

shellescape()uniká speciální znaky v dané cesty souboru je vhodná pro aktuální shell. S jediným parametrem, to by obvykle jen uzavřete cestu do uvozovek, podle potřeby. Vzhledem k tomu, posíláme k plnému příkazovém řádku systému, budeme chtít projít nenulovou hodnotu jako druhý argument pro umožnění zpětného lomítka escaping jiných speciálních znaků, které by jinak mohly klopýtnutí do pláště.

@%čte obsah %registru, který obsahuje název souboru aktuální vyrovnávací paměti. To není nutně absolutní cesta, aby zajistily, že jste nezměnili aktuální adresář. V některých řešeních, uvidíte symbol komerční-at vynechány. V závislosti na umístění, %je platný výraz, a má stejný účinek jako čtení %registr. Vnořené uvnitř jiného výrazu zástupce je obecně nepovolené, ale: jako je tomu v tomto případě.

>NULa >/dev/nullpřesměrovat stdoutdo nulové zařízení na platformě. I přesto, že jsme umlčel příkaz, nechceme veškeré režijní náklady spojené s potrubím stdinzpět do vim - nejlépe ji vypsat co nejdříve. NULje null zařízení v DOS, MS-DOS a Windows, není platný soubor. Jako Windows 8 přesměrování do NUL nevedou soubor s názvem NUL zapisuje. Zkuste vytvořit soubor na ploše s názvem NULL, s nebo bez přípony: budete schopni učinit. (Existuje několik dalších jmen zařízení v systému Windows, která by mohla být stojí za to poznat.)

~ / .vimrc

Závislé na platformě

Samozřejmě, stále nechtějí pamatovat ty a zadejte ven pokaždé. Je to mnohem jednodušší zmapovat příslušný příkaz k jednoduššímu příkaz uživatele. Chcete-li to na POSIX, můžete přidat následující řádek do vašeho ~/.vimrcsouboru, jeho vytvoření, pokud není již existují:

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

To vám umožní psát: W (malá a velká písmena), příkaz zapsat aktuální soubor s oprávněními super-user - mnohem jednodušší.

Nezávislý na platformě

Já používám na platformě nezávislý ~/.vimrcsoubor, který synchronizuje mezi počítači, takže jsem přidal funkci multiplatformní do dolu. Zde je ~/.vimrcpouze s příslušnými nastaveními:

#!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
Odpovězeno 13/10/2012 v 07:54
zdroj uživatelem

hlasů
10

Pokud používáte Vim , tam je skript k dispozici s názvem sudo.vim . Pokud zjistíte, že jste otevřeli soubor, který potřebujete root přístup ke čtení, typ

: E sudo:%
Vim nahradí% s názvem aktuálního souboru, a sudo:instruuje sudo.vim skript převzít pro čtení a psaní.

Odpovězeno 24/09/2008 v 05:12
zdroj uživatelem

hlasů
7

Ryanův rada je obecně dobrá, ale pokud po kroku 3, nepohybují dočasný soubor; bude to mít špatný vlastnictví a oprávnění. Místo toho, sudoeditsprávný soubor a číst v obsahu (s využitím :rnebo podobně) dočasného souboru.

Jestliže po kroku 2, použijte :w!k vynucení soubor, které mají být písemné.

Odpovězeno 04/08/2008 v 05:04
zdroj uživatelem

hlasů
3

Když jdete do režimu vkládání na souboru, budete potřebovat přístup sudo upravit, dostanete zprávu o stavu říká

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

Jestli mi chybí, že obecně já

:w ~/edited_blah.tmp
:q

..pak..

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

..nebo..

sudo mv edited_blah.tmp /etc/blah

Tam je asi menší oklikou, jak to udělat, ale funguje to.

Odpovězeno 12/08/2008 v 19:37
zdroj uživatelem

hlasů
1

Tady je ještě jeden, který se objevil, protože tato otázka byla zodpovězena, plugin s názvem SudoEdit, který poskytuje funkce SudoRead a SudoWrite, který bude standardně snažit jako první a používat sudo su pokud se nezdaří: http://www.vim.org/scripts/ script.php? SCRIPT_ID = 2709

Odpovězeno 29/01/2010 v 18:21
zdroj uživatelem

hlasů
1

Rychlé Google Zdá se, že dát tuto radu:

  1. Nesnažte se upravovat, pokud je to jen pro čtení.
  2. Ty by mohly být schopni změnit oprávnění k souboru. (Zda nebo ne to vám umožní uložit je na experimentování.)
  3. Pokud stále upravovat tak jako tak, uložit do dočasného souboru a potom jej přesunout.

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

Odpovězeno 04/08/2008 v 04:39
zdroj uživatelem

hlasů
0

Mám to v mé ~ / .bashrc:

alias svim='sudo vim'

Teď, když jsem třeba upravit konfigurační soubor jen otevřu ji svim.

Odpovězeno 19/03/2009 v 13:51
zdroj uživatelem

hlasů
-2

Rychlý hack můžete zvážit dělá chmod na souboru, který upravujete, uložte vim, a pak chmod zpět k tomu, co byl soubor původně.

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)

Samozřejmě nemám tento přístup doporučit v systému, kde máte obavy o bezpečnost, pokud jde o několik sekund někdo může číst / měnit soubor, aniž byste si uvědomil.

Odpovězeno 05/08/2008 v 23:20
zdroj uživatelem

hlasů
-7

použití gksudo místo sudo pro GVim tzn

cmap w!! w !gksudo tee >/dev/null %
Odpovězeno 30/11/2010 v 07:33
zdroj uživatelem

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