호출 할 때 나는 크론이 운영하는 쉘 파일이 작동하지 않습니다PHP 시스템() 호출 쉘
파일이 바로이 라인이 포함되어 있는지* * * * * /bin/sh /var/www/test.sh > /dev/null 2>&1
:
php -q /var/www/test.php
즉, PHP는 파일이 포함되어 있습니다
<?php
$command = 'cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg';
system($command);
$command = 'mkdir /var/www/test_dir';
system($command);
file_put_contents('var/www/test_user.log', posix_getpwuid(posix_geteuid())['name']);
if (file_exists('/var/www/test.pdf')) {
file_put_contents('/var/www/test.log', 'success');
} else {
file_put_contents('/var/www/test.log', 'fail');
}
cairosvg
는 PDF 파일로 SVG 파일을 켤 수있는 CLI 라이브러리입니다. 위의 단계를 거치면이 PHP 코드가 실행되지만 파일은 만들어지지 않습니다. URL을 통해 PHP 파일을 호출하면 파일이 만들어집니다.
내가보기에 유일한 차이점은 프로세스 사용자가 이 www-data
이고 URL이 root
인 경우 쉘로 실행 한 경우입니다.
명령 cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg
은 터미널에서 직접 루트로 실행할 때 작동합니다.
두 번째 명령 인 mkdir /var/www/test_dir
은 system()
이 CLI 또는 매우 간단하게 사용할 수 있는지 확인하기위한 현실적인 검사입니다. 이 명령은 쉘과 URL 모두에서 작동합니다.
이것은 좀 더 복잡한 시스템의 문제에 대한 최소의 완전하고 입증 가능한 예이므로 "셸 단계 건너 뛰기"또는 비슷한 대답이 나에게 도움이되지 않습니다.
저는 PHP 5.6, Ubuntu 14.04 및 Apache를 실행하고 있습니다.
URL로 호출 할 때가 아니라 쉘 호출시이 PHP 코드가 실패하는 이유는 무엇입니까?
downvote에 대한 이유? – Goose
'system'의 반환 값을 살펴 보겠습니다. 명령 출력을 포함해야합니다. 사용자가 대상 파일을 쓸 수 있습니까? –
@NicoHaase 조언을 주셔서 감사합니다. 나는'exec'의 결과물을 버렸지 만 아무 것도주지 않았지만'system' 리턴 상태는'127'을줍니다. 인터넷 검색. 사용자는 루트이므로 예 쓰기 권한이 있어야합니다. – Goose