【发布时间】:2012-05-20 06:20:52
【问题描述】:
我一直在尝试使用 Python 的子进程模块与程序 (smbpasswd) 进行通信,但没有取得多大成功。我可以毫无问题地与不同的程序(例如 grep)通信,所以问题是 smbpasswd 特有的。为了说明这个问题,下面的代码可以工作:
>>> p = Popen(["grep", "n"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
>>> stdout = p.communicate(input='one\ntwo\n')[0]
>>> print(stdout)
one
但是,以下不是:
>>> p = Popen(["smbpasswd", "-r", server, "-U", user], stdout=PIPE, stdin=PIPE, stderr=PIPE)
>>> stdout = p.communicate(input='old_password')[0]
>>> print(stdout)
不同之处在于,grep 在调用初始的“grep f”后等待用户输入,而 smbpasswd 提示用户输入他们的旧密码(如果您在终端中运行该命令,则会显示“旧 SMB 密码:”)之前寻找输入。
然而,这是我的知识结束的地方。非常感谢任何帮助!
【问题讨论】:
-
使用密码的实用程序通常不使用
stdin,出于安全原因,它们会打开与终端的直接连接。看看expect。
标签: python linux subprocess