나는 항상 명령을 실행하는 것과 sudo
bash 스크립트를 실행하는 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
어떻게 얻을 수 있습니까 ?me
root
답변1
$(whoami)
이 답변은 질문에 표시된 명령 대체를 수행하는 사용자를 설명합니다. 실제로 이 구성은 그 자체로 현재 사용자의 사용자 이름을 출력하는 올바른 방법이므로 echo $(whoami)
절대 사용되지 않기를 바랍니다 .whoami
echo
명령 대체를 전혀 호출할 필요가 없으며 경우에 따라 필요할 수도 있습니다.조정명령 대체의 명령 출력입니다. 사용하지 마세요 echo $(...)
.
실행하면 whoami
문제가 있는 권한이 없는 사용자의 사용자 이름이 인쇄되고 sudo whoami
출력됩니다 root
.
쉘이 명령을 실행하게 하세요
sudo echo $(whoami)
먼저 어떤 매개변수를 호출할지 파악해야 합니다 sudo
. echo
은 단순한 문자열이므로 쉘은 이를 사용하여 아무 작업도 수행하지 않지만 $(whoami)
확장된 명령 대체가 필요합니다. 명령 대체를 수행 whoami
하고 이를 출력으로 대체하여 이를 수행합니다. 그러면 이라고 부를 수 있습니다 sudo
.
이는 및 (권한 없는 사용자로 실행됨) 의 출력이 인수로 실행 sudo
된다는 의미입니다 .echo
whoami
whoami
명령 대체 내에서 실행 하려면그리고 sudo
, 스크립트에 넣고 sudo
이전처럼 실행 스크립트를 사용하거나 다음과 같은 인라인 스크립트를 사용할 수 있습니다.
sudo sh -c 'echo "$(whoami)"'
여기서 sh -c
스크립트는 루트로 실행 중이므로 whoami
루트로도 실행됩니다.
요점은실행 중인 쉘whoami
루트 사용자로 실행합니다.
whoami
첫 번째 명령에서 실행된 셸은 sudo echo $(whoami)
루트 사용자가 아닌 일반 사용자로 실행됩니다.