sudo, runuser, su는 "echo $HOME" 명령을 사용하여 루트로 실행할 때 예상대로 작동하지 않습니다.

sudo, runuser, su는 "echo $HOME" 명령을 사용하여 루트로 실행할 때 예상대로 작동하지 않습니다.

이 명령을 실행하면 표시된 대로 출력됩니다. /뿌리

$ sudo -u someuser -i "echo $HOME"
/root
$ runuser -l someuser -c "echo $HOME"
/root    
$ su - someuser -c "echo $HOME"
/root

내가 기대했던 건

/home/someuser

환경을 검사하기 위해 env 명령을 실행하면 HOME 변수가 올바르게 보고됩니다.

$ su - someuser -c "env"
...  
HOME=/home/someuser
...

$ sudo -u someuser -i "env"  
...  
HOME=/home/someuser
...

$ runuser -l someuser -c "env"  
...  
HOME=/home/someuser
...  

내가 원하는 것은 사용자 홈 디렉터리에서 스크립트를 실행하는 것입니다. /home/someuser/스크립트.
${HOME}/scripts/somescript.sh로

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
sudo: /root/scripts/somescript.sh: command not found  

내가 기대했던 것은 다음과 같습니다.

$ sudo -u someuser  ${HOME}/scripts/somescript.sh
...
script output.
...

답변1

접선적으로 관련됨:

sudo -u someuser -i "echo $HOME"

나에게는 전혀 작동하지 않습니다. 그것은 말한다:

-bash: echo $HOME: command not found

요점: 명령을 실행할 때

sudo -u someuser -i echo $HOME

변수는 $HOMEsudo가 실행되기 전에 쉘에 의해 확장됩니다.

이 문제를 해결하려면 다음과 같은 명령을 사용할 수 있습니다.

sudo -u someuser -i bash -c 'echo $HOME'

이 명령에서는 echo $HOMEUID를 전환한 후 문자 그대로 bash로 전송됩니다.

결과는 예상대로입니다.

/home/someuser

답변2

당신이 할 때

 su - someuser -c "echo $HOME"

그만큼현재의쉘이 $HOME을 확장합니다.첫 번째, 결과는 명령( su이 경우)으로 전달되고 새 사용자로 실행되는 셸 프로세스로 전달됩니다.

작은따옴표로 변수를 보호해 보세요.

 su - someuser -c 'echo $HOME'

관련 정보