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
첫 번째는 변수의 값을 출력하지만 두 번째는 아무것도 출력하지 않습니다.
답변
문제는 source
bash 내장 명령입니다 (프로그램과 같은 ls
또는 grep
아님). 하나의 접근 방식은 루트로 로그인 한 다음 소스 명령을 실행하는 것입니다.
sudo -s
source /etc/bash.bashrc
답변
문제는 source
쉘 내장 명령 이 아닙니다 . 그것이 실제로 command not found
오류를 던지고있는 것이지만 그것이 잘못 되었다는 것을 의미하지는 않습니다.
실제 문제는 환경 변수의 작동 방식입니다. 그리고 그들은 다음과 같이 작동합니다 : 새로운 프로세스가 시작될 때마다 아무 일도 일어나지 않으면 부모의 환경을 상속합니다. 이로 인해 서브 쉘 (예 : bash
bash 인스턴스에 입력 )을 사용하고 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
.
답변
bash 프로세스 대체 를 사용하면 다음을 수행 할 수 있습니다.
source <(sudo cat /etc/bash.bashrc)
답변
로 마르코스는 말한다 , 당신의 가장 큰 문제는 여기 즉 source
이 달린다있는 유일한 쉘 프로세스에 영향을 미치는 쉘 내부 명령입니다.
쉬운 해결책은 루트로 새 쉘을 시작하는 것입니다. bash는 /etc/bash.bashrc
시작할 때 자동으로 읽습니다 . 그냥 말하는 것만 큼 간단합니다
sudo bash
답변
터미널을 닫았다가 다시 열면 변경되지 않아야합니다. 기본적으로 sudo는 환경을 제거합니다. 이를 비활성화하려면 sudo에 -E를 추가하십시오.
답변
명령 행에서 호출하려는 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로 지정할 수도 있습니다.