子进程调用的env传递

时间:2011-02-16 08:06:50

标签: python

我写了一个python脚本如下:

#!/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(一个wiki引擎)代码。在名为User的类中,作为下面的函数

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环境变量。

你能告诉我为什么吗?还有任何解决方案的建议?

1 个答案:

答案 0 :(得分: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')