Не удается запустить Linux & quot; awk & quot; команда в сценарии из переполнения стека

У меня есть сценарий оболочки «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

Я что-то пропустил?

3

Решение

Вы должны научиться отлаживать первый

Вы сказали

Так что команда «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);
1

Другие решения

Других решений пока нет …