polecenie sudo nie uruchamia źródła /root/.bashrc

27

Dodałem niestandardową ścieżkę do PATHzmiennej w moim pliku /root/.bashrc

Kiedy to zrobię sudo su; echo $PATH, wyświetli się wpis „/ path / to / custom / bins”.

Ale tak sudo sh -c 'echo $PATH', to pokazuje, /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Ścieżki folderów dodane w pliku .bashrc nie są widoczne.

Czy polecenie sudo nie ma takiego samego środowiska jak użytkownik root?


źródło

Odpowiedzi:

32

.bashrcto plik konfiguracyjny bash, tylko gdy jest wykonywany interaktywnie. Jest ładowany tylko podczas uruchamiania bash, a nie podczas uruchamiania innego programu, takiego jak sh(nawet jeśli bash jest wywoływany przez nazwę sh). I jest ładowany tylko wtedy, gdy bash jest interaktywny, a nie podczas wykonywania skryptu lub polecenia -c.

sudo sh -c 'echo $PATH'lub sudo bash -c 'echo $PATH'nie wywołuje interaktywnej powłoki, więc .bashrcnie jest zaangażowany.

sudo su; echo $PATHuruchamia interaktywną instancję powłoki roota. Jeśli to bash, to ~root/.bashrcjest ładowane. Ten fragment kodu jest wykonywany echo $PATHpo zakończeniu działania tej interaktywnej powłoki, więc cokolwiek dzieje się w powłoce interaktywnej, nie ma wpływu na to, co zostanie wydrukowane na końcu. Ale jeśli wpiszesz echo $PATHpo zachęcie interaktywnej powłoki uruchomionej przez sudo su, zobaczysz wartość ustawioną przez ~root/.bashrc.

Ponieważ .bashrcjest wywoływany w każdej interaktywnej powłoce, a nie przez powłoki logowania (nawet przez interaktywne powłoki logowania, co jest wadą projektową w bash), niewłaściwe miejsce do definiowania zmiennych środowiskowych. Służy .bashrcdo interaktywnych ustawień bash, takich jak powiązania klawiszy, aliasy i ustawienia uzupełniania. Ustaw zmienne środowiskowe w plikach, które są ładowane podczas logowania: ~/.pam_environmentlub ~/.profile.

Tak ustawić PATHw .profilezamiast .bashrc, i uruchom powłokę logowania z sudo -i 'echo $PATH', lub jawnie źródła .profilez sudo sh -c '. ~/.profile; echo $PATH'.

Gilles „SO- przestań być zły”
źródło
1
odniósł się do wielu istotnych kwestii dotyczących pocisków .... dzięki ....
1
Jak mogę to dodać .profile? Masz na myśli /root/.profileczy /home/user/.profile? Próbowałem dodać export PATH=$PATH:/mydirdo obu. Nie działało Próbowałem bez export, to też nie działało.
falsePockets
@falsePockets Nie działało na co? Powinieneś zadać nowe pytanie i dokładnie wyjaśnić, co robisz.
Gilles „SO- przestań być zły”
To, co nie działało, jest dokładnie tym samym, co OP próbuje zrobić. Próbuję dodać katalog do ŚCIEŻKI mojego administratora. Nie powinienem zadawać nowego pytania, ponieważ byłoby to duplikat tego pytania.
falsePockets
@falsePockets Ale najwyraźniej nie robisz tego samego, aby uzyskać dostęp do konta administratora. A ponieważ nie powiedziałeś, co robisz, nie mogę ci pomóc, oprócz powtórzenia tego, co jest już w mojej odpowiedzi.
Gilles „SO- przestań być zły”
14

Spójrz na opcje -Ei -i.

-E: Wskazuje w polityce bezpieczeństwa, że ​​użytkownik chce zachować istniejące zmienne środowiskowe. Polityka bezpieczeństwa może zwrócić błąd, jeśli użytkownik nie ma uprawnień do ochrony środowiska.

-i: Uruchom powłokę określoną przez wpis bazy danych haseł użytkownika docelowego jako powłokę logowania. Oznacza to, że pliki zasobów specyficzne dla logowania, takie jak .profile lub .login, zostaną odczytane przez powłokę. Jeśli podano polecenie, jest ono przekazywane do powłoki w celu wykonania za pomocą opcji -c powłoki. Jeśli nie podano polecenia, wykonywana jest powłoka interaktywna. sudo próbuje przejść do katalogu domowego tego użytkownika przed uruchomieniem powłoki. Polecenie jest uruchamiane w środowisku podobnym do tego, które użytkownik otrzyma podczas logowania. Sekcja Środowisko poleceń w podręczniku sudoers (5) dokumentuje, w jaki sposób opcja -i wpływa na środowisko, w którym polecenie jest uruchamiane, gdy zasada sudoers jest w użyciu.

Vinz
źródło
3

Możesz to zrobić sudo bash, który odczytuje bashpliki startowe zgodnie z dokumentacją na bashstronie / dokumentacji podręcznika. Należy jednak pamiętać, że może nie ustawić HOMEpoprawnie zmiennej środowiskowej. Można to naprawić w ogólnosystemowym bashpliku startowym ( /etcdokładna lokalizacja zależy od dystrybucji) - sprawdź, czy $uidjest to 0.

Ned64
źródło