Прочитайте весь этот пост, прежде чем попробовать, есть варианты выбора.
Решение с использованием двоичной обертки (с битом suid)
1) Создайте сценарий (предпочтительно .sh
), содержащий то, что вы хотите запустить от имени пользователя root.
# cat > php_shell.sh <<CONTENT
#!/bin/sh
/sbin/service sshd restart
CONTENT
2) Этот файл должен принадлежатьот имени пользователя root, и, поскольку он будет позже запускаться с правами root, убедитесь, что только root имеет разрешение на запись в файл.
# chown root php_shell.sh
# chmod u=rwx,go=xr php_shell.sh
3) Запускать скрипт от имени пользователя root не имеет значенияпользователю, который его выполняет, нам понадобится двоичная оболочка.Создайте тот, который будет выполнять наши php_shell.sh
.
# cat > wrapper.c <<CONTENT
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int
main (int argc, char *argv[])
{
setuid (0);
/* WARNING: Only use an absolute path to the script to execute,
* a malicious user might fool the binary and execute
* arbitary commands if not.
* */
system ("/bin/sh /path/to/php_shell.sh");
return 0;
}
CONTENT
4) Компилировать и устанавливать правильные разрешения, включая бит suid (говоря, что он должен работать с привилегиями root):
# gcc wrapper.c -o php_root
# chown root php_root
# chmod u=rwx,go=xr,+s php_root
php_root
теперь будет работать с правами суперпользователя и выполнять команды, указанные в php_shell.sh
.
Если вам не нужна опция для простого изменения командэто будет выполнено, я бы порекомендовал вам писать команды непосредственно в wrapper.c
на шаге 4 .Тогда вам не нужно иметь двоичный файл, выполняющий внешний скрипт, выполняющий рассматриваемые команды.
В wrapper.c
используйте system ("your shell command here");
, чтобы указать, какие команды вы хотите выполнить.