파일에 일부 문자열을 작성해야 하는 경우가 있는데 이 작업만 수행할 수 있습니다 root
. 나는 이것을 기반으로 몇 가지 솔루션을 시도하고 있습니다.우편 엽서그러나 그들 중 누구도 작동하지 않습니다.
사례:
사용자가 성공적으로 완료하면 writefile.php
액세스 전용 권한()으로 쓸 수 있는 파일이 포함된 스크립트에 자동으로 액세스할 수 있습니다.tes.txt
root
나는 visudo
이것을 사용하고 내 sudoers
파일에 추가합니다.
username ALL=(root) NOPASSWD: /var/www/html/myprogram/writefile.php
아니요!
username ALL=(ALL) NOPASSWD: /var/www/html/myprogram/writefile.php
아니요!
내 간단한 코드존재하다writefile.php
<?php
echo file_put_contents("tes.txt","Hello World. Testing!");
?>
결과:
Warning: file_put_contents(tes.txt): failed to open stream: Permission denied
답변1
많은 시도 끝에 관련 기사도 읽어보았습니다. 마침내 나는 문제가 내 합의에 있다는 것을 깨달았습니다. 이것이 sudo
n을 처음 사용하는 다른 사용자에게 도움이 되기를 바랍니다 visudo
.
질문:
1. 사용자 이름
에 관해서는 username
제가 추가한 사용자는 단말기를 통한 로그인 권한이 있는 사용자입니다. 웹사이트를 통해 애플리케이션에 접속하더라도 마찬가지입니다. 따라서 사용자는 www-data
다음과 같아야 합니다.
www-data ALL=(root) NOPASSWD: /usr/bin/php /var/www/html/myprogram/writefile.php
2. exec나 shell_exec를 사용하지 마세요
writefile.php
브라우저를 통해 직접 접근하면 안 된다는 사실을 잊어버렸습니다 . 명령은 다른 파일( )을 통해 전달되어야 하며 index.php
, 그런 다음 해당 파일 내에서 shell_exec
또는 를 사용하여 명령 을 exec
실행 해야 합니다 . 구조는 다음과 같습니다.writefile.php
sudo
index.php
<?php
exec("sudo /usr/bin/php /var/www/html/myprogram/writefile.php");
?>
file.php 작성
<?php
echo file_put_contents("tes.txt","tes write file");
?>
드디어 개봉 tes.txt
하고 잘 작동합니다! 다들 감사 해요.
답변2
이것은 sudo 작동 방식에 대한 오해처럼 보입니다. sudoers 파일에 무언가를 넣는 것만으로는 파일의 권한이 실제로 변경되지 않습니다. 파일은 다음과 같이 실행되어야 합니다: "사용자 이름"으로 sudo php /var/www/html/myprogram/writefile.php.. 또한 다음을 수행할 수 있습니다. 설정에 따라 해당 위치에서 파일을 실행하는 것이 허용되지 않을 수 있으므로 SELinux에 문제가 발생합니다.