GNU/Linux >> Znalost Linux >  >> Linux

Vykonat řadu příkazů jedním sudem?

Například pokud chci vytvořit soubor a zadat text na jeden řádek, mohu přesměrovat výstup do souboru pomocí > operátor:

echo "something" > /path/foobar

ale pokud nemám přístup ke složce /path/ a potřebujete oprávnění sudo, Jak mohu dosáhnout stejného příkazu jako normální uživatel s právy sudo?

Zkusil jsem

sudo echo "something" > /path/foobar

ale to nefunguje, protože sudo se počítá pouze pro edit ale ne pro pravou část
>

Jistě, mohl jsem se dříve stát rootem pomocí sudo su nebo použijte tee místo toho:

echo "something" | sudo tee /path/foobar

Ale rád bych našel řešení, kde bych mohl pracovat s posledním řádkem jako náhradou přes

sudo !!

Neexistuje způsob, jak „recyklovat“ poslední řádek a jednoduše přidat sudo vpředu?

Přijatá odpověď:

Nemůžete jen tak nalepit sudo před příkazem shellu musíte vyvolat shell, abyste tento příkaz znovu vyhodnotili (provedení věcí jako rozbalení proměnných, otevření souborů pro operátory přesměrování atd.). Takže to je

sudo bash -c !!

až na to, že to tak úplně nefunguje, protože !! interpoluje text předchozího příkazu, speciální znaky a vše. Musíte načíst text příkazu jako řetězec a předat jej jako argument do sh . Naštěstí bashův fc vestavěný vám to umožní¹.

sudo bash -c "$(fc -ln -1)"

Nebo dokonce, abyste si byli jisti, že vyvoláte stejnou verzi bash, která aktuálně běží:

sudo "$BASH" -c "$(fc -ln -1)"

Všimněte si, že protože se příkaz provádí v samostatném procesu shellu, dědí proměnné prostředí (pouze ty, které sudo zachovává, mysl), ale ne vnitřní proměnné shellu. Možnosti prostředí (např. kshglob ) a další nastavení začnou také od výchozího nastavení.

Stejný příkaz² funguje v zsh a ksh, ačkoli ATT ksh93 vyžaduje oba first a last číslo, které má být předáno fc ³ (který funguje také v bash, zsh a pdksh/mksh):

sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"

Pomocí $0 označení spustitelného souboru běžícího shellu funguje pouze v případě, že byl shell vyvolán přes $PATH a $PATH se nezměnilo, nebo přes absolutní cestu.

Zde je další metoda v zsh, která je o něco jasnější, ale delší:

sudo zsh -c $history[$[HISTCMD-1]]

Poslední slovo varování:sudo je pro potenciálně nebezpečné příkazy. Neusnadňujte si jeho používání!

Související:Může sed nahradit znaky nového řádku?

¹ Na začátku jsou nějaké mezery navíc a substituce příkazu odstraňuje nové řádky na konci, ale syntaxe shellu se o to nestará.
² Nemyslím si, že zsh nebo ksh mají něco jako bashův $BASH; $0 funguje pouze tehdy, když je to absolutní cesta nebo když neobsahuje žádné lomítko a cesta pro vyhledávání příkazu se nezměnila.
³ fc je alias pro hist v ATT ksh, ale to je stejně dobré.


Linux
  1. Proveďte kombinaci více příkazů Linuxu na jednom řádku

  2. Spusťte dva příkazy pomocí docker exec

  3. Expanze závorky:spustit několik příkazů místo rozbalení na jednom řádku?

  1. Provést příkaz Nohup se vstupem?

  2. nahradit řádky v jednom souboru řádky v jiném číslem řádku

  3. sudo nefunguje na určitých příkazech

  1. Jak namapovat jeden příkaz Vim k provádění příkazů Bash založených na OS?

  2. Jak mohu provést řadu příkazů v subshell bash jako jiný uživatel pomocí sudo?

  3. Spojte dva řetězce v jednom řádku s grep