#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-файлы.
Комментарии:
1. Это не подходит для реальных файлов конфигурации, потому что это упрощенная реализация, которая удаляет комментарии. Вероятно, произойдет сбой на
smb.conf
, который содержит многострочные директивы, для которых parse_ini_file не подготовлен.2. Я предполагаю, что это может быть проблемой, если в файле требуются комментарии или многострочные директивы. Давайте подождем ответа с плаката!
3. Правда, упрощенный подход к чтению файла не сработает. Комментарии тривиальны, я больше обеспокоен тем, что некоторые директивы обрезаны или потеряны, и все это выходит из строя. Zend_Config кажется заманчивым, я скоро попробую его.
4. — Zend_Config_Writer не будет работать в данном конкретном случае — наша система построена на Kohana.