子进程调用中的环境变量传递

4

我写了一个如下的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(一个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

在这种情况下,我总是得到的返回码是1而不是0,似乎环境变量PASSWD没有传递。你能告诉我为什么吗?有什么解决方案建议吗?

Env被传递到进程内部,因此如果在moinmoin中运行代码,则需要确保moinmoin实际上获得了您期望的环境:您是如何启动moinmoin的?还要注意,像您这样传递密码是一个可怕的想法,原因有很多,包括安全性。 - David Cournapeau
1个回答

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

谢谢,但访问文件或列出文件不是我的目的,我只想使用Windows服务器来验证用户和密码,而不是使用本地MoinMoin Wiki的默认用户/密码验证机制。你的源代码很有用。 - mike
@mike:是的,我使用认证文件,这是smbclient推荐的安全传递认证信息的方式。你也可以仅使用pysmbclient来检查用户名/密码。 - nosklo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接