„Sudo: źródło: nie znaleziono polecenia”

15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

Wygląda na to, że uruchomiona jest inna powłoka niż bashuruchomiona source /etc/environmenti ta powłoka nie ma sourcewbudowanego.

Ale my i domyślna powłoka roota to obie bash.

$ echo $SHELL
/bin/bash

Jeśli sudoindeeds używa innej powłoki, to dlaczego? Widziałem odpowiedź SLM , ale nie rozumiem w moim przypadku.

Tim
źródło
4
sourcejest wbudowaną powłoką .. nie można użyć sudodo uruchomienia powłoki wbudowanej jak zewnętrzne polecenie ..
heemayl
Czy problem polega na tym, że nie można odczytać pliku lub że środowisko zdefiniowane w pliku ma być stosowane do kolejnych poleceń sudo?
Random832
@ Random832: chcesz, aby środowisko zdefiniowane w pliku stosowało się do kolejnych poleceń sudo
Tim

Odpowiedzi:

23

sourcejest wbudowaną powłoką, więc nie można jej wykonać bez powłoki. Jednak domyślnie sudonie uruchamiaj powłoki. Odsudo

Model procesu

Gdy sudo uruchamia polecenie, wywołuje fork (2), konfiguruje środowisko wykonawcze jak opisano powyżej i wywołuje wywołanie systemowe execve w procesie potomnym

Jeśli chcesz jawnie wykonać powłokę, użyj -sopcji:

# sudo -s source /etc/environment

Co jest nadal bezużyteczne, ponieważ po wyjściu z powłoki zmiany środowiska są tracone.

myaut
źródło
7

W dziedzinie rozwiązywania problemu zamiast odpowiedzi na pytanie , oto najbardziej oczywisty (dla mnie) sposób na źródło pliku, który tylko root może odczytać:

source <(sudo cat /etc/environment)

Wykorzystuje to podstawienie procesu . Pobiera dane wyjściowe catpolecenia i zamienia je w pseudoplik, do którego można przekazać source. source następnie uruchamia polecenia w bieżącej powłoce.

Pamiętaj, że w większości systemów /etc/environmentjest czytelny na całym świecie, więc powinieneś być w stanie po prostu uruchomić to:

source /etc/environment
Kevin
źródło
1
to działa, a przyjęte nie
Claudiu Creanga
2

sudooczekuje polecenia, ale podajesz wbudowaną powłokę, więc nie może znaleźć polecenia. Jeśli piszesz type source, możesz zobaczyć wynik: source is a shell builtina wynik which sourcejest pusty.

Na przykład sudo stracezadziała i which straceda wynik, ponieważ strace jest poleceniem.

Edycja: Możesz także zobaczyć sudo su;sudo source /etc/environment ładnie, więc nie jest używana inna powłoka.

Esref
źródło