【问题标题】:Communicating with smbpasswd with Python subprocesses using stdin/stdout使用 stdin/stdout 与 smbpasswd 与 Python 子进程通信
【发布时间】: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 密码:”)之前寻找输入。

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

【问题讨论】:

标签: python linux subprocess


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要告诉smbpasswd 使用标准输入作为密码提示。来自帮助文本:

    When run by root:
        smbpasswd [options] [username]
    otherwise:
        smbpasswd [options]
    
    options:
      -s                   use stdin for password prompt
    

    【讨论】:

    • 我还没有尝试过,但我明天会在工作中试一试。谢谢!
    猜你喜欢
    • 2014-02-14
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多