python subprocess stdin.write(pwd)IOError:[Errno 32]管道损坏

时间:2017-06-12 09:42:30

标签: python subprocess ioerror

我正在尝试将stdout和stderr写入文件并输入存储在字符串中的sudo提示符的密码。在尝试以下面的方式在后台执行时,在错误文件中获取损坏的管道错误。

cmd.py

def preexec_function():
    import os
    import signal
    # Detaching from the parent process group
    os.setpgrp()
    # Explicitly ignoring signals in the child process
    signal.signal(signal.SIGINT, signal.SIG_IGN)

cmd = "python pexecutor.py"
p = Popen(cmd, close_fds=True, stdout=None, stderr=None, stdin=None,
          preexec_fn=preexec_function)

pexecutor.py

from subprocess import Popen, PIPE
import os
command="sudo yum -y install postgresql.x86_64"
stdin_str="myrootpwd"
std_out_file = open("out.txt", 'a+')
std_err_file = open("err.txt", 'a+')
process = Popen(command, stdout=std_out_file, stderr=std_err_file, 
                stdin=PIPE)
import time
time.sleep(5)
pwd = b'{}'.format(stdin_str + str(os.linesep))
process.stdin.write(pwd)
process.stdin.flush()
data = process.communicate()

获取错误:

Traceback (most recent call last):
    File "pexecutor.py", line 10, in execute
  process.stdin.write(pwd)
IOError: [Errno 32] Broken pipe

操作系统:CentOS

Python版本:2.7.5

1 个答案:

答案 0 :(得分:0)

出于安全原因,sudo从TTY读取密码,而不是从标准输入读取密码。请尝试使用此命令:

sudo --stdin yum -y install postgresql.x86_64

这将使sudo从标准输入中读取密码,除非在sudoers文件中指定requiretty,在这种情况下,您必须模拟TTY。

顺便提一下,请注意sudo支持许多身份验证方法:密码只是其中之一。特别是,sudo可能不会要求输入密码(例如,在使用NOPASSWD时),因此在将密码写入a之前,请确保作为最低以检查密码提示是否存在过程

一般情况下,考虑提供使用sudo和升级权限的程序是否会让用户满意。