1

我一直在尝试使用 Python 的 subprocess 模块与程序(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 密码:”) .

然而,这是我的知识结束的地方。任何帮助是极大的赞赏!

4

2 回答 2

1

您可以使用pexpect来实现我想要的。我很确定 smbpassword 像su -ca一样打开PTY,您不能使用子进程通过PTY.

于 2012-05-11T16:16:43.103 回答
0

您需要告诉smbpasswd密码提示使用标准输入。从帮助文本中:

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

options:
  -s                   use stdin for password prompt
于 2012-05-11T16:50:19.400 回答