GNU/Linux >> Znalost Linux >  >> Linux

Použití vim k vynucení úprav souboru při otevření bez oprávnění

Zdá se, že existují různé přístupy v závislosti na vašem aktuálním problému:

  1. Pouze pro čtení od vi. Pokud má váš soubor :set readonly můžete
    • Použijte :w! vynutit zápis, nebo
    • Vydání :set noreadonly a pak stačí použít normální :w
  2. Povolení problém (sudo ):neumíš psát, ale máš práva sudo.
    • Problém::w !sudo tee % . Tím se vyrovnávací paměť zapíše na tee , příkaz, který přijímá pipe informace a může zapisovat do souborů. A protože je tee spuštěno pomocí sudo powers, tee může soubor upravit.
  3. Povolení problém (žádné sudo ):nemáte práva k zápisu souboru a nemáte přístup správce.
    • Použijte :w! ~/tempfile.ext zapsat změny do dočasného souboru a poté provést opatření k přesunutí dočasného souboru do adresáře (odeslání dočasného souboru vlastníkovi/adminovi adresáře).

Více si o tom můžete přečíst zde:

  1. Ze StackOverflow
  2. Od Geekyboye
  3. Z Data Agaric

Zkratka

Jak to často bývá problém č. 2 (povolení problém s sudo ), můžete na svůj /etc/vim/vimrc (nebo ~/.vimrc ) následující zkratka:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Pak stačí napsat :w!! uložit pomocí sudo pravomoci. Nebudu to zde vysvětlovat, ale výše uvedené odkazy pokrývají mnoho zkratek.


Napadají mě dva způsoby, jak to udělat.

První způsob předpokládá, že soubor vlastníte, ale soubor je POUZE PRO ČTENÍ.

Stačí použít příponu vykřičníku vi k příkazu write (:w!), abyste vynutili přepsání vašeho vlastního souboru pouze pro čtení. To samozřejmě předpokládá, že máte oprávnění zapisovat a spouštět v aktuální složce.

:w!

způsobí, že vi přepíše původní soubor pouze pro čtení.

Druhý způsob předpokládá, že soubor vlastní někdo jiný a vy byste chtěli do tohoto souboru uložit své změny.

Jedním ze způsobů, jak toho dosáhnout, je uložit změny provedené v původním souboru jako skript ed z vi. Tento skript ed lze použít na původní soubor (nebo jiné podobné soubory) později mimo vi pomocí editoru ed line.

Způsob, jak uložit aktuální relaci úprav jako skript ed, je předat původní název souboru a upravenou vyrovnávací paměť vi jako standardní vstup do obslužného programu diff pomocí přepínače příkazového řádku --ed, tj. zobrazit rozdíly jako skript ed.

Takže za předpokladu upraveného vi bufferu proveďte následující

:.,$!diff --ed [original_file] -

Tím se nahradí všechny řádky v aktuální vyrovnávací paměti (.,$!) skriptem ed vygenerovaným rozdílem (diff --ed [originální_soubor] -) nezbytným pro převod původního souboru na obsah aktuální vyrovnávací paměti. Tento ed skript pak chceme uložit na bezpečné místo a použít skript na verzi původního souboru, do kterého můžeme zapisovat. Skript tedy uložte do zapisovatelného umístění, například do vaší přihlašovací složky:

:w ~/my_ed_script

Nyní ukončete vi a použijte tento skript ed k získání upraveného souboru, který nebylo možné uložit. Zde je návod, jak toho dosáhnout z příkazového řádku bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

Tato posloupnost příkazů dělá ve slovech řetězení skriptu, který jsme vygenerovali pomocí diff, a ozvěnu příkazu ed write, 'w', do standardního vstupu ed. Ed poté použije tento skript na zapisovatelnou kopii původního souboru a zapíše tyto modifikované změny vyrovnávací paměti zpět do souboru.

Takže toto je způsob, jak uložit práci provedenou ve vi do souboru, který původně vlastnil někdo jiný pomocí vi, diff a ed.


Linux
  1. Jak upravovat více souborů a přepínat mezi soubory ve VIM pomocí vyrovnávacích pamětí

  2. Sudoedit Vim Force Write (aktualizace) bez ukončení?

  3. Linux – Co se stane, když Rsync bez cílové cesty?

  1. Jak používat soubor Vimrc při příkazu Sudo pro úpravu šířky souboru?

  2. Jak otevřít soubor ve vim pomocí pipe

  3. Jak upravit soubor Excel (xlsx) pomocí linuxového shellu

  1. Jak odstranit soubor bez použití rm?

  2. Vynutit dig k vyřešení bez použití mezipaměti

  3. Proč jsem mohl smazat soubor vlastněný uživatelem root v mém domovském adresáři, aniž bych byl root?