기본적으로 다음을 수행해야 합니다.
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
이것은 작동하지 않습니다. 환경 변수 $DUMMY를 su에 전달하는 방법은 무엇입니까? -p는 -l과 함께 사용할 수 없습니다.
답변1
전문가 팁:달리는 데는 결코 좋은 이유가 없습니다.sudo su
. 다른 사용자로 명령을 실행하려면 를 사용하십시오 sudo -u username command
. 루트 쉘을 원하면 sudo -i
또는 를 실행하십시오 sudo -l
. 루트 계정을 활성화하면 su
단독으로 실행할 수도 있지만 sudo su
소용이 없습니다. 네, 어디서나 볼 수 있다는 걸 압니다.
즉, 사용자의 세션 컨텍스트를 유지하는 스위치가 sudo
있습니다 .-E
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve
their existing environment variables. The security policy may
return an error if the user does not have permission to
preserve the environment.
따라서 먼저 변수를 내보낸 후 다음을 실행해야 합니다 sudo -E
.
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
불필요한 bash -c
. 그러나 을 실행하면 sudo -Eu bob echo "$DUMMY"
루트 셸을 시작하기 전에 변수가 확장되므로 명령이 실제로 작동하는지 증명할 수 없습니다.
$ sudo -u bob echo $DUMMY ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY' ## works as expected
D:dummy
답변2
로그인 셸을 호출하지 않고도 이 작업을 수행할 수 있습니다.
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
또는:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
이 명령은 환경 변수의 옵션을 유지합니다 -p
.su
답변3
-E는 나를 위해 일을 합니다. 남자들 sudo
에게서 ——
-E
,--preserve-env
사용자가 기존 환경 변수를 유지하기를 원하는 보안 정책을 나타냅니다. 사용자에게 환경을 보호할 권한이 없으면 보안 정책에서 오류가 반환될 수 있습니다.
답변4
나 역시 이 문제를 겪었고 환경 변수를 구성 파일로 내보내서 문제를 해결했습니다. 다음은 내 샘플 코드입니다.
echo export runner_token=$(echo $resp_json | jq -r '.token') >> /etc/profile
su -p - ubuntu -c '$HOME/actions-runner/config.sh --url https://github.com/${gh_repo_user}/${gh_repo_name} --token "$runner_token" --name MAC-AWS-RUNNER --labels ${gh_runner_labels}'