繁体   English   中英

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

[英]Communicating with smbpasswd with Python subprocesses using stdin/stdout

我一直在尝试使用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会提示用户输入其旧密码(如果在终端中运行该命令,则会显示“ Old SMB password:”),然后再寻找输入。 。

但是,这就是我的知识的终点。 任何帮助是极大的赞赏!

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

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

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

options:
  -s                   use stdin for password prompt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM