2011-04-27 22 views
1

我需要通過PHP或SSH(PHP的ssh鏈接)添加/刪除SAMBA共享。從PHP修改smb.conf?

到目前爲止,我發現的唯一解決方案是一個基本處理文件的類,我從來沒有非常相信可靠性。 (http://www.phpclasses.org/package/1546-PHP-Parse-and-recreate-the-Samba-smb-conf-file.html)

你能推薦一種方法嗎?

+0

不要使用特定的類是個好主意。但是'smb.conf'是關於[share]部分的常規ini文件。你只需要爲ini文件找到一個更強大的解析器/重寫器(它不會去掉註釋)。順便說一句,這正是圖形化samba配置工具的運作方式。 (只有在Python中找到了一個可行的工具,這對你沒有用處。) – mario 2011-04-27 11:29:44

+0

我可以使用SSH從PHP執行python腳本,只要它們是基於命令行的 – anroots 2011-04-27 12:00:14

回答

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風格。所以你只能完全替換現有的條目,而不能更新它們。

+0

看起來不錯,大概一個小時後會試用。我可以使用類似的技術刪除共享,或者至少刪除與共享關聯的允許用戶。 – anroots 2011-04-27 14:06:56

+0

謝謝。你的解決方案有效 – anroots 2011-04-27 15:11:38

+0

哦,很酷。感謝您的反饋! – mario 2011-04-27 15:15:11

0

Zend Framework的Zend_Config安裝程序可能很有用,因爲它能夠讀取/寫入ini文件。

Zend_Config_Writer

+0

它不適合真實的配置文件,因爲它是一個簡單的刪除評論的實施。它很可能在'smb.conf'上失敗,該'smb.conf'中有多行指令parse_ini_file沒有準備好。 – mario 2011-04-27 11:42:37

+0

我想這可能是一個問題,如果需要在文件中註釋或是否有多行指令。讓我們等待,從海報中聽到! – 2011-04-27 11:45:29

+0

真實,簡單的文件閱讀方法將無法正常工作。評論是微不足道的,我更擔心的是,一些指令被切斷或丟失,整個事情都爆炸了。 Zend_Config看起來很誘人,我會盡快嘗試。 – anroots 2011-04-27 11:58:56