sudo를 사용할 때 명령을 찾을 수 없습니다


52

사이트에 내 문제와 관련이있는 것 같은 몇 가지 질문이 있지만 그중 하나에서 해결책을 찾을 수 없습니다.

내 운영 체제는 Ubuntu 12.04입니다. 나는 mvn설치하고 /tools/noarch/apache-maven-3.1.1내 끝에 다음 줄을 추가했습니다 /etc/profile.

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

그 후 나는 실행한다 source /etc/profile.

이제 내 문제는 다음과 같습니다. mvn --version명령을 실행하면 mvn실행 파일이 발견 되고 실행 sudo mvn --version하면 출력을 얻습니다 sudo: mvn: command not found. 나는 PATH명령을 실행할 때 다를 수 있으며 sudo이것을 시도한 이유는 다음과 같습니다.

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

내가 시도한 또 다른 것은 실행 sudo su -하고 입력하는 것 mvn --version입니다. 이 경우 mvn성공적으로 발견되고 명령이 성공합니다. 무슨 일이야?


답변:


37

$PATH 쉘에 의해 평가되므로 예상대로 검사가 작동하지 않습니다.

/etc/sudoersPATH기본 설정으로 바꾸도록 구성되어 있습니다 .

sudo명령을 실행하기 전에 로그인 쉘 환경을로드하지 않으므로 기본값 PATHfrom /etc/sudoers이 사용됩니다. su -로딩과 관련된 로그인 쉘을 엽니 다 /etc/profile. INVOCATIONman bash 섹션을 참조하십시오 .

에서 PATH재설정을 제거하면 됩니다 /etc/sudoers. 규칙이라고 할 수 secure_path있습니다.


CentOS

CentOS는 당신은 추가 할 수 있습니다 PATH받는 Defaults env_keep부분 :

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"

답변 감사합니다. 문제를 해결하지만 다른 두 가지 답변에서 솔루션 제안을 선호합니다. 내 PATH의 모든 명령이 아니라 maven에 대해서만 변경을 수행하기 때문입니다.
izomorphius

참고 : 답변 업데이트에 유의하십시오.
kriegaex

현재 디렉토리에서 바이너리를 실행하는 방법 sudo: ./<some_binary>: command not found. 아치 리눅스를 사용하고 있습니다.
Necktwi

47

sudo전류 PATH를 다음과 같이 제공 하십시오 .

sudo env "PATH=$PATH" your_command

훌륭한 답변으로 설정을 수정하지 않아도되므로 발신자가 필요한 모든 작업을 수행 할 수 있습니다. 내가 사용하는 것이 -E환경의 나머지 부분을 보존하기 위해 추가 옵션을 선택합니다. 사실, 이것은 스크립트 / 별칭 / 함수에 넣어 쉽게 사용할 수 있도록 매우 편리합니다. 나는 이것을 별도의 답변으로 추가 할 것이지만 @opyate에 대한 kudos!
Tom

이 명령을 실행하려고하면 얻을 수있는 env: cmd: No such file or directory아이디어가 있습니까?
Andy

2
@Andy cmd를 실제 명령으로 바꿉니다.
opyate

현재 디렉토리에서 바이너리를 실행하는 방법 sudo: ./<some_binary>: command not found. 아치 리눅스를 사용하고 있습니다.
Necktwi

12

@opyate의 답변을 자세히 설명하면서 다음과 같은 쉘 스크립트를 사용하고 있습니다 ( mysudo예 :) .

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Esudo환경 보존을 지시 합니다.
  • env "PATH=$PATH"sudo호출 외부로 확장 되어 외부도 PATH사용할 수있게됩니다 sudo( 일반적으로 전체 환경이받는 처리 외에 일반적으로 특수 처리를 받기 -E때문에 필요함 PATH).
  • "$@"스크립트가받는 인수를 sudo줄에 전달합니다 .

의 디렉토리에 파일로 스크립트를 저장하고 권한을 PATH부여하십시오 +x.


기존 파일을 편집하지 않으려는 사람들에게는이 방법이 훨씬 좋습니다.
qaisjp

4

현재 답변이 약간 모호하므로 /etc/sudoers경로 변경 의 특정 설정 은 secure_path다음과 같습니다.

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

로 수정 sudo visudo하거나 필요한 디렉토리를 추가 할 수 있습니다.

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

2

처음 Maven을 설치할 때도 같은 문제가있었습니다 . 두 줄을 추가 한 후에 문제가 해결되었습니다.

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

4 개의 파일 :

/root/.bashrc
/root/.profile

현재 사용자의 mehran경우 내 우분투 사용자 이름입니다.

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

1

당신은 당신 자신을 위해 한 정확히 같은 루트의 PATH 변수를 수정해야합니다, /root/.bashrc에 위치한 sudo는 님의 프로필에 두 줄을 추가하여, 다음 소스.


1
/root/.bashrc를 편집했지만 소스를 sudo source /root/.bashrc얻을 수 없습니다 : gets : sudo: source: command not foundsudo권한이 없으면 예상대로 권한이 거부됩니다. 이론적으로 새로운 터미널을 시작하면 소스와 동일하게 작동해야하지만 새로운 터미널을 시작한 sudo mvn --version후에도 여전히 아무것도 찾지 못합니다.
izomorphius

@izomorphius 소스를 sudo 할 수 없습니다. 먼저 sudo su 명령을 사용하여 sudo로 전환해야합니다 . 그러면 해당 파일을 소싱 할 수 있습니다. 다른 방법은 없습니다.
MariusMatutiae
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.