Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Interraction python/shell

+5 votes

Dans le cadre d'un projet, je cherche à lancer Apache à l'aide de python (module subprocess). J'utilise le bout de code ci-dessous et tout fonctionne correctement.

    proc = subprocess.Popen([/usr/local/bin/sudo', '/path/to//httpd', '-f', 'httpd.conf', '-k', 'start'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    proc.communicate()

Cependant je rencontre un problème lorsque l'un de sites présents dans mon fichier de configuration possède une "passphrase" sur l'un des certificats. Apache lance un prompt pour entrer la passphrase, et la il m'est impossible de fournir la passphrase à l'aide de python.
J'ai déjà essayé quelques méthode et rien ne fonctionne.

proc.communicate('passphrase')

ou

proc.stdin.write('passphrase') 
proc.stdin.flush()

ainsi que le module pexpect.

Le résultat est le même: l'information n'est pas passé au prompt, et du coup mon script bloque.
Si vous aviez quelques pistes à essayer pour solutionner mon problème, je suis preneur

demandé 6-Jul-2015 par Flouflou (152 points)

en ligne de commande il n'y a pas moyen de faire lire une entrée comme ca ? :

lacommandepourlancerapache < lapassphrase

sinon j'aurai bien surggéré fabtools mais j'ai rien vu de probant traitant des certificats ou demande d'entrée de la pas de l'utilisateur

edit : pas de bol j'ai pondu une conf apache ssl qui ne me reclame pas de passphrase bien qu'en ayant mis une

2 Réponses

+3 votes
 
Meilleure réponse

Top merci pour votre aide, j'ai finalement réussi à faire marcher à l'aide de pexpect.
Si cela peut aider quelqu'un, voici le code en question :)

passphrase = 'test'
cmd = '/usr/local/bin/sudo /path/to/httpd -f httpd.conf -k start'
child = pexpect.spawn(cmd, timeout=3)
initial_dialog = child.expect(["Enter pass phrase:", pexpect.EOF, pexpect.TIMEOUT])
# We get pass phrase prompt
if initial_dialog == 0:
    child.sendline(passphrase)
    pass_confirm_dialog = child.expect(["OK: Pass Phrase Dialog successful.",
                                        "Apache:mod_ssl:Error: Pass phrase incorrect"])
    if pass_confirm_dialog == 0:
        return True
    elif pass_confirm_dialog == 1:
        return False
else:
    return False
répondu 8-Jul-2015 par Flouflou (152 points)

Si la réponse te vas, clique sur la coche en dessous des votes pour l'accepter ;)

+7 votes
répondu 6-Jul-2015 par Sam (4,980 points)

pexpect à l'air pas trop mal.

Je pense qu'il aurait été encore plus clair/facile de refiler un bout de code utilisant pexpect répondant spéficiquement à la problématique =D

Flouflou, passe ton com's en réponse, ce sera plus clair, ensuite tu mets le post en résolu ^^

...