Aliasy niedostępne podczas używania sudo

135

Grałem dzisiaj z aliasami i zauważyłem, że aliasy nie są dostępne podczas używania 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

Czy jest jakikolwiek powód, dla którego nie możesz używać aliasów podczas używania sudo ?

    
zadawane kemra102 17.01.2011, 23:47
źródło

8 odpowiedzi

212

Dodaj następującą linię do ~/.bashrc :

alias sudo='sudo '

Z instrukcji bash :

  

Aliasy pozwalają na zastąpienie ciągu znaków słowem, gdy jest ono używane jako pierwsze słowo prostego polecenia. Powłoka zachowuje listę aliasów, które mogą być ustawiane i unieważniane za pomocą wbudowanych komend aliasu i unali.

     

Pierwsze słowo każdego prostego polecenia, jeśli jest niecytowane, jest sprawdzane, aby sprawdzić, czy ma on alias . Jeśli tak, to słowo zostanie zastąpione tekstem aliasu. Znaki '/', '$', '' ',' = 'i dowolne metaznaki powłoki lub cytowane znaki wymienione powyżej mogą nie występować w nazwie aliasu. Tekst zastępczy może zawierać dowolne prawidłowe dane wejściowe powłoki, w tym metaznaki powłoki. Pierwsze słowo zastępującego tekstu jest testowane pod kątem aliasów, ale słowo, które jest identyczne z rozszerzanym aliasem, nie jest rozszerzane po raz drugi. Oznacza to, że można na przykład pseudo ls do "ls-F", a Bash nie próbuje rekursywnie rozszerzać tekstu zastępczego. Jeśli ostatnim znakiem wartości aliasu jest znak spacji lub tabulatora, to następne słowo polecenia po aliasie jest również sprawdzane pod kątem rozwinięcia aliasu .

(Podkreślenie).
Bash sprawdza tylko pierwsze słowo polecenia dla aliasu, żadne słowa po nim nie są sprawdzane. Oznacza to, że w komendzie takiej jak sudo ll , tylko pierwsze słowo ( sudo ) jest sprawdzane przez bash dla aliasu, ll jest ignorowane. Możemy powiedzieć bashowi, aby sprawdził następne słowo po aliasie (tzn. sudo ), dodając spację na końcu aliasu.

    
odpowiedział Isaiah 18.01.2011, 00:08
źródło
5

Napisałem funkcję Bash dla cieni sudo .

Sprawdza, czy mam alias dla podanego polecenia i uruchamia polecenie aliasowe zamiast literału z sudo w tym przypadku.

Oto moja funkcja jako jedna linijka:

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

Lub ładnie sformatowany:

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

Możesz dołączyć go do pliku .bashrc , nie zapomnij go jednak pobrać lub zrestartować później sesji terminala, aby zastosować zmiany.

    
odpowiedział Byte Commander 27.09.2016, 11:19
źródło
3

Aliasy są specyficzne dla użytkownika - musisz je zdefiniować w /root/.bashrc

    
odpowiedział Ragnar123 18.01.2011, 00:01
źródło
3
Odpowiedź

@Alvins jest najkrótsza. Bez wątpienia! : -)

Jednak pomyślałem o rozwiązaniu z linii poleceń, aby wykonać polecenie aliasingowe w sudo , gdzie nie ma potrzeby redefiniowania sudo za pomocą polecenia alias .

Oto moja propozycja dla tych, którym może ona zainteresować:

Rozwiązanie

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

Przykład

W przypadku polecenia ll

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

Objaśnienie

gdy masz alias (taki jak: ll ) polecenie type -a zwraca wyrażenie aliasowe:

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

z grep wybierasz tekst między akcentem a apostrofem w tym przypadku ls -l

I xargs wykonuje wybrany tekst ls -l jako parametr sudo .

Tak, nieco dłużej, ale całkowicie czysto ;-) Nie trzeba redefiniować sudo jako aliasu.

    
odpowiedział loved.by.Jesus 15.02.2015, 20:37
źródło
1

Mam inne fajne rozwiązanie, które dodaje trochę zaufania:

Użyj uzupełniania bash, aby automatycznie zastąpić słowa za sudo ich aliasami po naciśnięciu klawisza.

Zapisz to jako /etc/bash_completion.d/sudo-alias.bashcomp i powinno automatycznie zostać załadowane podczas uruchamiania powłoki interaktywnej:

_comp_sudo_alias() { from="$2"; 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

Następnie zaloguj się do nowego terminala i powinieneś być gotowy.

    
odpowiedział Evi1M4chine 08.09.2017, 18:09
źródło
0

@ WinEunuuchs2Unix: $PWD rozwija się do "obecnego katalogu roboczego". Myślę, że chcesz $HOME .

Ponadto w większości sytuacji najlepiej jest mieć oddzielny główny plik .bashrc. W rzeczywistości, sprawiłbym, że jest to prawdziwy plik w /root , miękki link do niego w katalogu domowym użytkownika (np. .bashrc_root ) i źródło go z pliku .bashrc użytkownika. Jeśli po jakimś czasie to uprzywilejowane konto użytkownika już nie istnieje, główny plik .bashrc jest nadal dostępny dla innych użytkowników.

    
odpowiedział Shaun Griffith 06.10.2018, 13:04
źródło
0

Mam inne rozwiązanie, w którym nie trzeba dodawać sudo jako aliasu. Używam Linux Mint 17.3, ale powinno to być bardzo podobne do Ubuntu.

Kiedy jesteś rootem, to .profile jest uruchamiany z jego katalogu domowego. Jeśli nie wiesz, co to jest katalog domowy w katalogu głównym, możesz sprawdzić za pomocą:

sudo su
echo $HOME

Jak widać, domem root jest /root/ . Sprawdź jego zawartość:

cd $HOME
ls -al

Powinien być plik .profile . Otwórz plik i dodaj następujące linie:

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

Zasadniczo to, co robi skrypt Bash, to sprawdzenie pliku o nazwie .bash_aliases . Jeśli pliki są obecne, uruchamia plik.

Zapisz plik .profile i utwórz aliasy w .bash_aliases . Jeśli masz już gotowy plik aliasów, skopiuj plik do tej lokalizacji

Uruchom ponownie terminal i jesteś gotowy do pracy!

    
odpowiedział Karthik Ramakrishnan 10.06.2016, 23:06
źródło
0

Najlepsza głosowana odpowiedź jest świetna. Jednak jeśli wpiszesz sudo -i i podniesiesz do znaku zachęty sudo ( # ), nie będziesz miał aliasów, których chcesz użyć.

Aby wykorzystać aliasy (i wszystko inne) w wierszu # , użyj:

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

Gdzie "$ PWD" jest automagicznie rozszerzane na "/ home / YOUR_USER_NAME"

    
odpowiedział WinEunuuchs2Unix 25.11.2016, 03:50
źródło

Przeczytaj inne pytania na temat tagów