현재 우분투 상자에 PHP 파일이 있습니다. 웹 인터페이스 (보안 blablabla)에있는 사용자를 작성하는 데 사용하고자하는 내부 네트워크의 모든 사용자가 완전히 액세스 할 수없는 사람PHP에서 sudo로 쉘 스크립트 실행하기
shell_exec("sudo mkdir -m 755 ".escapeshellarg($directory));
shell_exec("sudo useradd -s /bin/false -d ".escapeshellarg($directory)." -p ".crypt($pass,$salt)." ".escapeshellarg($servername));
하지만 분명이 MKDIR 모두 노출 및 암호없이 sudo'd로 useradd를, 그래서 대신이 일을 내가 만들에 의한 합병증을 줄이기로 결정 : 실수로/의도적으로 내가 처음이를 사용하여 시도) 시스템에 해를 입힐 것 'newserver.sh'라는/etc에있는 쉘 스크립트. 더 나은 ABIT를 작동하는 듯 내가 터미널에서 그것을 실행할 때 꽤 잘 작동하지만, PHP는 exexutes 때 아무것도 할
shell_exec("sudo sh /etc/newserver.sh /home/testuser testuser testpass");
을 보일지 나던 사용
#!/bin/bash
#Var 1 = Directory, Var 2 = Username Var 3 = Password
mkdir "$1"
chmod 755 "$1"
useradd -s /bin/false -d "$1" -p "$3" "$2"
chown "$2" "$1"
는 (심지어 시험 필자 내가 터미널에서 실행할 때와 동일한 매개 변수.
참고로 내의 sudoers 파일은이 라인 모두의 www-data ALL=(root) NOPASSWD: /etc/newserver.sh
: 당신이 당신의 스크립트를 확인해야하는 경우
, 난 당신이 디버깅 목적으로 임시 로그 파일을 사용하는 것이 좋습니다 것 shell_exec) : "이 함수를 사용하여 실행 실패를 감지 할 수 없습니다. 프로그램 종료 코드에 대한 액세스가 필요할 때 exec()를 사용해야합니다." 코드로 모든 것이 잘 작동한다고 가정합니다. 그러지 마. 실패를 가정하고 성공을 즐거운 놀라움으로 대하십시오. exec()로 전환하고 출력/반환 값 확인을 시작합니다. –
는 아무것도 반환하지 않습니다. 사실 sh isnt sudoable 일 수 있습니까? 그것의 no는 내가 명령을 실행할 때 패스워드를 묻지 않는다. 그래서 나는 확신 할 수 없다 ... –
또한 아파치는 보통'www-data' 사용자와 그룹에서 실행되며'useradd'와 같은'sudo' 명령에 접근 할 수 없습니다 PHP에서. 그것은 sudo 사용자 아래서'bash -c'와 함께 작동 할 것입니다. 나는 결코 그것을 시도하지 않았다. – machineaddict