Dostosowałem .bashrc
za pomocą szeregu aliasów, ll
a konkretnie iexport LS_OPTIONS='--color=auto'
Niestety nie działa to w połączeniu z sudo
, więc również zmodyfikowałem /root/.bashrc
, ale wydaje się, że to nie miało znaczenia.
sudo env
pokazy HOME=/root
iSHELL=/bin/bash
Jak mogę uzyskać sudo
polecenia do używania ustawień /root/.bashrc
?
Rozumiem, że dzieje się tak tylko wtedy, gdy bash
jest wykonywany interaktywnie, dlatego jestem otwarty na wszelkie inne sugestie dotyczące sposobu dostosowania.
/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/… .-r
opcjącrontab
:crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}
. Działa to, gdy jestem zalogowany jako jeden z użytkowników, jednak po uruchomieniusudo crontab -r
nadal działa.Odpowiedzi:
sudo
uruchamia plik wykonywalny, a nie polecenie powłoki. Więc nie wie o aliasach. Jeśli uruchomiszsudo ls
,sudo /bin/ls
to znaczy, że nie używa żadnegols
aliasu, który możesz mieć.Możesz spowodować
sudo ls
rozszerzenie aliasu, umieszczając w swoim.bashrc
:Zwróć uwagę na spację końcową - to każe powłoce kontynuować ekspansję aliasu ze słowem, które następuje po
sudo
. Uwaga: rozszerzanie aliasów po sudo nie zawsze jest dobrym pomysłem, zależy to od rodzaju aliasów.Ponadto sudo usuwa większość zmiennych ze środowiska. Nie wpłynie to na alias
alias ls='ls $LS_OPTIONS'
, ponieważ jest to zmienna powłoki używana przez powłokę podczas rozwijania polecenia (i eksportowanie jej z.bashrc
nie służy żadnemu celowi). Wpłynęłoby to jednak na zmienne używane przez polecenie, takie jakLS_COLORS
. Możesz skonfigurować sudo, aby zachować pewne zmienne środowiskowe, edytując jego konfigurację: uruchomvisudo
i dodaj linięDzięki tym ustawieniom
sudo ll
otrzymasz kolory, do których jesteś przyzwyczajony.Alternatywnie możesz uruchomić powłokę root za pomocą
sudo -s
. Ta powłoka załaduje swój plik konfiguracyjny (~/.bashrc
dla bash). W zależności od konfiguracji sudo może to byćHOME
ustawione na katalog domowy lub zmienić na/root
. Możesz wymusić ustawienie katalogu domowego na rootsudo -Hs
; i odwrotnie, aby zachować oryginalny katalog domowy, uruchomsudo env HOME="$HOME" bash
.źródło
Dziękuję tym, którzy odpowiedzieli, którzy skłonili mnie do
man sudo
bardziej uważnego przeczytania .sudo -s
Jeśli nie podano żadnego polecenia, wykonywana jest powłoka interaktywna.Ta interaktywna powłoka używa,
/root/.bashrc
a zatem zawiera moje dostosowania.Wymaga osobnego wprowadzenia polecenia, ale jest to w porządku.
źródło
tło
Zawsze czułem, że to pytanie jest problemem XY . Tytuł sugeruje, że chcą czegoś poza,
/root/.bashrc
ale tak naprawdę to, o co chodzi, to aliasy z tego pliku - powszechnie uważa się, że nie jest to możliwe - Dlaczego mój skrypt Bash nie rozpoznaje aliasów? .Zasadniczo jest to z założenia, że twoje aliasy nie zostaną rozpoznane
sudo
w innych miejscach, ponieważ nie są przenośne, i to też jest moja opinia na ich temat.Wszystko, co znajduje się w środowisku użytkownika, nie powinno być uwzględniane przez skrypty i żadne oprogramowanie, które może działać na danym urządzeniu. Ale zdaję sobie sprawę, że istnieją scenariusze, w których na koncie danego użytkownika mogą znajdować się aliasy,
$HOME/.bashrc
które inni mogą chcieć wykorzystać w interaktywnych scenariuszach.W tym celu możesz po prostu powiedzieć interpreterowi Bash, aby rozwinął wszelkie aliasy, które znajdzie podczas procesu logowania, poza normalnymi zachowaniami powłoki, na które natrafisz podczas używania
sudo
.Przykład
Ustawiać
Aby to skonfigurować, dodałem następujące aliasy, zmienne środowiskowe i funkcje do mojego użytkownika root
/root/.bashrc
i/root/.bash_profile
plików.Bez robienia czegokolwiek z tych prac (bez niespodzianek):
Widzimy, że
alias
polecenie nie wyświetla aliasów po uruchomieniusudo
:Takie zachowanie jest wskazówką, że nie należy oczekiwać, że aliasy będą dostępne. Ale kontynuujemy ...
Krok # 1 - widoczne aliasy
Jeśli uruchomimy
bash -ci
, możemy skłonić Basha do przeczytania przynajmniej$HOME/.bashrc
:Fajnie, więc może możemy to uruchomić?
Krok 2 -
shopt -s expand_aliases
Nie. Znowu jest to zgodne z projektem, robimy coś, czego nie powinniśmy robić, więc istnieje szereg „zabezpieczeń”, które musimy wyłączyć. drugim „bezpieczeństwem” jest Bash.
Tutaj widzimy naszą wiadomość, z
/root/.bashrc
powodzeniem wykonaliśmy alias użytkownika rootbrc_smurf
.Krok # 3 - co z warnikami env?
Jeśli używasz metody pokazanej powyżej, powinny one również działać.
Krok # 4 - co z funkcjami?
Działa to również zgodnie z oczekiwaniami:
TLDR;
Możesz to zrobić, aby uzyskać dostęp do zmiennych środowiskowych + aliasów z
/root/.bashrc
:Wynos
Ta metoda włącza zawartość
/root/.bashrc
, nie pobiera zawartości/root/.bash_profile
.Bibliografia
źródło
.bashrc
sudo; konkretnie usuwając-r
opcję zcrontab
?sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'
zamiast zwykłegosudo echo $brc_smurf_env
?alias
, to było po prostu ich pokazać, musisz to zrobićsudo bash -ci 'shopt -s expand_aliases; <cmds>'
W pliku / etc / sudoers znajduje się kilka ustawień lub konfiguracja środowiska, w którym uruchamiane są polecenia sudo (np. Upewnij się, że PATH ma tylko zaufane lokalizacje), ale w zależności od tego, co chcesz z tego wydostać możesz nie być w stanie zrobić tego, czego szukasz, jeśli wymaga to uruchomienia rzeczywistych poleceń w powłoce w celu skonfigurowania środowiska. Sudoing specjalnie nie daje powłoki logowania roota, więc nie utworzy dla ciebie zwykłego profilu.
źródło
Powiedzmy, że edytujemy /root/.bashrc, aby być:
Pozwala się wylogować i zalogować ponownie, aby bash odczytał plik:
Jak widać plik został odczytany, zmieniono ŚCIEŻKĘ i ustawiono aliasy. Wszystko działa tak, jak prosisz.
Jednak sudo nadal nie będzie działać zgodnie z oczekiwaniami.
ŚCIEŻKA się nie zmieniła. Mogą istnieć sposoby zmiany ścieżki w sudoers, ale zdecydowanie zalecamy unikanie tego. Poza tym aliasy, funkcje i niektóre inne zmiany nadal nie zostaną zastosowane przez zmianę tylko ŚCIEŻKI. Plik musi zostać pobrany. Wykonanie tego dla każdego skryptu lub polecenia spowoduje, że komputer wykona więcej pracy bez żadnych rzeczywistych korzyści. Skrypty nie używają aliasów (nie ma praktycznego zastosowania w skryptach).
Po prostu zaloguj się,
.bashrc
plik zostanie automatycznie załadowany i zacznie działać.Możesz rozpocząć bash w następujący sposób:
Ale jak widać powyżej, pwd (katalog roboczy) nie zmienił się, a jeśli przyjrzysz się nieco więcej, niektóre inne ustawienia również się nie zmieniły. Dlatego poprawnym poleceniem jest użycie:
Jeśli to polecenie jest zbyt długie, aby je wpisać, utwórz alias lub funkcję użytkownika (nie root), w której będzie ono używane, coś w stylu:
źródło
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: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 uruchomieniesudo ll
będzie działać tylko wtedy, gdyll
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
lubsudo bash
chociaż nowoczesnysudo
(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 zsudo bash -c 'll'
założeniem, że masz$SHELL
Bash, co wydaje się być oparte na tymrcfile
, 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 jednaksudo -i ll
(odpowiedniksudo bash -l -c 'll'
) nadal nie będzie działać. Więc jak to możliwe, biorąc pod uwagę, że nie czytać definicjill
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
(lubbash -l
) jest powłoką logowania , ale nadal nie jest interaktywna.Następnym krokiem jest uzyskanie interaktywnej powłoki, która następnie działa :
( 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ż:
(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 :A jeśli masz dłuższą linię poleceń z argumentami, możesz przekazać je również tutaj:
(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:
Można włączyć tę funkcję:
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!
źródło
sudo -i command arguments
, aby móc uruchomić funkcje z/root/.bashrc
i są eksportowane zmienne dostępne. Ale widzę, że moja odpowiedź była może zbyt długa, a ta informacja była tam trochę zakopana ... Więc dodałem TL; DR, żeby to podsumować (wciąż zachowując techniczne szczegóły dochodzenia.) Proszę spojrzeć jeszcze raz.