sudo: źródło: nie znaleziono polecenia

54

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.

HorusKol
źródło
Jak próbowałeś użyć zmiennych z sudo? Pamiętaj, że jeśli użyjesz „sudo command $ zmienna”, zastąpi zmienną z twojej powłoki, a nie ze środowiska sudo.
João Pinto,

Odpowiedzi:

72

Problem polega na tym, że sourcejest to wbudowana komenda bash (a nie program podobny do lslub grep). Myślę, że jednym z podejść jest zalogowanie się jako root, a następnie wykonanie polecenia źródłowego.

sudo -s
source /etc/bash.bashrc
Marcos Roriz Junior
źródło
3
Masz rację, problem polega na tym, że sourcejest to wbudowana powłoka. sudo sujest rodzajem dziwnego sposobu na powiedzenie tego - lepiej po prostu powiedzieć, sudo -sktó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.
poolie 10.01.11
1
Dobrze. Dodatkowo BASH czyta / etc / bashrc podczas logowania. Możesz więc równie dobrze użyć „su” z przełącznikiem -, -l lub --login, aby uzyskać środowisko tego użytkownika: „sudo su -”, aby zostać rootem lub „su - $ nazwa użytkownika”, aby zostać innym użytkownikiem.
Przykład „jednej linii” nie zadziała, ponieważ suuruchamia 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.
loevborg
sudo -snie jest lepszy niż sudo su. I tak nie przyniesie żadnego efektu.
loevborg
1
sudo -sma 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.
poolie 12.01.11
14

Problemem nie jest to, że sourcejest to wbudowane polecenie powłoki. Fakt, że to właśnie rzuca ci command not foundbłą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 bashw instancji bash) i spojrzenie na wynik envpowinien dać podobne wyniki niż jego rodzic.

Jednak ze względu na to, jak sudodział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, jak sudo nautiluspowinien otworzyć folder w /rootfolderze, a nie /home/yourusername.

Więc:

Wykonanie czegoś takiego, sudo source script.sha potem sudo command, nawet jeśli zadziałałoby, nie powiodło się ustawienie żadnej zmiennej na później sudo command.

Aby przekazać zmienne środowiskowe, możesz albo powiedzieć sudo, aby zachowało środowisko (za pomocą -Eprzełącznika i mieć odpowiednie uprawnienia w pliku sudoers) i / lub ustawić je dla polecenia jako sudo VAR1=VALUE1 VAR2=VALUE2 command.

ssice
źródło
4

Używając podstawiania procesu bash możesz:

source <(sudo cat /etc/bash.bashrc)
TomDotTom
źródło
1
W jaki sposób pomogłoby to uruchomić powłokę root z nowymi ustawieniami, co właśnie chce OP?
muru
1
OP faktycznie pytał, jak „... ponownie załadować nowy profil ...” z powłoki, której należy użyć, sudoaby uzyskać dostęp do profilu. Powyższe umożliwia importowanie profilu przy jednoczesnym uniknięciu sudo: source: command not foundwspomnianego problemu.
TomDotTom
„Jedyną rzeczą jest - nowe zmienne środowiskowe były dostępne tylko dla mojego bieżącego użytkownika - i zostały zignorowane, gdy użyłem sudo”.
muru
3

Jak mówi Marcos , twoim głównym problemem tutaj jest sourcewbudowane 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

sudo bash
poolie
źródło
2

Zamknięcie i ponowne otwarcie terminala nie powinno zmienić rzeczy. Domyślnie sudo usuwa środowisko. Aby to wyłączyć, dodaj -E do sudo.

psusi
źródło
2

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

$ which bettercap-ng
/home/user/work/bin/bettercap`

Sprawdziłem, czy ta lokalizacja jest częścią ŚCIEŻKI mojego użytkownika root.

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

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.

sudo -E env "PATH=$PATH" [command] [arguments]

W rzeczywistości można z niego zrobić alias:

alias mysudo='sudo -E env "PATH=$PATH"'

Można także nazwać sam alias sudo, zastępując oryginalne sudo.

Anonimowy Dziobak
źródło