2017-06-12 6 views
0

J'essaie d'écrire stdout et stderr dans un fichier et d'entrer le mot de passe pour l'invite sudo qui est stockée dans une chaîne. Obtenir l'erreur de tuyau cassé dans le fichier err en essayant de l'exécuter en arrière-plan en dessous.Sous-processus python stdin.write (pwd) IOError: [Errno 32] Tube rompu

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() 

Obtenir l'erreur:

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

OS: CentOS

Version Python: 2.7.5

Répondre

0

Pour des raisons de sécurité, sudo lit les mots de passe du TTY, pas de l'entrée standard. Essayez d'utiliser cette commande à la place:

sudo --stdin yum -y install postgresql.x86_64 

Cela fera lire le mot de passe sudo depuis l'entrée standard, à moins que requiretty est spécifié dans le fichier sudoers, auquel cas vous auriez à émuler un ATS. Soit dit en passant, notez que sudo prend en charge de nombreuses méthodes d'authentification: mot de passe est seulement l'un d'entre eux. En particulier, sudo ne peut pas demander de mot de passe (par exemple, lors de l'utilisation de NOPASSWD). Assurez-vous donc au minimum pour vérifier que l'invite de mot de passe est présente avant d'écrire un mot de passe dans un processus. En général, pensez à offrir un programme qui utilise sudo et augmente les privilèges, ce qui rendra vos utilisateurs heureux.