it-swarm-eu.dev

Při použití sudo nejsou aliasy dostupné

Dnes jsem si pohrával s aliasy a všiml jsem si, že aliasy se zdají být při použití Sudo dostupné:

[email protected]:~$ 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'

[email protected]:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

[email protected]:~$ Sudo -i
[email protected]:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
[email protected]:~# exit
logout

[email protected]:~$ Sudo ll -d /
Sudo: ll: command not found

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

172
kemra102

Přidejte následující řádek do svého ~/.bashrc:

alias Sudo='Sudo '

Z bash manual :

Aliasy umožňují nahrazení řetězce slovem, když je použit jako první slovo jednoduchého příkazu. Shell udržuje seznam aliasů, které mohou být nastaveny a deaktivovány pomocí vestavěných příkazů alias a unalias.

První slovo každého jednoduchého příkazu, pokud není uvedeno, je zkontrolováno, aby se zjistilo, zda má alias . Pokud ano, bude toto slovo nahrazeno textem aliasu. Znaky "/", "$", "" "," = "a žádný z výše uvedených metacharakterů nebo citací znaků Shell se nemusí ve jménu aliasu objevit. Náhradní text může obsahovat jakýkoli platný vstup Shell, včetně metacharakterů Shell. První slovo nahrazujícího textu je testováno na aliasy, ale slovo, které je identické s rozbaleným aliasem, není rozbaleno podruhé. To znamená, že lze například pojmenovat ls-"ls -F" a Bash se nesnaží rekurzivně rozšířit náhradní text. Pokud je posledním znakem hodnoty aliasu mezera nebo tabulátor, pak se také zkontroluje rozšíření alias dalším příkazem Word následujícím po aliasu.

(Důraz je kladen).
Bash zkontroluje pouze první slovo příkazu pro alias, všechna slova poté nebudou zkontrolována. To znamená v příkazu jako Sudo ll, bash zkontroluje pouze první slovo (Sudo), alias se ignoruje, ll je ignorováno. Můžeme říct bashovi, aby zkontroloval další slovo po aliasu (tj. Sudo) přidáním mezery na konec hodnoty aliasu.

266
Isaiah

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

5
Ragnar123

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

Zkontroluje, zda mám alias pro daný příkaz, a spustí aliasovaný příkaz namísto doslovného s Sudo v tomto případě.

Tady je moje funkce jednodílného:

Sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command Sudo [email protected] ; fi }

Nebo pěkně naformátované:

Sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command Sudo "[email protected]"
    fi 
}

Můžete jej připojit k vašemu .bashrc nezapomeňte jej načíst nebo restartovat terminálovou relaci, aby se změny projevily.

5
Byte Commander

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

Myslel jsem však na řešení příkazového řádku pro spuštění aliasu v Sudo, kde není třeba znovu definovat Sudo příkazem alias.

Tady je můj návrh pro ty, o které by mohl mít zájem:

Řešení

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

Příklad

V případě příkazu ll

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

Vysvětlení

když máte alias (například: ll), příkaz type -a vrátí aliasovaný výraz:

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

pomocí grep vyberete text mezi přízvukem `a apostrofem 'v tomto případě ls -l

A xargs provede vybraný text ls -l jako parametr Sudo.

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

3
loved.by.Jesus

@ WinEunuuchs2Unix: $PWD se rozbalí do „současného pracovního adresáře“. Myslím, že chcete $HOME.

Ve většině situací je také nejlepší mít samostatný kořenový soubor .bashrc. Ve skutečnosti bych to udělal jako skutečný soubor v /root, měkký odkaz na něj v domovském adresáři uživatele (např. .bashrc_root) a zdroj z uživatelského .bashrc soubor. Pokud tento privilegovaný uživatelský účet již neexistuje, bude root .bashrc soubor je stále k dispozici pro ostatní uživatele.

1
Shaun Griffith

Pokud zadáte Sudo -i a povýšte na Sudo Prompt (#) nebudete mít aliasy nebo funkce, které chcete používat.

Chcete-li využít své aliasy a funkce na # Prompt, použijte:

Sudo cp "$HOME"/.bashrc /root/.bashrc

Kde je „$ HOME“ rozšířeno na „/ home/YOUR_USER_NAME“

1
WinEunuuchs2Unix

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

Použijte doplnění bash k automatickému nahrazení slov za Sudo jejich aliasy při stisknutí klávesy tab.

Uložit jako /etc/bash_completion.d/Sudo-alias.bashcomp a mělo by se automaticky načíst při spuštění interaktivního prostředí Shell:

_comp_Sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    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 dobrí.

1
Evi1M4chine

Mám jiné řešení, podle kterého nemusíte jako alias přidávat Sudo. Používám Linux Mint 17.3, ale mělo by to být docela podobné Ubuntu.

Když jste root, pak .profile se spouští z domovského adresáře. Pokud nevíte, co je domovský adresář v kořenovém adresáři, můžete zkontrolovat pomocí:

Sudo su
echo $HOME

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

cd $HOME
ls -al

Měla by existovat .profile soubor. 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 s názvem .bash_aliases. Pokud jsou soubory přítomny, provede soubor.

Zachraň .profile file a vytvořte si aliasy v .bash_aliases. Pokud již máte soubor s aliasy připraven, zkopírujte soubor do tohoto umístění

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

0