PHP 파일을 실행할 때 루트만 접근할 수 있는 파일에 문자열을 씁니다.

PHP 파일을 실행할 때 루트만 접근할 수 있는 파일에 문자열을 씁니다.

파일에 일부 문자열을 작성해야 하는 경우가 있는데 이 작업만 수행할 수 있습니다 root. 나는 이것을 기반으로 몇 가지 솔루션을 시도하고 있습니다.우편 엽서그러나 그들 중 누구도 작동하지 않습니다.

사례: 사용자가 성공적으로 완료하면 writefile.php액세스 전용 권한()으로 쓸 수 있는 파일이 포함된 스크립트에 자동으로 액세스할 수 있습니다.tes.txtroot

나는 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

많은 시도 끝에 관련 기사도 읽어보았습니다. 마침내 나는 문제가 내 합의에 있다는 것을 깨달았습니다. 이것이 sudon을 처음 사용하는 다른 사용자에게 도움이 되기를 바랍니다 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.phpsudo

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에 문제가 발생합니다.

관련 정보