У меня есть простой скрипт bash, который я вызываю из своего php-кода, чтобы узнать версию моего apache и nginx.
$webroot = getcwd();
function get_version($name)
{
global $webroot;
switch ($name)
{
case "apache":
$path = shell_exec("whereis apachectl | awk '{ print $2 }'");
$version = shell_exec("sudo $webroot/scripts/get_version $path 1 2>&1");
break;
case "nginx":
$path = shell_exec("whereis nginx | awk '{ print $2 }'");
$version = shell_exec("sudo $webroot/scripts/get_version $path 2 2>&1");
default:
echo "error";
}
return $version;
}
Как видите, я вызываю мой bash-скрипт с двумя переданными аргументами. Путь и целое число, которые я использую в моем скрипте bash:
#!/bin/bash
_x=""_programm=$1
_nr=$2
if [ "$_nr" -eq "1" ] ; then
_x=$($_programm -v 2>/dev/null | grep -i 'version' | awk -F/ '{ print $4 }')
elif [ "$_nr" -eq "2" ] ; then
_x=$($_programm -v 2>&1 | awk -F/ '{ print $2 }')
fi
cd $(pwd)
echo $_x
Выход функции:
get_version("apache"); OUTPUT: sh: 2: 1: not found
get_version("nginx"); OUTPUT: sh: 2: 2: not found
Но если я выполняю скрипт bash в терминале, то он работает, и я получаю номер версии в качестве вывода, я попробовал это как с пользователем root
а также www-data
, оба работали. Скрипт bash также вводится в файл visudo и имеет права на выполнение, пользователь скрипта — www-data.
./get_version /usr/sbin/apachectl 1 OUTPUT: 2.2.2
./get_version /usr/sbin/nginx 2 OUTPUT: 1.3
Может кто-нибудь объяснить, почему он работает в терминале, но не в php?
я нашел проблему и решение. Команда whereis
в моем php switch оператор по неизвестной причине записал пробел в переменную path, поэтому он не работал из-за этого. я использовал rtrim
на моем $path
переменная, чтобы исправить это.
case "apache":
$path = shell_exec("whereis apachectl | awk '{ print $2 }'");
$path = rtrim($path);
...
Ты должен сбежать $
если вы используете его внутри двойных кавычек в php или переключитесь на одинарные кавычки:
...
$path = shell_exec('whereis apachectl | awk \'{ print $2 }\'');
...
$path = shell_exec('whereis nginx | awk \'{ print $2 }\'');