Выполнение команд от имени указанного юзера (nix, sudo)

Destroyer

Новичок
Выполнение команд от имени указанного юзера (nix, sudo)

Со странички, средствми php надо выполнить команды, доступные определенному пользователю.
Да, эта тема неоднократно обсуждалась, но нигде так полного ответа и ненаписали.
Варианты давать права рута apache и править конфигурационные файлы не подходят, т.к., похоже, есть простое решение с командой sudo.
Делаю так:
PHP:
$descriptorspec = array(0 => array("pipe", "r"),  // stdin
		1 => array("pipe", "w"),  // stdout
		2 => array("pipe", "w")   // stderr ?? instead of a file
		);
$command = "sudo -S ps -f"; // хотим выполнить команду ps -f, к примеру.
$process = proc_open($command, $descriptorspec, $pipes);
stream_set_blocking($pipes[1], FALSE);
if (is_resource($process)) 
{
$nl = fread($pipes[1],1024); // читаем слово 'Password'
fwrite($pipes[0],'root_pass'); // пишем Password
$answer = fread($pipes[1],1024); // читаем ответ
$error = fread($pipes[2],1024); // читаем ответ
fclose($pipes[0]); 
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}
echo "слово Password:".$nl." Answer: ".$answer."error:".$error;
в итоге выдает через $pipes[2]:
[sudo] password for www-data:
www-data - похоже имя юзера от которого работает php и apache
Кто решил данную проблему, помогите плз.
 

BRat

o_0
[m]stream_set_blocking[/m], зачем тебе FALSE?
И в sudo нужно указывать не root_pass, а пароль юзера, в данном случае www-data
 

MiRacLe

просто Чудо
ну во-первых хранить пароль рута в скриптах прочто чудовищно.

прочитайте man sudoers на предмет NOPASSWD

и далее команда будет выглядеть следующим образом:

sudo -u root /path/to/binary args
 

Destroyer

Новичок
Автор оригинала: MiRacLe
ну во-первых хранить пароль рута в скриптах прочто чудовищно.

прочитайте man sudoers на предмет NOPASSWD

и далее команда будет выглядеть следующим образом:

sudo -u root /path/to/binary args
Пасс рута, да, хранить опасно, поэтому можно хранить не пасс рута, а пасс спец юзера, который имеет строго ограниченные права.
Начитавшись про sudoers фаил, решил сделать так: создать нового юзера и дать ему права только на определенные команды, эти команды ему будут доступны после ввода его пасса.
Надо разрешить юзеру testuser выводить список процессов, убивать процесс и разрешить запускать 1-2 определенных файла. Сделал такую строку:

testuser ALL = !/bin/*, PASSWD: /bin/kill, /bin/ps

При заходе через терминал под этим юзером - проблема: почему-то юзеру разрешены все команды из /bin (спокойно выводит ls), при попытке выполнить kill говорит что операция неразрешена.
Так же хотелось бы разрешить ТОЛЬКО заданные команды, а запись !/bin/* говорит что нельзя запускать команды только из /bin
Помогите, плз, разобраться с этой проблемой.
Из php собираюсь вызывать так:
"sudo -S -u testuser команда"
 
Сверху