sudo로 스크립트를 실행하는 방법에 대해 다음 두 가지 설명을 들었습니다.
- sudo 명령을 실행하는 사용자에게는 파일에 대한 실행 권한도 있어야 합니다.
- 파일 내의 명령이 아닌 파일만 루트로 실행됩니다.
내가 듣고 있는 내용을 의심할 이유가 없지만 다음 설정이 실행 중이며 위의 두 진술이 정확하다면 그 이유를 알고 싶습니다.
다음 스크립트가 있습니다.
/var/www/bash_scripts/test/set_permissions.sh
스크립트에는 다음이 포함됩니다.
chown -R jason:www-data /var/www/test.site.com
find /var/www/test.site.com -type f -exec chmod 664 {} \;
find /var/www/test.site.com -type d -exec chmod 775 {} \;
이 스크립트의 권한은 다음과 같습니다.
-rwxrwxr-- 1 root root 200 Nov 21 22:49 set_permissions.sh
내 /etc/sudoers
파일에는 맨 아래에 다음 줄이 추가되어 있습니다.
www-data ALL=(ALL) NOPASSWD: /var/www/bash_scripts/test/set_permissions.sh
user 로 실행되는 PHP 프로세스를 통해 스크립트를 실행하면 www-data
스크립트가 예상대로 실행되고 그 안에 있는 모든 명령이 실행됩니다.
위의 문 1.이 정확하다면 이 스크립트는 루트 사용자만 실행할 수 있으므로 절대 실행해서는 안 됩니다. 위의 문 2가 정확하면 스크립트의 명령이 실행되지 않습니다.
저는 단지 이 두 가지 진술이 올바른지 알아내려고 노력 중입니다. 그렇다면 위의 동작을 일으키기 위해 무엇을 했습니까?
편집하다
www-data
가지다/var/www/test.site.com
PHP 코드는 다음을 통해 명령을 실행합니다.
exec('sudo /var/www/bash_scripts/site/test/set_permissions.sh 2>&1')
답변1
- sudo 명령을 실행하는 사용자에게는 파일에 대한 실행 권한도 있어야 합니다.
진술 1이 올바르지 않습니다. sudo를 실행하는 사용자에게는 스크립트에 대한 실행 권한이 필요하지 않습니다.
- 파일 내의 명령이 아닌 파일만 루트로 실행됩니다.
진술 2도 부정확합니다. sudo 사용자가 호출하는 스크립트의 모든 명령은 sudo 사용자로 실행됩니다.
다음은 스크립트/명령이 실행된 사용자 ID를 표시하기 위해 실행한 간단한 테스트 스크립트입니다.
/tmp $ id
uid=1000(danesh) gid=1000(danesh)
/tmp $ ls -l test.sh
-rwxr-xr-x 1 danesh danesh 24 Nov 22 10:48 test.sh*
/tmp $ ./test.sh
uid=1000(danesh) gid=1000(danesh)
/tmp $ sudo ./test.sh
[sudo] password for danesh:
uid=0(root) gid=0(root) groups=0(root)
/tmp $ sudo chown root:root test.sh
/tmp $ sudo chmod 770 test.sh
/tmp $ ls -l test.sh
-rwxrwx--- 1 root root 24 Nov 22 10:48 test.sh*
/tmp $ ./test.sh
fish: The file “./test.sh” is not executable by this user
/tmp [126] $ sudo ./test.sh
uid=0(root) gid=0(root) groups=0(root)
/tmp $ cat test.sh
#!/usr/bin/env bash
# show the user executing this script
id
도움이 되길 바랍니다.
답변2
두 가지 버전
sudo 명령을 실행하는 사용자에게는 파일에 대한 실행 권한도 있어야 합니다. 이 파일만 루트로 실행되며 그 안에 있는 명령은 실행되지 않습니다.
완전히 틀렸어요.
또한 쉘 스크립트를 실행할 필요가 없습니다. 실행하면 #!
맨 위의 것이 통역사를 결정하는 데 사용되므로 사용하기가 더 쉬워집니다 . 그러나 인터프리터에게 스크립트를 실행하도록 직접 지시할 수 있습니다. 따라서 읽기 권한만 있으면 됩니다.