Смена пользователя каталога с помощью PHP

NiC

Буратино был тупой
Всем привет.
Понимаю, что тема уже изжёвана и меня сейчас начнут гнобить, но всё же рискну спросить.

Есть вот такой кусочек кода:
PHP:
mkdir ('/work/ftp/'.$_POST['homedir'], 0755, true);
exec ('sudo /bin/chown -R '.$_POST['uid'].':'.$_POST['uid'].' /work/ftp/'.$_POST['homedir']);
Первая строчка исполняется без проблем.
Со второй всё плохо. Не работает даже при прямом указании параметров вместо $_POST данных.
В итоге имею созданную директорию с владельцем apache:apache. Что самое интересное, так это если переключиться в шелл пользователя apache, то команда sudo chown -R 1100:1100 /work/ftp/user1 работает без проблем.
Safe_mode = off
Selinux = disabled.
apache ALL = NOPASSWD: /bin/chown
Сервер под полным контролем, можно крутить параметрами.

Какую ошибку я пропустил?

Заранее спасибо.
 

Redjik

Джедай-мастер
тут должна быть ссылка на phpfaq/debug , но пока что лень
проверь в php.ini disabled_functions
а по хорошему - настрой нормально отображение ошибок
 

Активист

Активист
Команда форума
Вообще-то нужно писать не через жопу.

PHP:
try
{
    ini_set("display_errors", "on");
    error_reporting(E_ALL);
       
    $base = "/work/ftp/";
    $home = isset($_POST['homedir']) ? $_POST['homedir'] : null;
    $uid = isset($_POST['uid']) ? $_POST['uid'] : null;
   
    if (!file_exists($base) || !is_writable($base) || !is_dir($base))
    {
        throw new Exception("{$base} not found or permission denied");
    }
   
    if (!preg_match("/^[a-z][a-z0-9]+$/i", $home))
    {
        throw new Exception("{$base} home dir content bad symbols");
    }
   
    if (file_exists($path = $base.$home))
    {
        throw new Exception("{$path} already exists");
    }
   
    if (! mkdir($path, 0750, false ))
    {
        throw new Exception("Can't create {$path}");
    }
   
    if ($uid && $uid != "root")
    {
        if (!chown($path, $uid))
        {
            throw new Exception("Can't chown to {$uid} for {$path}");
        }
       
        if (!chgrp($path, $uid))
        {
            throw new Exception("Can't chgrp to {$uid} for {$path}");
        }
    }
    else
    {
        throw new Exception("Can't chown/chgrp to 0 uid (root)");
    }
   
   
   
}
catch (Exception $e)
{
    print "Error: {$e->getMessage()}";
}
 

Активист

Активист
Команда форума
Плюс если не от рута запускаете, то запускайте chown из баш (как вы делали).

Для SUDO нужна следующая запись:
www-data ALL = NOPASSWD: /bin/chown [1-9][0-9]+\:[1-9][0-9]+ /work/ftp/[a-zA-Z0-9]*
 

Активист

Активист
Команда форума
Как-то вот так:
PHP:
if ($uid && $uid != "root")
    {
        $out = null;
        exec ("sudo /bin/chown {$uid}:{$uid} {$path} 2>&1", $out);
      
        if (sizeof($out))
        {
            throw new Exception("Can't chown/chgrp to {$uid}:{$uid} ".implode("\n", $out));
        }
    }
    else
    {
        throw new Exception("Can't chown/chgrp to 0 uid (root)");
    }
 

NiC

Буратино был тупой
Вообще-то нужно писать не через жопу.
Даже такой ня-скрипт не работает. К сожалению. Но сам скрипт прекрасен, спасибо.

Плюс если не от рута запускаете, то запускайте chown из баш (как вы делали).
Команда chown исполняется апачем, через sudo. Я сто лет не писал на PHP, тут что, появилась возможность делать exec от рута?

www-data ALL = NOPASSWD: /bin/chown [1-9][0-9]+\:[1-9][0-9]+ /work/ftp/[a-zA-Z0-9]*
Это не дебиан\убунта, так что apache ALL = NOPASSWD. Если вы имели ввиду последующие лимитирующие параметры, то их я тоже добавлял, всё без толку.

Спасибо за советы, буду копать далее.
 

NiC

Буратино был тупой
РЕШЕНО

Всё дело было в:
а) date_default_timezone_set() - без этой функции тупо не работал exec
б) В файле sudoers необходимо отменить требование requiretty
в) В файле sudoers разрешение процессу работать с chown должно быть без параметров (во всяком случае на CentOS)

Всем спасибо, можно закрывать.
 

DemmmoNz

Новичок
РЕШЕНО

Всё дело было в:
а) date_default_timezone_set() - без этой функции тупо не работал exec
б) В файле sudoers необходимо отменить требование requiretty
в) В файле sudoers разрешение процессу работать с chown должно быть без параметров (во всяком случае на CentOS)

Всем спасибо, можно закрывать.

Спасибо тебе огромное))
 
Сверху