2014-05-19 54 views
0

我有一个小程序(程序A)要求输入密码,如果密码正确,它会打开一个shell。我想在python中创建另一个程序(程序B),它调用程序A并给出密码作为输入,以便打开shell。使用子进程的Python利用

我正在做以下工作,但程序只是终止,不让我使用shell。

p = subprocess.Popen("./ProgramA", stdin=subprocess.PIPE) 
p.communicate("password") 

当运行程序B我的终端是这样的:

~/Desktop/$./ProgramB 
Password: Here is your shell. 
~/Desktop/$ (this is not the shell opened by program A) 

我该如何解决这个问题?

回答

0

shell从其父进程启动ProgramA inehrits stdin,因此它继承了管道。此时管道已经关闭,所以壳体退出。

你会想把终端保留为stdin,但是这样很难伪造密码输入。

0

Popen.communicate()关闭子进程的stdin并等到它终止 - 这是预期的行为。你需要的仅仅是p.stdin.write("password")

+0

这也不会使它工作,因为用户无法提供任何交互式输入到shell。您需要添加将'ProgramB'的标准输入转发给'ProgramA'的任何输入的代码。 –

0

假设这是linux或osx,如果stdin是一个管道而不是终端,并且他们还“四处走动”并读取终端的密码,程序通常会以不同的方式运行。在你的情况下,该程序可能没有看到终端并退出。尝试使用python pexpect模块或阅读其源代码以了解如何为标准输入打开一个pty。