У меня есть сценарий оболочки «test.sh»:
#!/system/bin/sh
PID=$(ps | grep logcat | grep root |grep -v grep | awk '{print $2}')
echo "Using awk: $PID"
PID=$(ps | grep logcat | grep root |grep -v grep | cut -d " " -f 7 )
echo "Using cut: $PID"
Когда я запускаю скрипт из PHP:
exec("su -c sh /path/to/my/script/test.sh");
Я получил этот вывод:
Using awk:
Using cut: 6512
Таким образом, команда «cut» работает, а команда «awk» — нет, когда я запускаю скрипт из PHP, но когда я запускаю его из терминала:
# sh test.sh
Я могу получить как awk, так и отлично работать! Вот как выглядит вывод «ps»:
USER PID PPID VSIZE RSS WCHAN PC NAME
root 6512 5115 3044 1108 poll_sched b6e4bb0c S logcat
Я что-то пропустил?
Вы должны научиться отлаживать первый
Вы сказали
Так что команда «cut» — это работа, а команда «awk» — нет, когда я запускаю
скрипт из PHP, но когда я запускаю его из терминала:
Я удивляюсь, как ?
на самом деле выдает ошибку, как показано ниже, в CLI
$ php -r 'exec("su -c sh /path/to/my/script/test.sh");'
su: user /path/to/my/script/test.sh does not exist
Сначала вам нужно ниже синтаксиса при отладке кода
// basic : stdin (0) stdout (1) stderr (2)
exec('your_command 2>&1', $output, $return_status);
// to see the response from your command
// su: user /path/to/my/script/test.sh does not exist
print_r($output);
Помните :
su
дает права root, но это не меняетPATH
переменная и текущая рабочая директория.Операционная система предполагает, что при отсутствии имени пользователя
пользователь хочет перейти к корневому сеансу, и, таким образом, пользователю предлагается
для пароля root
[akshay@localhost Desktop]$ su
Password:
[root@localhost Desktop]# pwd
/home/akshay/Desktop
[root@localhost Desktop]# exit
exit
[akshay@localhost Desktop]$ su -
Password:
[root@localhost ~]# pwd
/root
Решение:
Вы должны разрешить выполнение вашего скрипта без запроса пароля (не используйте su
использование sudo
)
Чтобы позволить пользователю Apache выполнить ваш скрипт и некоторые команды, вы можете сделать запись, как показано ниже в /etc/sudoers
# which awk => give you awk path
# same use in your script also, or else set path variable
www-data ALL=NOPASSWD: /path/to/my/script/test.sh, /bin/cut, /usr/bin/awk
Так и становится:
// assuming your script is executable
exec("sudo /path/to/my/script/test.sh 2>&1", $output);
print_r($output);
Других решений пока нет …