Bash의 물결표 확장 및 변수

Bash의 물결표 확장 및 변수

다음 스니펫을 고려하세요.

$ 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 bashTilde Expansion검색

다음으로 시작합니다(추가 줄 바꿈 및 일부 굵은 글씨 추가).

단어가 인용되지 않은 물결표( ~)로 시작하는 경우 인용되지 않은 첫 번째 슬래시 앞의 모든 문자(또는 인용되지 않은 슬래시가 없는 경우 모든 문자)는 물결표 접두어로 처리됩니다.

물결표 접두사에 인용되지 않은 문자가 있으면 물결표 접두사에서 물결표 뒤에 오는 문자가 가능한 로그인 이름으로 간주됩니다.

이 로그인 이름이 빈 문자열인 경우 물결표는 쉘 매개변수의 값으로 대체됩니다 HOME. HOME설정되지 않은 경우, 쉘을 실행하는 사용자의 홈 디렉토리가 대체됩니다.

그렇지 않으면 물결표 접두사가 지정된 로그인과 연결된 홈 디렉터리로 대체됩니다.

즉, ~$HOME이 비어 있지 않으면 $HOME으로 확장됩니다.

sudoWith 가 $HOME없으면 실제로 입니다.-E-E

~또한, 이는 또한 주목할 가치가 있습니다: 대부분의 쉘은 사용자의 홈 디렉토리로 확장할 수 있고 실제로 확장하지만 모든 프로그램이 확장하는 것은 아닙니다. 사실 대부분의 프로그램은 이 작업을 수행하지 않습니다. 실제로는 해당 작업이 아니며 물결표, 변수, 글로브 및 기타 확장을 수행하기 위해 쉘에 의존합니다.앞으로그들은 논쟁의 여지가 없습니다.


질문: sudo-ed 명령에 내 변수를 전달하고 ~를 /root로 평가하도록 할 수 있습니까?

여러 가지 방법이 있으며 각각 장점과 단점이 있습니다. 그 중 일부는 다음과 같습니다.

  1. unset HOME달리기 전 sudo -E.

  2. HOME=/root실행하기 전에 설정하십시오 sudo -E. 예를 들어HOME=/root sudo -E bash -c 'echo $xx ~'

  3. sudo와 공유할 변수를 파일에 씁니다. 예를 들어, 실행하려는 항목을 실행하기 전에 이 작업을 수행하는 쉘 스크립트를 실행할 수도 declare -p var1 var2 var3 > /tmp/myvars.sh있고 실행할 sudo수도 있습니다 .-Esource /tmp/myvars.shsudo

  4. 또는 설정 사용 env_keep- 이 옵션을 사용하거나 사용하지 않고 런타임에 항상 유지되는 변수를 정의할 수 있습니다./etc/sudoers/etc/sudoers.d/*sudo-E

  5. (@MichaelHomer를 통해) 옵션을 사용하여 sudoHOME -H을 다음으로 설정하세요.대상 사용자의 홈 디렉토리를 선택하고 --preserve-env=xxsudo에 변수를 전달하라고 지시합니다 xx(이 옵션은 쉼표로 구분된 환경 변수 이름 목록을 사용합니다). man sudo자세히보다. 모든 사용자가 환경을 보호할 권리가 있는 것은 아닙니다. 바라보다 man sudoers.

sudo환경 변수가 기본적으로 유지되지 않는 데는 타당한 이유가 있습니다. 보안에 심각한 영향을 미치는 많은 환경 변수가 있으며, 잘못 사용하면 사용자나 그룹이 액세스해서는 안 되는 콘텐츠에 대한 루트(또는 기타 UID) 액세스 권한을 얻을 수 있습니다.

관련 정보