“sudo -u root echo`whoami`”가 root를 반환하지 않는 이유는 무엇입니까?


11

sudo를 사용하여 Ubuntu에서 실제 루트 사용자로 명령을 실행하는 방법은 무엇입니까? 나는 원래 이것이 내가 실행할 때까지 sudo의 기본 동작이라고 생각했다.

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

그러나 이것은 내가 원하는 행동 유형이지만 한 줄로만 나타납니다.

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root

11
왜 에코 whoami? sudo whoami ..라고 말하면 루트를 반환합니다.
Neo

답변:


26

사실 그것은 않습니다 루트로 실행합니다. 그러나 당신에게 일어나는 일은 백틱이 명령을 평가하는 데 필요하기 때문에 실행 전에 평가되고 sudo있다는 것입니다. 더 직접적으로, 왜 이것 만이 아니라 :

sudo whoami

당신의 whoami당신은 당신이 무엇을 볼 이유에서 백은 실제로 현재 사용자와 같은 서브 쉘에서 평가 틱.


2
이것은 잘못이다. sudo는 루트 권한이 아닌 루트 권한으로 실행됩니다.
Manfred Moser

@Moser, 그러면 왜 그의 명령이 "root"를 인쇄합니까?
Cerin

4
@ManfredMoser : 그것은의 UID로 실행 0(제로) 입니다 정확히 "루트"라고 부르는 사람들. ( 실제로 UID를 변경하지 않고 기능sudo확장 한 경우 에만 옳았을 것 입니다. 그러나 그 기능은 아닙니다.)
user1686

1
M. Moser set-UID 가 프로세스 의 유효 사용자 ID 만 변경한다는 점을 지적하고 있었 으므로 프로세스 자체는 실제 사용자 ID를 변경해야합니다 sudo. 그러나 xyr 답변을 읽었을 때 실제로는 그렇지 않은 것 같습니다.
JdeBP

7

서브 쉘 ( whoami)이 먼저 실행되고 결과 ( myuser)가 sudo명령에 배치됩니다 . 무엇을 sudo보는 것은 echo myuser. 그것을 바로 가기로 생각하십시오.

tmpvar=`whoami`
sudo echo "$tmpvar"

1

여기에 약간의 추측이있는 것 같습니다…

백틱은 분명히 다른 사람들이 설명 한 것을 수행하고, whoami'sudo'를 호출하기 전에 확장 하고, 예상대로 백틱을 반환 '루트'에서 남겨 둡니다.

그러나 sudo (8)로 실제로 어떤 일이 일어나고 있는지 이해하는 것이 유용합니다. 그래서 실제로 매뉴얼 페이지를 보았습니다!

"실제로 효과적인 uid와 gid는 대상 사용자의 것과 일치하도록 설정되어 있습니다."

따라서 관찰 된 동작은 유효 사용자 ID와 실제 사용자 ID의 차이와 관련이없는 것으로 보입니다.

또한 "sudo printenv"를 수행하고 "printenv"와 비교하는 것이 실례입니다. [i] 일부 [/ i] 내 보낸 변수가 사용 가능하고 일부는 그렇지 않음을 보여줍니다. 호출하는 사용자의 HOME, PATH, PS1, SHELL, TERM 및 EDITOR를보고하지만 MANPATH, CVSROOT, LD_LIBRARY_PATH 또는 ENV. 프로그램이 원래 사용자 또는 루트와 다르게 동작 할 수 있으므로 약간 이상하게 보입니다.


0

sudo를 사용하면 루트 권한이 아닌 루트 권한으로 모든 명령을 실행할 수 있습니다. 이것이 유용한 이유는이 설정을 사용하면 여러 사람이 루트 권한을 가질 수 있지만 모든 로깅을 수행 할 수 있기 때문에 누가 변경을 수행했는지 나타냅니다.

이 설정은 루트 암호를 공유하는 것보다 낫습니다. 따라서 우분투를 포함한 많은 배포판에서 루트 사용자를 갖도록 대체되었습니다.

반면에 sudo su는 루트 사용자가되므로 실제로 사용해서는 안됩니다.

이 차이는 또한 관찰 된 (올바른) 행동을 설명합니다.


6
동작을 설명하는 것은 셸에서 명령 대체가 작동하는 방식에 대한 매우 간단한 문제입니다. 특권과는 전혀 관련이 없습니다.
JdeBP

-2

Sudo는 일시적으로 루트 레벨 권한을 부여합니다.

루트가 되려면 기본적으로 우분투에서 차단 된 루트로 로그인해야합니다.

sudo는 루트가 아닙니다. Fred가 SUDO 환경 변수를 che3d로 실행하고 있음을 표시하려면 SUDO_COMMAND가 가장 유용 할 수 있습니다.


우분투에서 루트가 차단 되었습니까? 확실합니까? 나는 그것이 낙담하다는 것을 알고 있지만, 실제로 UUID를 사용하여 모호한 암호를 설정하여 초보자에게 약간 더 어려워 졌다고 생각했습니다.이 방법은 일반적인 방법으로 변경할 수 있습니다.
Marty Fried
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.