subprocess调用的env传递

4 投票
1 回答
4490 浏览
提问于 2025-04-16 11:55

我写了一个下面这样的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

当我执行它时,一切正常,返回代码是0。你知道的,我把密码作为环境变量传递,这样Python就不会问我密码了。

这没问题。

现在,我想把这段代码移到MoinMoin(一个维基引擎)的代码里,放在一个叫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

在这种情况下,我总是得到返回代码1,而不是0,似乎环境变量没有传递PASSWD这个环境变量。

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

1 个回答

0

我可以毫不客气地推荐一下 pysmbclient 吗?这是我写的一个小工具,用来替代工作中的一些脚本,虽然有点不太正规,但对我来说效果很好。

>>> 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')

撰写回答