Aktualizowałem niektóre domyślne profile bash i z samouczków, które obserwowałem, mogłem ponownie załadować nowy profil z nowymi ustawieniami środowiska za pomocą:
source /etc/bash.bashrc
Jedyną rzeczą jest - nowe zmienne środowiskowe były dostępne tylko dla mojego obecnego użytkownika - i zostały zignorowane, gdy użyłem sudo. Zostały one udostępnione sudo dopiero po zamknięciu sesji terminalu i ponownym przyłączeniu się.
Kiedy próbuję użyć:
sudo source /etc/bash.bashrc
Dostaję błąd:
sudo: source: command not found
Czy istnieje prosty sposób na załadowanie nowych ustawień profilu bash dla sudo bez konieczności zamykania terminala i restartowania?
- Początkowo korzystałem ze skryptów instalacyjnych, które odwoływały się do zmiennych. Przekonałem się, że chociaż mogą uzyskiwać dostęp do zmiennych, gdy bezpośrednio wywoływałem skrypty (chociaż spowodowałoby to późniejszy problem z tworzeniem katalogów, ponieważ musiałem być rootem), wywoływanie skryptów instalacyjnych za pomocą sudo nie.
Udowodniłem to, testując za pomocą tych prostych poleceń:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
Pierwszy wypisuje wartość zmiennej, ale drugi niczego nie wypisze.
źródło
Odpowiedzi:
Problem polega na tym, że
source
jest to wbudowana komenda bash (a nie program podobny dols
lubgrep
). Myślę, że jednym z podejść jest zalogowanie się jako root, a następnie wykonanie polecenia źródłowego.źródło
source
jest to wbudowana powłoka.sudo su
jest rodzajem dziwnego sposobu na powiedzenie tego - lepiej po prostu powiedzieć,sudo -s
który jest sposobem sudo na powiedzenie „uruchom powłokę jako ten użytkownik”. Wersja jednowierszowa nie będzie działać, ponieważ każda z zawartych w niej komend jest uruchamiana przez powłokę głównego użytkownika w osobnym podprocesie.su
uruchamia nową powłokę, a „źródło” jest uruchamiane dopiero po jego zakończeniu. Pierwszy przykład działa tylko wtedy, gdy drugi wiersz jest używany w powłoce głównej.sudo -s
nie jest lepszy niżsudo su
. I tak nie przyniesie żadnego efektu.sudo -s
ma podobny efekt jak uruchomienie powłoki, ale wydaje mi się, że nieładne jest umieszczanie dwóch poleceń „stań się innym użytkownikiem”, kiedy to zrobi.Problemem nie jest to, że
source
jest to wbudowane polecenie powłoki. Fakt, że to właśnie rzuca cicommand not found
błąd, ale to nie znaczy, że to by działało.Rzeczywistym problemem jest działanie zmiennych środowiskowych. I działają w ten sposób: za każdym razem, gdy uruchamiany jest nowy proces, jeśli nic się nie dzieje, dziedziczy środowisko jego rodzica. Z tego powodu użycie podpowłoki (np. Pisanie
bash
w instancji bash) i spojrzenie na wynikenv
powinien dać podobne wyniki niż jego rodzic.Jednak ze względu na to, jak
sudo
działa (jak podano na stronie podręcznika), sudo próbuje usunąć środowisko użytkownika i utworzyć „domyślne” środowisko dla użytkownika zastępującego, aby uruchomienie polecenia było uruchamiane tak, jakby użytkownik, który go wywołał, miał był użytkownikiem wywołującym (co jest oczekiwanym zachowaniem), a zatem uruchamianie programu nautilus tak, jaksudo nautilus
powinien otworzyć folder w/root
folderze, a nie/home/yourusername
.Więc:
Wykonanie czegoś takiego,
sudo source script.sh
a potemsudo command
, nawet jeśli zadziałałoby, nie powiodło się ustawienie żadnej zmiennej na późniejsudo command
.Aby przekazać zmienne środowiskowe, możesz albo powiedzieć sudo, aby zachowało środowisko (za pomocą
-E
przełącznika i mieć odpowiednie uprawnienia w pliku sudoers) i / lub ustawić je dla polecenia jakosudo VAR1=VALUE1 VAR2=VALUE2 command
.źródło
Używając podstawiania procesu bash możesz:
źródło
sudo
aby uzyskać dostęp do profilu. Powyższe umożliwia importowanie profilu przy jednoczesnym uniknięciusudo: source: command not found
wspomnianego problemu.Jak mówi Marcos , twoim głównym problemem tutaj jest
source
wbudowane polecenie powłoki, które wpływa tylko na proces powłoki, w którym jest uruchomiony.Prostym rozwiązaniem jest po prostu uruchomienie nowej powłoki jako root, a bash automatycznie odczyta po uruchomieniu
/etc/bash.bashrc
. To tak proste, jak tylko powiedzenieźródło
Zamknięcie i ponowne otwarcie terminala nie powinno zmienić rzeczy. Domyślnie sudo usuwa środowisko. Aby to wyłączyć, dodaj -E do sudo.
źródło
Błąd występuje, ponieważ plik binarny, który próbujesz wywołać z wiersza poleceń, jest tylko częścią zmiennej PATH bieżącego użytkownika, ale nie jest częścią PATH użytkownika root.
Możesz to sprawdzić, lokalizując ścieżkę pliku binarnego, do którego próbujesz uzyskać dostęp. W moim przypadku próbowałem nazwać „bettercap-ng”. Więc pobiegłem
Sprawdziłem, czy ta lokalizacja jest częścią ŚCIEŻKI mojego użytkownika root.
Więc sudo nie może znaleźć pliku binarnego, który próbuję wywołać z wiersza poleceń. W związku z tym zwraca polecenie błędu nie znaleziono.
Możesz polecić sudo, aby używał ŚCIEŻKI bieżącego użytkownika podczas wywoływania pliku binarnego, jak poniżej.
W rzeczywistości można z niego zrobić alias:
Można także nazwać sam alias sudo, zastępując oryginalne sudo.
źródło