shell_exec() не изменяет qdisc в Linux

Для своего проекта я создаю WEB-интерфейс для управления QoS в Linux. Я пытаюсь связаться с терминалом с помощью функции shell_exec() PHP. И это работает, если попробовать что-то простое:

shell_exec("ip link show");

Но если попытаться изменить qdisc с помощью (работает в терминале):

shell_exec("sudo tc qdisc replace dev eth0 root pfifo");

Ничего не произошло. Я также не получаю никакого вывода, если пытаюсь выполнить echo shell_exec(...);

Я использую Ubuntu 14.04. Я уже добавил строку в файл sudoers для выполнения команд оболочки без пароля:

#includedir /etc/sudoers.d

%www-data ALL=NOPASSWD: /var/www/html

Может быть, я сделал что-то не так с файлом sudoers или есть еще что-то, что я должен сделать перед запуском команд shell_esec?


person Ignas    schedule 23.04.2016    source источник


Ответы (2)


%www-data ALL=NOPASSWD: /var/www/html

Эта строка sudoers позволит только www-data выполнить файл /var/www/html. (Это, вероятно, каталог, а не исполняемый файл, поэтому он ничего не делает.)

Если вы хотите разрешить www-data выполнять tc, вам необходимо указать это в файле sudoers, указав полный путь к исполняемому файлу.

person Community    schedule 23.04.2016
comment
Изменил его на %www-data ALL=NOPASSWD: /var/www/html/php/ajax.php, но все равно получаю те же ошибки. - person Ignas; 23.04.2016
comment
@Ignotas Это должно быть что-то вроде %www-data ALL=NOPASSWD: /usr/bin/tc, где вы заменяете /usr/bin/tc фактическим путем к программе tc. - person Barmar; 23.04.2016
comment
ОТВЕТ. Строка sudoers должна быть www-data ALL=NOPASSWD: /sbin/tc, а строка shell-exec - shell_exec("sudo tc qdisc replace dev eth0 root pfifo"); - person Ignas; 23.04.2016

Это не точный ответ, но попробуйте так. Это сработало для меня.

2>&1 выдает сообщение об ошибке.

if(exec("sh  whatever your cammand 2>&1", $output, $return_var))
{
    print_r($output);
    exit;
}
person JYoThI    schedule 23.04.2016
comment
Он возвращает: sudo: no tty present and no askpass program specified Если я попробую без sudo: RTNETLINK answers: Operation not permitted Так что я думаю, он все еще запрашивает пароль. - person Ignas; 23.04.2016
comment
Как это решает проблему с sudo разрешениями? - person Barmar; 23.04.2016
comment
Это не так, но это помогло мне увидеть ошибки неудачных команд оболочки. - person Ignas; 23.04.2016