Aliasy nejsou k dispozici při použití sudo

133

Dnes jsem si hrál s aliasy a všiml jsem si, že se zdá, že aliasy nejsou k dispozici při použitísudo:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Existuje nějaký důvod, proč nemůžete používat aliasy při použitísudo?

    
dané kemra102 17.01.2011 23:47

7 odpovědí

211

Přidejte následující řádek do složky~/.bashrc:

alias sudo='sudo '

Z příručky bash :

  

Aliasy povolí, aby řetězec byl nahrazen slovem, když je používán jako první slovo jednoduchého příkazu. Shell udržuje seznam aliasů, které mohou být nastaveny a zrušeny pomocí aliasu a unalias vestavěných příkazů.

     

První slovo každého jednoduchého příkazu, je-li nekótováno, je zkontrolováno, zda má alias . Pokud ano, je toto slovo nahrazeno textem aliasu. Znaky '/', '$', '' ',' = 'a libovolné znakové znaky shellu nebo citované znaky uvedené výše se nemusí zobrazit v aliasovém jménu. Náhradní text může obsahovat jakýkoli platný vstup shellu, včetně shell metacharacters. První slovo nahrazujícího textu je testováno na aliasy, ale slovo, které je totožné s rozbaleným aliasem, není podruhé rozbaleno. To znamená, že jeden může být alias ls na "ls -F", například, a Bash se nesnaží rekurzivně rozložit náhradní text. Je-li posledním znakem aliasu hodnota mezera nebo znak tabulátoru, pak se zaškrtne také další příkazové slovo následující po aliasu pro rozšíření aliasu .

(Důraz důl).
Bash kontroluje pouze první slovo příkazu pro alias, všechna slova po něm nejsou zaškrtnuty. To znamená, že v příkazu, jako jesudo ll, je zaškrtnuto pouze první slovo (sudo) pomocí bash pro alias,ll je ignorováno. Můžeme říci, že bash kontroluje další slovo po aliasu (tj.% Co_kde%) přidáním mezery na konec hodnoty aliasu.

    
odpověděl Isaiah 18.01.2011 00:08
5

Napsal jsem pro něj funkci Bash, která stínujesudo.

Kontroluje, jestli mám pro daný příkaz alias a spustí příkaz alias namísto doslovného s příkazemsudo.

Zde je moje funkce jako jedna linka:

sudo() { if alias "" &> /dev/null ; then $(type "" | sed -E 's/^.*'(.*).$//') "${@:2}" ; else command sudo $@ ; fi }

Nebo pěkně formátované:

sudo() { 
    if alias "" &> /dev/null ; then 
        $(type "" | sed -E 's/^.*'(.*).$//') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

Můžete jej připojit k vašemu souboru.bashrc, nezapomeňte jej znovu spustit nebo restartovat relaci terminálu poté, než provedete změny.

    
odpověděl Byte Commander 27.09.2016 11:19
3

Aliasy jsou specifické pro uživatele - musíte je definovat v/root/.bashrc

    
odpověděl Ragnar123 18.01.2011 00:01
3

@Alvins odpověď je nejkratší odpověď. Bezpochyby! : -)

Myslel jsem však na řešení příkazové řádky spustit aliased příkaz sudo , kde není potřeba definovatsudo příkazemalias.

Zde je můj návrh pro ty, kterým by se mohl zajímat:

Řešení

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\').*(?=')" | xargs sudo

Příklad

V případě příkazull

type -a ll | grep -o -P "(?<=\').*(?=')" | xargs sudo

Vysvětlení

pokud máte alias (například:ll) příkaztype -a vrací aliasový výraz:

$type -a ll
ll is aliased to 'ls -l'

sgrep zvolíte text mezi přízvukem 'a apostropem' v tomto případěls -l

Axargs provede vybraný textls -l jako parametrsudo.

Ano, trochu déle, ale zcela čisté ;-) Není třeba znovu definovatsudo jako alias.

    
odpověděl loved.by.Jesus 15.02.2015 20:37
1

Mám další pěkné řešení, které přidává trochu důvěry:

Použijte doplnění bash pro automatické nahrazování slov zasudo se svými aliasy při stisknutí karty.

Uložit jako/etc/bash_completion.d/sudo-alias.bashcomp a měl by být automaticky načten při spuštění interaktivního shellu:

_comp_sudo_alias() { from=""; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$//" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Poté se přihlaste k novému terminálu a měli byste být v pořádku.

    
odpověděl Evi1M4chine 08.09.2017 18:09
0

Mám jiné řešení, které nepotřebuje přidávatsudo jako alias. I run Linux Mint 17.3, ale měl by to být docela podobný Ubuntu.

Pokud jste kořen, spustí se.profile z jeho domovského adresáře. Pokud nevíte, jaký je domovský adresář v kořenovém adresáři, můžete se podívat na:

sudo su
echo $HOME

Jak vidíte, domaroot je/root/. Zkontrolujte jeho obsah:

cd $HOME
ls -al

Měl by existovat soubor.profile. Otevřete soubor a přidejte následující řádky:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

V podstatě to, co tento bash skript dělá, je zkontrolovat soubor nazvaný.bash_aliases. Pokud jsou soubory přítomny, spustí soubor.

Uložte soubor.profile a vytvořte aliasy v.bash_aliases. Pokud již máte soubor aliasů připraven, zkopírujte soubor do tohoto umístění

Znovu spusťte terminál a je dobré jít!

    
odpověděl Karthik Ramakrishnan 10.06.2016 23:06
0

Nejlepší hlasovaná odpověď je skvělá. Pokud však zadátesudo -i a zvýšíte příkaz sudo (#), nebudete mít alias, který chcete použít.

Chcete-li použít aliasy (a vše ostatní) na výzvě#, použijte:

sudo cp "$PWD"/.bashrc /root/.bashrc

Kde se "$ PWD" automaticky rozbalí do adresáře "/ home / YOUR_USER_NAME"

    
odpověděl WinEunuuchs2Unix 25.11.2016 03:50