使用stdin / stdout与Python子进程使用smbpasswd进行通信

时间:2012-05-11 16:12:01

标签: python linux subprocess

我一直在尝试使用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密码:”)寻找输入。

然而,这是我的知识结束的地方。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用pexpect来实现我的目标。我非常确定smbpassword会像su -cPTY一样打开,您无法使用子流程通过PTY进行通信。

答案 1 :(得分:0)

您需要告诉smbpasswd使用stdin作为密码提示。从帮助文本:

When run by root:
    smbpasswd [options] [username]
otherwise:
    smbpasswd [options]

options:
  -s                   use stdin for password prompt