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?

izomorfia
źródło

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"
Daniel Beck
źródło
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
opyate
źródło
Ś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.

Tomek
źródło
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
mikemaccana
źródło
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
Mehran Hatami
źródło
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.

MariusMatutiae
źródło
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