Изменить smb.conf из PHP?

#php #unix #samba #smb

#php #unix #samba #smb

Вопрос:

Мне нужно добавить / удалить общие ресурсы SAMBA через PHP или через SSH (ssh ссылка из PHP).

Пока единственное решение, которое я нашел, — это класс для примитивной обработки файла, в надежность которого я не очень верю. (http://www.phpclasses.org/package/1546-PHP-Parse-and-recreate-the-Samba-smb-conf-file.html )

Не могли бы вы порекомендовать способ сделать это?

Комментарии:

1. Это хорошая идея не использовать этот конкретный класс. Но тогда smb.conf это обычный ini-файл, касающийся разделов [share]. Вам просто нужно найти более надежный анализатор / перезаписыватель для ini-файлов (который не удаляет комментарии). И, кстати, именно так работают графические инструменты настройки samba. (Нашел только работоспособный файл на Python, который вам бесполезен.)

2. Я мог бы использовать SSH из PHP для выполнения скриптов python, если бы только они были основаны на командной строке

Ответ №1:

Не могу найти что-то полезное, поэтому я бы рекомендовал аналогичный упрощенный подход. Вместо того, чтобы искать полноценный анализатор INI, желательно работать в режиме, основанном главным образом на добавлении. Простого регулярного выражения было бы достаточно, чтобы заменить существующие разделы [share] без ущерба для остальной части файла smb.conf.

И вы можете использовать testparm утилиту для проверки правильности перед перезаписью реального файла.

 define("SMB_CONF", "/etc/samba/smb.conf");

function add_share($section, $options) {

    // read old data
    #$old = parse_ini_file(SMB_CONF);
    $conf = file_get_contents(SMB_CONF);

    // merge new settings
    #if (isset($old[$section])) {
    #    $options = array_merge($old[$section], $options);
    #}

    // remove old share section, if it exists
    preg_replace("/^[$section]s*n(^(?![).*n) /m", "", $conf);

    // write out new ini file
    $conf .= "nn[$section]n";
    foreach ($options as $key=>$value) {
        $conf .= "$key = $valuen";
    }
    $tmp = tempnam("/tmp/", "SMB");
    file_put_contents($tmp, $conf);

    // copy if it is syntactically correct
    if (strstr(`testparm -s $tmp 2>amp;1`, "OK")) {
        rename($tmp, SMB_CONF);
    }
}
  

Обновлено Хорошо, parse_ini_file не работает ни в том, ни в другом случае. Это нарушает стиль smb.conf. Таким образом, вы можете только полностью заменить существующие записи, а не обновлять их.

Комментарии:

1. Это выглядит великолепно, попробую примерно через час. Я могу использовать аналогичный метод для удаления общих ресурсов или, по крайней мере, удаления разрешенных пользователей, связанных с общим ресурсом.

Ответ №2:

Zend_Config Настройка Zend Framework может быть полезной, поскольку она способна читать / записывать ini-файлы.

Zend_Config_Writer

Комментарии:

1. Это не подходит для реальных файлов конфигурации, потому что это упрощенная реализация, которая удаляет комментарии. Вероятно, произойдет сбой на smb.conf , который содержит многострочные директивы, для которых parse_ini_file не подготовлен.

2. Я предполагаю, что это может быть проблемой, если в файле требуются комментарии или многострочные директивы. Давайте подождем ответа с плаката!

3. Правда, упрощенный подход к чтению файла не сработает. Комментарии тривиальны, я больше обеспокоен тем, что некоторые директивы обрезаны или потеряны, и все это выходит из строя. Zend_Config кажется заманчивым, я скоро попробую его.

4. — Zend_Config_Writer не будет работать в данном конкретном случае — наша система построена на Kohana.