1

我需要通过 PHP 或 SSH(来自 PHP 的 ssh 链接)添加/删除 SAMBA 共享。

到目前为止,我发现的唯一解决方案是一个用于原始处理文件的类,我对它的可靠性不太信任。(http://www.phpclasses.org/package/1546-PHP-Parse-and-recreate-the-Samba-smb-conf-file.html)

你能推荐一种方法吗?

4

2 回答 2

1

找不到有用的东西,所以我会推荐一种同样简单的方法。与其寻找一个成熟的 INI 解析器,不如在 append-mostly 模式下工作。一个简单的正则表达式就足以替换现有的 [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 .= "\n\n[$section]\n";
    foreach ($options as $key=>$value) {
        $conf .= "$key = $value\n";
    }
    $tmp = tempnam("/tmp/", "SMB");
    file_put_contents($tmp, $conf);

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

更新好的,parse_ini_file在这两种情况下都不起作用。它绊倒了 smb.conf 风格。因此,您只能完全替换现有条目,而不能更新它们。

于 2011-04-27T12:15:59.460 回答
0

Zend Framework 的Zend_Config设置可能很有用,因为它能够读取/写入 ini 文件。

Zend_Config_Writer

于 2011-04-27T11:40:32.263 回答