환경이 다른 사용자로 sudo


56

$ 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입니다


이 질문에 대한 해결책은 다른 질문도 해결합니다.이 상황에서 다른 질문을 삭제하고 싶을 수도 있습니다.
Pavel Šimerda 8

답변:


83

를 사용하여 로그인 쉘을 호출하려면을 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에는 특별한 옵션이 필요하지 않습니다.


2
sudo -i -u user echo \$HOME나를 위해 작동하지 않습니다. 출력 : $HOME. strace는 당신과 동일한 출력을 제공합니다. 무엇이 문제입니까?
John_West

전혀, 그것은 여전히 ​​나를 위해 작동합니다, 나는 그것을 보거나 심지어 시스템을 터치해야합니다.
Pavel Šimerda

10

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


4
$ HOME은 bash에 의해 설정되지 않습니다.-고맙습니다.
user80551

내 대답에서 strace 를 찾으십시오 . 를 /bin/bash -l -c 'echo $HOME'사용할 때 명령 줄을 직접 만들 필요가 없음을 보여줍니다 -i.
Pavel Šimerda

1
sudo구문은 내 컴퓨터에서 오류를 발생 시켰습니다. ( 옵션을 su사용 -c하지만 그렇게 생각 sudo하지 않습니다.) 나는 더 나은 행운을 HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
얻었

네, @palswim이 맞습니다. 확실 -S하지 않지만 (필요하지 않았으므로 생략했습니다) 대신 -c작동하지 않으므로 -s대신 필요 합니다.
polynomial_donut
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.