sudo를 사용하여 명령을 실행하고 sudo를 사용하여 Bash 스크립트를 실행합니다.

sudo를 사용하여 명령을 실행하고 sudo를 사용하여 Bash 스크립트를 실행합니다.

나는 항상 명령을 실행하는 것과 sudobash 스크립트를 실행하는 sudo것이 같다고 생각했습니다. 그러나 오늘 나는 그들이 다르다는 것을 발견했습니다. 제가 테스트한 내용은 다음과 같습니다.

me@my_machine:~$ sudo echo $(whoami)

터미널에서 명령을 실행하고 출력을 얻습니다 me. 이 링크를 읽은 후:"sudo -u root echo whoami"가 루트를 반환하지 않는 이유, 나는 이것을 이해합니다.

그런 다음 다음과 같은 bash 스크립트를 만듭니다 test.sh.

#!/usr/bin/env bash
echo $(whoami)

이 스크립트를 실행했는데 sudo ./test.sh놀랍게도 이제 출력은 다음과 같습니다 root.

sudo그렇다면 Bash 스크립트를 실행하는 것과 sudo다른 명령을 실행하고 있습니까 ?

명령이 포함된 Bash 스크립트가 있고 whoami이를 사용하여 실행하는 경우 대신 sudo어떻게 얻을 수 있습니까 ?meroot

답변1

$(whoami)이 답변은 질문에 표시된 명령 대체를 수행하는 사용자를 설명합니다. 실제로 이 구성은 그 자체로 현재 사용자의 사용자 이름을 출력하는 올바른 방법이므로 echo $(whoami)절대 사용되지 않기를 바랍니다 .whoami

echo명령 대체를 전혀 호출할 필요가 없으며 경우에 따라 필요할 수도 있습니다.조정명령 대체의 명령 출력입니다. 사용하지 마세요 echo $(...).

실행하면 whoami문제가 있는 권한이 없는 사용자의 사용자 이름이 인쇄되고 sudo whoami출력됩니다 root.


쉘이 명령을 실행하게 하세요

sudo echo $(whoami)

먼저 어떤 매개변수를 호출할지 파악해야 합니다 sudo. echo은 단순한 문자열이므로 쉘은 이를 사용하여 아무 작업도 수행하지 않지만 $(whoami)확장된 명령 대체가 필요합니다. 명령 대체를 수행 whoami하고 이를 출력으로 대체하여 이를 수행합니다. 그러면 이라고 부를 수 있습니다 sudo.

이는 및 (권한 없는 사용자로 실행됨) 의 출력이 인수로 실행 sudo된다는 의미입니다 .echowhoami

whoami명령 대체 내에서 실행 하려면그리고 sudo, 스크립트에 넣고 sudo이전처럼 실행 스크립트를 사용하거나 다음과 같은 인라인 스크립트를 사용할 수 있습니다.

sudo sh -c 'echo "$(whoami)"'

여기서 sh -c스크립트는 루트로 실행 중이므로 whoami루트로도 실행됩니다.

요점은실행 중인 쉘whoami루트 사용자로 실행합니다.

whoami첫 번째 명령에서 실행된 셸은 sudo echo $(whoami)루트 사용자가 아닌 일반 사용자로 실행됩니다.

관련 정보