2011-02-16 16 views
4

我寫的波紋管的Python腳本:子調用的ENV傳遞

#!/usr/bin/python 
import os, subprocess 
env = os.environ.copy() 
env['PASSWD'] = "hello jian" 
retcode = subprocess.call("smbclient -L //10.60.1.11 -U Mikejian"),env=env) 
print retcode 

我執行它,它工作得很好,得到RETCODE是0,你知道,我通過密碼爲環境變量,所以python不會問我這個問題。

它的確定。

現在,我想搬到這個代碼的MoinMoin的(維基引擎)代碼。其中一類命名的用戶,在這種情況下,波紋管

def _validateSMBPassword(self, username, password): 
    debug("call _validateSMBPassword %s:%s " % (username, password)) 
    import subprocess, os, shlex 
    cmd = "sudo smbclient -L //%(server)s -U %(user)s" 
    cmd = cmd % { 
     'server' : "10.60.1.11", 
     'user' : "Mikejian", 
     } 
    env = os.environ.copy() 
    env['PASSWD'] = "hello jian" 
    retcode = subprocess.call("smbclient -L //10.60.1.11 -U Mikejian",env=env,shell=True) 
    debug("retcode:%d" % retcode) 
    if retcode == 0: 
     return True, True 
    return False, False 

一個功能,我總是得到RETCODE是1,不爲0,它似乎是在ENV還沒有過去PASSWD環境變量。

你能告訴我爲什麼?以及任何解決方案建議?

+0

信封傳遞的過程中,因此,如果在MoinMoin的運行你的代碼,你需要確保的MoinMoin真正得到您所期望的環境:你是怎麼開始的MoinMoin?還要注意,像你一樣傳遞密碼是一個可怕的想法,其原因很多,包括安全性。 –

回答

0

我可以無恥地暗示pysmbclient?這是我寫的一個骯髒的黑客來替換一些shell腳本,但它對我來說工作正常。

>>> smb = smbclient.SambaClient(server="MYSERVER", share="MYSHARE", 
...  username='foo', password='bar', domain='baz') 
... 
>>> print smb.listdir("/") 
[u'file1.txt', u'file2.txt'] 
>>> f = smb.open('/file1.txt') 
>>> data = f.read() 
>>> f.close() 
>>> smb.rename(u'/file1.txt', u'/file1.old') 
+0

謝謝,但訪問文件或列表文件不是我的目的,我只是想使用Windows服務器來驗證用戶和密碼,而不是使用本地MoinMoin wiki的默認用戶/密碼驗證機制。您的源代碼很有用。 – mike

+0

@mike:是的,我使用了一個認證文件,這是'smbclient'推薦的安全傳遞認證信息的方式。你也可以使用'pysmbclient'來檢查用戶名/密碼。 – nosklo