polecenie nie zostało znalezione podczas używania sudo


52

Na stronie jest kilka pytań, które wydają się związane z moim problemem, ale nie mogłem znaleźć rozwiązania w żadnym z nich.

Mój system operacyjny to Ubuntu 12.04. Mam mvnzainstalowany /tools/noarch/apache-maven-3.1.1i dodałem poniższe linie na końcu mojego /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

Następnie wykonuję source /etc/profile.

Teraz mój problem: gdy uruchamiam mvn --versionpolecenie powiedzie i mvnwykonywalny zostanie znaleziony, natomiast jeśli wykonam: sudo mvn --versionmam wyjścia: sudo: mvn: command not found. Wiem, że PATHmoże być inaczej, kiedy wykonuję polecenie sudoi dlatego próbowałem tego:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Inną rzeczą, którą próbowałem, to wykonać, sudo su -a następnie wpisać mvn --version. W takim przypadku mvnudało się znaleźć i polecenie się powiedzie. Co tu się dzieje?


Odpowiedzi:


37

$PATH jest oceniany przez powłokę, więc czek nie działa zgodnie z oczekiwaniami.

/etc/sudoersjest skonfigurowany do zastąpienia twojego PATHdomyślnym.

sudonie ładuje środowiska powłoki logowania przed wykonaniem polecenia, dlatego używana jest domyślna wartość PATHz /etc/sudoers. su -otwiera powłokę logowania, co wiąże się z ładowaniem /etc/profile. Patrz man bashsekcja ZAPROSZENIE .

Wystarczy usunąć PATHreset w /etc/sudoers. Prawdopodobnie jest to reguła zwana secure_path.


CentOS

W CentOS możesz dodać PATHdo Defaults env_keepsekcji:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"

Dziękuję za Twoją odpowiedź. Rozwiązuje problem, ale wolę sugestię rozwiązania w pozostałych dwóch odpowiedziach, ponieważ wykonuje zmianę tylko dla maven, a nie dla wszystkich poleceń w mojej ŚCIEŻCE.
izomorphius

FYI: Proszę zwrócić uwagę na aktualizację mojej odpowiedzi.
kriegaex,

jak sudo wykonać pliki binarne w bieżącym katalogu sudo: ./<some_binary>: command not found. Używam Arch Linux.
Necktwi,

47

Daj sudoswój prąd PATHdzięki:

sudo env "PATH=$PATH" your_command

Świetna odpowiedź, która nie wymaga modyfikowania żadnych ustawień, pozwalając dzwoniącemu zrobić wszystko, co konieczne. Chciałbym skorzystać z tej -Eopcji, aby zachować resztę środowiska. W rzeczywistości jest to tak poręczne, że można je umieścić w skrypcie / aliasie / funkcji w celu łatwego użycia. Dodam to jako osobną odpowiedź - ale podziękowania dla @opyate!
Tom

Kiedy próbuję uruchomić to polecenie, otrzymuję env: cmd: No such file or directory- jakieś pomysły, dlaczego tak jest?
Andy

2
@Indy zamień cmd na swoje aktualne polecenie.
opyate

jak sudo wykonać pliki binarne w bieżącym katalogu sudo: ./<some_binary>: command not found. Używam Arch Linux.
Necktwi

12

Pracując nad odpowiedzią @ opyate, używam następującego skryptu powłoki (który może mysudona przykład mieć nazwę ):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Emówi sudoo ochronie środowiska.
  • env "PATH=$PATH"jest rozszerzany poza sudopołączeniem, dzięki czemu PATHdostępne są sudorównież elementy zewnętrzne (jest to wymagane oprócz tego, -Eże PATHzwykle otrzymuje się specjalne leczenie oprócz leczenia, które otrzymuje całe środowisko).
  • "$@"przekazuje argumenty otrzymane przez nasz skrypt do sudowiersza.

Zapisz skrypt w pliku w katalogu w PATH, daj mu +xuprawnienia i tak dalej.


Jest to znacznie lepsze rozwiązanie dla tych, którzy nie chcą edytować żadnych istniejących plików.
qaisjp

4

Ponieważ obecne odpowiedzi są trochę niejasne, konkretne ustawienie /etc/sudoerszmiany ścieżki to secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Możesz go zmodyfikować za pomocą sudo visudo, lub jeszcze lepiej, dodać potrzebne katalogi:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

2

Miałem ten sam problem, kiedy pierwszy raz zainstalowałem Maven . Problem został rozwiązany po dodaniu dwóch wierszy,

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

do czterech plików:

/root/.bashrc
/root/.profile

i dla bieżącego użytkownika ( mehranto moja nazwa użytkownika Ubuntu):

/home/mehran/.bashrc
/home/mehran/.profile

1

Musisz zmodyfikować zmienną PATH root dokładnie tak, jak zrobiłeś to dla siebie, tj. Dodając te dwie linie w profilu sudo, który znajduje się w /root/.bashrc, a następnie ją źródłowo.


1
Zredagowałem /root/.bashrc, ale nie jestem w stanie go zdobyć : sudo source /root/.bashrcgets: sudo: source: command not foundi bez sudopozwolenia dostaję odmowę (zgodnie z oczekiwaniami). wierzę, że uruchomienie nowego terminalu powinno teoretycznie robić to samo co źródło, ale po uruchomieniu nowego terminalu sudo mvn --versionwciąż nic nie znajdzie.
izomorphius

@izomorphius Nie możesz sudo źródła. Najpierw musisz przełączyć się na sudo za pomocą polecenia sudo su , a następnie możesz pobrać plik, o którym mowa. Nie ma innego sposobu, aby to zrobić.
MariusMatutiae
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.