복붙노트

PHP exec ()의 sudo

PHP

PHP exec ()의 sudo

그 협상이 뭔지 모르겠다.

그래서 나는 applescript를 실행하고 싶다 : sudo osascript myscript.scpt

이것은 터미널에서 잘 작동하지만, PHP의 exec ()를 통해 실행하면 안됩니다. 아무 반응이 없습니다. 콘솔에

no tty present and no askpass program specified ; TTY=unknown ; …

나는 내 연구를했고 sudo 명령의 암호가 누락 된 것 같습니다. 이 문제를 해결할 수있는 몇 가지 방법을 시도했습니다.

그 중 어느 것도 작동하지 않는 것 같아서 결과적으로 날 크라지 운전!

그래서 기본적으로 간단한 터미널 명령을 실행하도록 PHP를 가져 오는 명확한 방법이 있습니까?

편집 : 명확히하기 위해, myscript.scpt는 화면의 UI를 변경하는 간단한 appleScript입니다 (큰 프로젝트의 경우). 이론적으로 간단히 osascript myscript.scpt로 충분해야하지만, sudo는 시스템에서 응답을 불러오는 데 필요한 몇 가지 이유가 있습니다. 만약 sudo가 어떻게 든 제거 될 수 있다면, 나는이 사용 권한 문제를 안고 있다고 생각하지 않는다.

해결법

  1. ==============================

    1.누군가 아직도 이것을 요구한다면. ~ ./ sudopass / sudopass.secret과 같은 일반 텍스트 파일을 root 암호와 함께 쓸 수 있습니다. 루트 암호가 '12345'라고 가정 해 봅시다. 콘텐츠로 '12345'만 사용하여 ~ /. sudopass / sudopass.secret을 만듭니다.

    누군가 아직도 이것을 요구한다면. ~ ./ sudopass / sudopass.secret과 같은 일반 텍스트 파일을 root 암호와 함께 쓸 수 있습니다. 루트 암호가 '12345'라고 가정 해 봅시다. 콘텐츠로 '12345'만 사용하여 ~ /. sudopass / sudopass.secret을 만듭니다.

    12345
    

    그리고 나서 다음을 수행합니다.

    exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');
    

    통제 된 환경에서만이 기능을 사용해야합니다.

  2. ==============================

    2.암호가없는 sudo를 설정해야하는 것 같습니다. 시험:

    암호가없는 sudo를 설정해야하는 것 같습니다. 시험:

    %admin ALL=(ALL) NOPASSWD: ALL
    

    또한 다음 행을 주석으로 처리하십시오 (visudo를 통해 / etc / sudoers에 있음).

    Defaults    requiretty
    
  3. ==============================

    3.나는 당신이 다음과 같이 visudo와 함께 사용자와 명령에 대한 특정 액세스 권한을 가질 수 있다고 생각합니다.

    나는 당신이 다음과 같이 visudo와 함께 사용자와 명령에 대한 특정 액세스 권한을 가질 수 있다고 생각합니다.

    nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt
    

    와 함께 PHP :

    @exec("sudo /path/to/osascript myscript.scpt ");
    

    아무도 사용자가 아파치를 실행하고 있다고 가정합니다.

  4. ==============================

    4.php : bash 콘솔이 생성되고, 첫 번째 스크립트가 실행됩니다.이 스크립트는 sudo를 두 번째 스크립트로 호출합니다 (아래 참조).

    php : bash 콘솔이 생성되고, 첫 번째 스크립트가 실행됩니다.이 스크립트는 sudo를 두 번째 스크립트로 호출합니다 (아래 참조).

    $dev = $_GET['device'];
    $cmd = '/bin/bash /home/www/start.bash '.$dev;
    echo $cmd;
    shell_exec($cmd);
    

    oc, 루트 권한없이 루트 레벨에서 스크립트를 실행하여 /etc/sudoers.d/mount 파일을 작성하고 수정하십시오.

    www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash
    

    chmod를 잊지 마라.

    sudo chmod 0440 /etc/sudoers.d/mount
    
  5. ==============================

    5.sudo visudo 명령을 실행하고 % sudo ALL = (ALL : ALL)을 % sudo ALL = (ALL : ALL)로 설정합니다. NOPASSWD : 모두 작동합니다.

    sudo visudo 명령을 실행하고 % sudo ALL = (ALL : ALL)을 % sudo ALL = (ALL : ALL)로 설정합니다. NOPASSWD : 모두 작동합니다.

  6. ==============================

    6.필자는 최근 PHP가 실제 Bash 쉘을 얻고 상호 작용할 수있는 프로젝트를 발표했습니다. Get it here : https://github.com/merlinthemagic/MTS 셸에는 pty (pseudo 터미널 장치, 즉 ssh 세션과 같음)가 있으며 필요에 따라 셸을 루트로 가져올 수 있습니다. 스크립트를 실행하기 위해 루트가 필요한 것은 확실하지 않지만 sudo를 언급 할 때 그럴 가능성이 큽니다.

    필자는 최근 PHP가 실제 Bash 쉘을 얻고 상호 작용할 수있는 프로젝트를 발표했습니다. Get it here : https://github.com/merlinthemagic/MTS 셸에는 pty (pseudo 터미널 장치, 즉 ssh 세션과 같음)가 있으며 필요에 따라 셸을 루트로 가져올 수 있습니다. 스크립트를 실행하기 위해 루트가 필요한 것은 확실하지 않지만 sudo를 언급 할 때 그럴 가능성이 큽니다.

    다운로드 한 후에는 다음 코드를 사용하면됩니다.

    $shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
    $return1  = $shell->exeCmd('/path/to/osascript myscript.scpt');
    
  7. ==============================

    7.sudo를 사용하여 PHP 스크립트를 실행하고 스크립트 내에서 생략하는 것은 어떻습니까? 그것은 자식 프로세스에 대한 권한을 처리 할 수도 있습니다.

    sudo를 사용하여 PHP 스크립트를 실행하고 스크립트 내에서 생략하는 것은 어떻습니까? 그것은 자식 프로세스에 대한 권한을 처리 할 수도 있습니다.

  8. from https://stackoverflow.com/questions/3173201/sudo-in-php-exec by cc-by-sa and MIT license