sudo : 소스 : 명령을 찾을 수 없습니다


54

bash에 대한 기본 프로필 중 일부를 업데이트했으며 다음 자습서에서 다음을 사용하여 새 환경 설정으로 새 프로필을 다시로드 할 수 있음을 알았습니다.

source /etc/bash.bashrc

유일한 것은-새로운 환경 변수는 현재 사용자 만 사용할 수 있었고 sudo를 사용할 때 무시되었습니다. 터미널 세션을 닫고 다시 참여했을 때만 sudo를 사용할 수있게되었습니다.

내가 사용하려고 할 때 :

sudo source /etc/bash.bashrc

오류가 발생합니다.

sudo: source: command not found

터미널을 닫고 다시 시작할 필요없이 sudo에 대한 새 bash 프로파일 설정을로드하는 간단한 방법이 있습니까?

-처음에는 변수를 참조하는 일부 설치 관리자 스크립트를 사용하고있었습니다. 스크립트를 직접 호출 할 때 변수에 액세스 할 수는 있지만 루트가 필요할 때 디렉토리를 만드는 데 나중에 문제가 발생할 수 있지만 sudo를 사용하여 설치 스크립트를 호출하면 그렇지 않습니다.

다음과 같은 간단한 명령으로 테스트하여 이것을 증명했습니다.

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

첫 번째는 변수의 값을 출력하지만 두 번째는 아무것도 출력하지 않습니다.


sudo의 변수를 어떻게 사용하려고 했습니까? "sudo command $ variable"을 사용하면 sudo의 환경이 아니라 셸에서 변수를 대체합니다.
João Pinto

답변:


72

문제는 sourcebash 내장 명령입니다 (프로그램과 같은 ls또는 grep아님). 하나의 접근 방식은 루트로 로그인 한 다음 소스 명령을 실행하는 것입니다.

sudo -s
source /etc/bash.bashrc

3
문제는 source셸 내장 이라는 것이 옳습니다 . "이 사용자로 쉘을 시작한다"고 말하는 sudo 자신의 방식을 말하는 것이 sudo su좋습니다 sudo -s. 각 명령은 별도의 하위 프로세스에서 기본 사용자의 쉘에 의해 실행되므로 한 줄 버전은 작동하지 않습니다.
poolie

1
권리. 또한 BASH는 로그인시 / etc / bashrc를 읽습니다. 따라서 해당 사용자의 환경을 얻기 위해-, -l 또는 --login 스위치와 함께 'su'를 사용할 수도 있습니다. 'sudo su-'는 루트가되거나 'su-$ username'은 다른 사용자가됩니다.

su새로운 쉘을 시작하고 "소스"는 종료 후에 만 ​​실행 되므로 "한 줄"예제는 작동하지 않습니다 . 첫 번째 예제 는 루트 셸 내부 에서 두 번째 줄이 사용 된 경우에만 작동합니다 .
loevborg

sudo -s보다 낫지 않다 sudo su. 어느 쪽에도 영향을 미치지 않습니다.
loevborg

1
sudo -s쉘을 시작하는 것과 비슷한 효과가 있지만, 나에게 두 개의 "다른 사용자가 됨"명령을 스택하는 것은 우아하지 않은 것 같습니다.
poolie 2012 년

14

문제는 source쉘 내장 명령 이 아닙니다 . 그것이 실제로 command not found오류를 던지고있는 것이지만 그것이 잘못 되었다는 것을 의미하지는 않습니다.

실제 문제는 환경 변수의 작동 방식입니다. 그리고 그들은 다음과 같이 작동합니다 : 새로운 프로세스가 시작될 때마다 아무 일도 일어나지 않으면 부모의 환경을 상속합니다. 이로 인해 서브 쉘 (예 : bashbash 인스턴스에 입력 )을 사용하고 env그 결과를 보면 부모와 비슷한 결과가 나타납니다.

그러나 방법에 의한 sudo(맨 페이지에 명시된 바와 같이) 작품, sudo는 명령 실행이 실행되도록 사용자의 환경을 제거하고 대신하고 사용자를위한 "기본"환경을 만들려고 하는 것처럼 이 있었다 호출 사용자 로, 따라서 노틸러스 호출 사용자 (예상되는 동작입니다) 실행되어 sudo nautilus상기 폴더를 열어야 /root폴더, 그리고 /home/yourusername.

그래서:

같은 일을 sudo source script.sh하고 sudo command, 그 일을하더라도, 그것은 나중에 어떤 변수를 설정에서 성공하지 못할 것입니다 sudo command.

환경 변수를 전달하려면 -E스위치 를 통해 sudoers 파일에 적절한 권한이 있는 환경을 유지하도록 sudo에 지시 하거나 명령에 대해 환경을로 설정하십시오 sudo VAR1=VALUE1 VAR2=VALUE2 command.


4

bash 프로세스 대체 를 사용하면 다음을 수행 할 수 있습니다.

source <(sudo cat /etc/bash.bashrc)

1
이것이 새로운 설정으로 루트 쉘을 시작하는 데 어떻게 도움이됩니까?
muru

1
OP는 실제로 프로필 sudo에 액세스하는 데 사용해야하는 쉘에서 "... 새 프로필 다시로드 ..."방법을 묻고있었습니다 . 위의 내용은 sudo: source: command not found언급 된 문제 를 피하면서 프로필을 가져 오는 방법을 제공합니다 .
TomDotTom

"새로운 환경 변수는 현재 사용자 만 사용할 수 있으며 sudo를 사용할 때 무시되었습니다."
muru

3

마르코스는 말한다 , 당신의 가장 큰 문제는 여기 즉 source이 달린다있는 유일한 쉘 프로세스에 영향을 미치는 쉘 내부 명령입니다.

쉬운 해결책은 루트로 새 쉘을 시작하는 것입니다. bash는 /etc/bash.bashrc시작할 때 자동으로 읽습니다 . 그냥 말하는 것만 큼 간단합니다

sudo bash

2

터미널을 닫았다가 다시 열면 변경되지 않아야합니다. 기본적으로 sudo는 환경을 제거합니다. 이를 비활성화하려면 sudo에 -E를 추가하십시오.


2

명령 행에서 호출하려는 2 진이 현재 사용자의 PATH 변수의 일부일뿐 루트 사용자의 PATH의 일부가 아니기 때문에 오류가 발생합니다.

액세스하려는 바이너리의 경로를 찾아서이를 확인할 수 있습니다. 제 경우에는 "bettercap-ng"를 호출하려고했습니다. 그래서 나는 달렸다

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

이 위치가 루트 사용자 PATH의 일부인지 확인했습니다.

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

따라서 sudo는 명령 줄에서 호출하려는 바이너리를 찾을 수 없습니다. 따라서 오류 명령을 찾을 수 없습니다.

아래와 같이 바이너리를 호출 할 때 sudo에게 현재 사용자의 PATH를 사용하도록 지시 할 수 있습니다.

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

실제로 별명을 만들 수 있습니다.

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

원래 sudo를 대체하여 별명 자체의 이름을 sudo로 지정할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.