다음 스니펫을 고려하세요.
$ export xx=foo
$ sudo bash -c 'echo $xx ~'
/root
그것은 중요하지 않습니다. 우리는 xx를 볼 수 없습니다.
그러나 노출하면 다음과 같습니다.
$ sudo -E bash -c 'echo $xx ~'
foo /home/xropi
많은 사람들이 말하지만~별칭이 아니지만 환경의 일부입니다.-이자형원본이 공개되므로 평가를 미룰 수 없습니다.
sudo-ed 명령에 내 변수를 전달하고 ~를 /root로 평가할 수 있습니까?
sudo로 실행할 때 이것을 얻고 싶습니다.
foo /root
답변1
물결표가 어떻게 작동하는지에 대한 이해가 불완전합니다. 보기 man bash
및 Tilde Expansion
검색
다음으로 시작합니다(추가 줄 바꿈 및 일부 굵은 글씨 추가).
단어가 인용되지 않은 물결표(
~
)로 시작하는 경우 인용되지 않은 첫 번째 슬래시 앞의 모든 문자(또는 인용되지 않은 슬래시가 없는 경우 모든 문자)는 물결표 접두어로 처리됩니다.물결표 접두사에 인용되지 않은 문자가 있으면 물결표 접두사에서 물결표 뒤에 오는 문자가 가능한 로그인 이름으로 간주됩니다.
이 로그인 이름이 빈 문자열인 경우 물결표는 쉘 매개변수의 값으로 대체됩니다
HOME
.HOME
설정되지 않은 경우, 쉘을 실행하는 사용자의 홈 디렉토리가 대체됩니다.그렇지 않으면 물결표 접두사가 지정된 로그인과 연결된 홈 디렉터리로 대체됩니다.
즉, ~
$HOME이 비어 있지 않으면 $HOME으로 확장됩니다.
sudo
With 가 $HOME
없으면 실제로 입니다.-E
-E
~
또한, 이는 또한 주목할 가치가 있습니다: 대부분의 쉘은 사용자의 홈 디렉토리로 확장할 수 있고 실제로 확장하지만 모든 프로그램이 확장하는 것은 아닙니다. 사실 대부분의 프로그램은 이 작업을 수행하지 않습니다. 실제로는 해당 작업이 아니며 물결표, 변수, 글로브 및 기타 확장을 수행하기 위해 쉘에 의존합니다.앞으로그들은 논쟁의 여지가 없습니다.
질문: sudo-ed 명령에 내 변수를 전달하고 ~를 /root로 평가하도록 할 수 있습니까?
여러 가지 방법이 있으며 각각 장점과 단점이 있습니다. 그 중 일부는 다음과 같습니다.
unset HOME
달리기 전sudo -E
.HOME=/root
실행하기 전에 설정하십시오sudo -E
. 예를 들어HOME=/root sudo -E bash -c 'echo $xx ~'
sudo와 공유할 변수를 파일에 씁니다. 예를 들어, 실행하려는 항목을 실행하기 전에 이 작업을 수행하는 쉘 스크립트를 실행할 수도
declare -p var1 var2 var3 > /tmp/myvars.sh
있고 실행할sudo
수도 있습니다 .-E
source /tmp/myvars.sh
sudo
또는 설정 사용
env_keep
- 이 옵션을 사용하거나 사용하지 않고 런타임에 항상 유지되는 변수를 정의할 수 있습니다./etc/sudoers
/etc/sudoers.d/*
sudo
-E
(@MichaelHomer를 통해) 옵션을 사용하여
sudo
HOME-H
을 다음으로 설정하세요.대상 사용자의 홈 디렉토리를 선택하고--preserve-env=xx
sudo에 변수를 전달하라고 지시합니다xx
(이 옵션은 쉼표로 구분된 환경 변수 이름 목록을 사용합니다).man sudo
자세히보다. 모든 사용자가 환경을 보호할 권리가 있는 것은 아닙니다. 바라보다man sudoers
.
sudo
환경 변수가 기본적으로 유지되지 않는 데는 타당한 이유가 있습니다. 보안에 심각한 영향을 미치는 많은 환경 변수가 있으며, 잘못 사용하면 사용자나 그룹이 액세스해서는 안 되는 콘텐츠에 대한 루트(또는 기타 UID) 액세스 권한을 얻을 수 있습니다.