exim_mainlog에서 정보를 추출하는 bash 스크립트가 있습니다. putty 명령줄(루트로 로그인)에서 bash 스크립트를 실행하면 추출된 데이터가 출력 파일에 올바르게 기록됩니다. 그러나 PHP 웹 페이지에서 bash 스크립트를 호출하면 grep 결과는 출력 파일에 기록되지만 exigrep 결과는 기록되지 않습니다. PHP 웹페이지는 cPanel 계정에 있습니다.
exim_mainlog의 grep 추출은 출력 파일에 올바르게 기록되지만 exigrep 추출은 그렇지 않으므로 이는 권한 문제가 아닌 것 같습니다.
이것은 내 PHP입니다:
<?php
$output=shell_exec("sh /home/account/public_html/cgi-bin/Log.sh");
?>
이것은 데이터 추출을 위해 3번 시도한 bash 스크립트입니다. 세 가지 모두 스크립트가 "sh /home/account/public_html/cgi-bin/Log.sh" 명령줄을 통해 호출될 때 작동하지만, bash에서 스크립트하면 grep 결과만 기록됩니다(exigrep 결과는 기록되지 않음). PHP 스크립트:
#!/bin/bash
# grep attempt consistently writes data to the temp.log file
echo "grep" > /home/account/public_html/cgi-bin/temp.log # just a label so the source of the results is known
grep "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
# exigrep attempts do not work when invoked with the PHP above
echo "exigrep" >> /home/account/public_html/cgi-bin/temp.log # just a label so the file location where the exigrep results should be is known
exigrep "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
exigrep --no-pager "email address" /var/log/exim_mainlog |\
sed -r -e 's/[[<>]/"&"/g' >> /home/account/public_html/cgi-bin/temp.log
또한 "shell_exec" 대신 "exec"를 사용해도 같은 결과가 나왔습니다.
아래 Fox의 의견을 바탕으로 exigrep에 대한 권한이 grep에 대한 권한과 다른지 확인했습니다(다른 사람이 실행할 수 있음).
답변1
PHP 호출 bash 스크립트가 실행되지 않거나 exigrep 결과를 제공하지 않는 문제를 해결하기 위해 /usr/sbin/exigrep에 있는 exigrep 파일을 PHP 파일이 포함된 로컬 계정 디렉터리에 복사했습니다. bash 스크립트 exigrep 호출을 /home/account/public_html/cgi-bin/exigrep으로 변경하면 로그 파일 추출이 제대로 작동합니다.
그래서 적어도 나는 해결책을 가지고 있습니다.
나는 내 원래 문제가 리눅스 문제가 아니라 PHP 문제라고 결론지었습니다. 어떤 이유로 인해 PHP가 exigrep의 시스템 복사본을 실행할 수 없는 것 같습니다. 어쩌면 진주 문자라는 사실이 요인일 수도 있습니다.
이를 더 자세히 살펴보기 위해 PHP에서 직접 간단한 exigrep 호출을 수행했습니다(bash 스크립트는 포함되지 않음).
<?php
$output = shell_exec('exigrep email /var/log/exim_mainlog');
echo "<pre>$output</pre>";
?>
이것은 작동하지 않습니다.
그러나 내 계정의 exigrep 복사본이 호출되면 정상적으로 작동합니다.
<?php
$output = shell_exec('/home/account/public_html/cgi-bin/exigrep email /var/log/exim_mainlog');
echo "<pre>$output</pre>";
?>
모든 Perl 스크립트가 이런 방식으로 실패하면 필요한 모든 스크립트를 로컬 계정 디렉터리에 복사해야 하기 때문에 이를 더 잘 이해하는 것이 도움이 될 것입니다. 물론, exigrep 스크립트가 일반적인 "홈 디렉터리"에서 실행되는 것을 방해하는 모든 것을 변경하는 것은 좋은 생각입니다.
이는 매우 강력한 솔루션은 아니지만 결과를 얻고 조사를 수행할 수 있는 해결 방법입니다.