[unix] 환경이 다른 사용자로 sudo

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

bash가 로그인 쉘로 호출 되어도 왜 $HOME설정 되지 /home/otheruser않습니까?

구체적으로, /home/otheruser/.bashrc소스되지 않습니다. 또한 /home/otheruser/.profile공급되지 않습니다. -( /home/otheruser/.bash_profile존재하지 않습니다)

편집 : 정확한 문제는 실제로 https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails입니다



답변

를 사용하여 로그인 쉘을 호출하려면을 sudo사용하십시오 -i. command가 지정되지 않으면 로그인 쉘 프롬프트가 표시되고 그렇지 않으면 명령 출력이 표시됩니다.

예 (로그인 쉘) :

sudo -i

예 (지정된 사용자가있는 경우) :

sudo -i -u user

예 (명령 사용) :

sudo -i -u user whoami

예 (인쇄 사용자 $HOME) :

sudo -i -u user echo \$HOME

참고 : 백 슬래시 문자는 달러 기호가 대상 사용자의 쉘에 도달하고 호출하는 사용자의 쉘에서 해석되지 않도록합니다.

방금 strace 를 사용 하여 마지막 예제를 확인하여 정확히 무슨 일이 일어나고 있는지 알려줍니다. 출력 벨로우즈는 --loginbash를 명시 적으로 호출하는 것처럼 쉘이 지정된 명령으로 호출되고 있음을 보여 주지만 sudo 는 설정과 같은 자체 작업을 수행 할 수 있습니다 $HOME.

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

나는 당신이 사용 -S하고 있음을 알았고 그것이 일반적으로 좋은 기술이라고 생각하지 않습니다. 키보드에서 인증을 수행하지 않고 다른 사용자로 명령을 실행하려는 경우 SSH를 대신 사용할 수 있습니다. localhost다른 호스트와 마찬가지로 작동하며 대화식 입력없이 작동하는 공개 키 인증을 제공합니다.

ssh user@localhost echo \$HOME

참고 : SSH 서버는 항상 SSH 클라이언트가 액세스 할 로그인 쉘을 작성하므로 SSH에는 특별한 옵션이 필요하지 않습니다.


답변

Bash에게 너무 많은 크레딧을주고 있습니다. 모든 “로그인 쉘”은 Bash가 시작 및 종료시 파일을 제공하는 것을 의미합니다. $HOME변수는 그것으로 파악하지 않는다.

Bash 문서는 로그인 쉘의 의미에 대해 더 자세히 설명합니다. https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

사실, Bash는 설정 $HOME을 전혀하지 않습니다 . $HOME쉘 (login, ssh 등)을 호출하는 모든 것에 의해 설정되며 쉘은이를 상속합니다. 무엇이든은 관리자 세트로 쉘을 시작 $HOME하고 간부 인 에드을 bash, sudo요구 또는 때문에 이렇게 구성하지 않는 환경을 변경하지 않는 디자인으로 bashotheruser는 쉘에서 상속있다.

당신이 원하는 경우에 sudo당신이 기대하고있는 방법으로 환경을 더 처리하기 위해 볼 -isudo를위한 스위치. 시험:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

sudo에 대한 매뉴얼 페이지에서 자세히 설명하지만 실제로는 잘 설명하지는 않습니다. http://linux.die.net/man/8/sudo


답변