TL; DR: Możesz użyć sudo -i
do uruchomienia funkcji zdefiniowanej /root/.bashrc
(ale nie aliasu), a także mieć dostęp do zmiennych eksportowanych z tego pliku:
Argumenty polecenia sudo -i
Aliasy tam jednak nie działają, ale możesz łatwo przekonwertować je na funkcje, jeśli chcesz je udostępnić sudo -i
.
Czytaj dalej, aby uzyskać pełną analizę i więcej szczegółów.
Jest tu kilka problemów, niektóre z tego, jak działa sudo, a niektóre z samego bash ...
Domyślnie sudo
szuka tylko poleceń i omija powłokę, więc po prostu uruchomienie sudo ll
będzie działać tylko wtedy, gdy ll
w jednym z katalogów znajduje się plik wykonywalny $PATH
. Tak więc, aby użyć aliasów (lub funkcji), musisz upewnić się, że powłoka jest wywoływana jako część procesu.
Jednym ze sposobów byłoby uruchomienie czegoś podobnego sudo sh
lub sudo bash
chociaż nowoczesny sudo
(testuję to na sudo 1.8.19p1) ma opcje -s
i -i
do tego celu.
Tak więc jedna próba byłaby czymś podobnym sudo -s ll
(co jest równoważne z sudo bash -c 'll'
założeniem, że masz $SHELL
Bash, co wydaje się być oparte na tym rcfile
, o którym wspomniałeś). Ale to też nie działa, ponieważ uruchamia powłokę w sposób nieinteraktywny, tryb bez logowania, który nie odczytuje żadnych plików startowych. Zasadniczo jest tak samo, jakbyś napisał skrypt powłoki i użył go #!/bin/bash
do uruchomienia. Aliasy (i funkcje), które masz w swoim ~/.bashrc
, nie będą dostępne z tego skryptu ...
Następna jest -i
opcja, która tworzy powłokę logowania. To bardziej obiecujące, ponieważ będzie czytać swoje pliki startowe! A jednak sudo -i ll
(odpowiednik sudo bash -l -c 'll'
) nadal nie będzie działać. Więc jak to możliwe, biorąc pod uwagę, że nie czytać definicji ll
aliasu?
Cóż, kolejne wyjaśnienie tutaj jest takie, że domyślnie bash nie będzie rozwijał aliasów, z wyjątkiem sytuacji, gdy powłoka jest interaktywna ... Ta powłoka uruchomiona przez sudo -i
(lub bash -l
) jest powłoką logowania , ale nadal nie jest interaktywna.
Następnym krokiem jest uzyskanie interaktywnej powłoki, która następnie działa :
sudo bash -i -c 'll'
( Oczywiście zarówno logowanie, jak i interaktywne również są w porządku bash -l -i -c ...
).
Inną alternatywą jest dalsze używanie powłoki logowania (nieinteraktywnej), ale wyraźne poproszenie jej o rozwinięcie aliasów, aby działało to również:
sudo bash -l -O expand_aliases -c 'll'
(Przypadek, w którym bash był interaktywny, nie wymagał powłoki logowania , ponieważ to wystarczy, aby odczytać pliki inicjujące, ale ten musi -l
je przeczytać).
Są to dość długie wiersze poleceń ... Wymagają również zacytowania całego polecenia powłoki, więc jeśli wywołujesz alias z argumentami, musisz przekształcić to wszystko w ciąg znaków ... Więc to jest rodzaj niezdarny w użyciu ...
Zauważ, że wcześniej mówiłem o aliasach i funkcjach ... To było celowe, ponieważ funkcje są tutaj o wiele wygodniejsze. Nie potrzebujesz niczego specjalnego (takiego jak posiadanie interaktywnej powłoki lub ustawienie konkretnej opcji) do wykonywania funkcji w powłoce, o ile pozyskujesz ich definicję.
Więc jeśli zdefiniowałeś ll
jako funkcję zamiast aliasu, możesz użyć go bezpośrednio za pomocą -i
skrótu sudo :
sudo -i ll
A jeśli masz dłuższą linię poleceń z argumentami, możesz przekazać je również tutaj:
sudo -i ll -C -R /etc
(Porównaj z sudo bash -i -c 'll -C -R /etc'
.)
Funkcje są również znacznie bardziej elastyczne i zazwyczaj łatwiejsze w utrzymaniu ... Zazwyczaj alias można przekształcić w funkcję, jedynym zastrzeżeniem jest zawsze używanie "$@"
tam, gdzie można oczekiwać dodatkowych argumentów (zwykle na końcu Alias.)
Na przykład ten alias:
alias ll='ls $LS_OPTIONS -l'
Można włączyć tę funkcję:
ll () {
ls $LS_OPTIONS -l "$@"
}
W większości przypadków są one równoważne. Jak wspomniano wcześniej, funkcja powinna być dostępna bezpośrednio z sudo -i
, więc jest to dodatkowy bonus.
Mam nadzieję, że ta odpowiedź i wyjaśnienie okażą się pomocne!
/root/.bashrc
ale tak naprawdę to, o co chodzi w Q, to aliasy z tego pliku - w tym przypadku nie jest to możliwe - unix.stackexchange.com/questions/1496/… .