Faça o Python inserir a senha ao executar um script CSH
Pergunta
Estou escrevendo um script python que executa um script CSH no Solaris 10. O script CSH solicita ao usuário a senha root (que eu conheço), mas não tenho certeza de como fazer o script Python responder o prompt com a senha. Isso é possível? Aqui está o que estou usando para executar o script CSH:
import commands
commands.getoutput('server stop')
Solução
Dê uma olhada no pexpect módulo. Ele foi projetado para lidar com programas interativos, que parecem ser o seu caso.
Ah, e lembre-se de que a senha de codificação rígida em um script de shell ou python é potencialmente um buraco de segurança: D
Outras dicas
Usar subprocesso. Ligue para Popen () para criar seu processo e usar o Communicate () para enviar texto. Desculpe, esqueci de incluir o tubo ..
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate('password')
Você faria melhor evitar a senha e tentar um esquema como sudo e sudoers. O Pexpect, mencionado em outro lugar, não faz parte da biblioteca padrão.
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')
child.sendline('password')
print "Stopping the servers..."
index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)
Fez o truque! Regras do Pexpect!
Adicionar input=
dentro proc.communicate()
Faça -o funcionar, para caras que gostam de usar a Lib padrão.
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
Deve ser capaz de passar como um parâmetro. algo como:
commands.getoutput('server stop -p password')
Isso parece funcionar melhor:
import popen2
(stdout, stdin) = popen2.popen2('server stop')
stdin.write("password")
Mas ainda não está 100%. Mesmo que "senha" seja a senha correta, ainda estou recebendo SU: desculpe de volta do script CSH quando está tentando o SU Root.
Para evitar ter que responder à pergunta da senha no script python, vou executar o script como root. Esta pergunta ainda não foi respondida, mas acho que vou fazer dessa maneira por enquanto.