이 bash 스크립트를 sudo로 실행하여 콘텐츠를 루트로 실행하는 방법

이 bash 스크립트를 sudo로 실행하여 콘텐츠를 루트로 실행하는 방법

sudo로 스크립트를 실행하는 방법에 대해 다음 두 가지 설명을 들었습니다.

  1. sudo 명령을 실행하는 사용자에게는 파일에 대한 실행 권한도 있어야 합니다.
  2. 파일 내의 명령이 아닌 파일만 루트로 실행됩니다.

내가 듣고 있는 내용을 의심할 이유가 없지만 다음 설정이 실행 중이며 위의 두 진술이 정확하다면 그 이유를 알고 싶습니다.

다음 스크립트가 있습니다.

/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

  1. sudo 명령을 실행하는 사용자에게는 파일에 대한 실행 권한도 있어야 합니다.

진술 1이 올바르지 않습니다. sudo를 실행하는 사용자에게는 스크립트에 대한 실행 권한이 필요하지 않습니다.

  1. 파일 내의 명령이 아닌 파일만 루트로 실행됩니다.

진술 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 명령을 실행하는 사용자에게는 파일에 대한 실행 권한도 있어야 합니다. 이 파일만 루트로 실행되며 그 안에 있는 명령은 실행되지 않습니다.

완전히 틀렸어요.

또한 쉘 스크립트를 실행할 필요가 없습니다. 실행하면 #!맨 위의 것이 통역사를 결정하는 데 사용되므로 사용하기가 더 쉬워집니다 . 그러나 인터프리터에게 스크립트를 실행하도록 직접 지시할 수 있습니다. 따라서 읽기 권한만 있으면 됩니다.

관련 정보