1

基本上我想在后台启动一个守护进程,它仍然会在控制台中提示用户输入密码。我用 pexpect 创建了这个,但是当这个程序结束时,它会杀死守护进程,因为它是一个子进程。所以显然 pexpect 不会为此工作。有没有人知道这样做的方法?

#!/usr/bin/env python
import pexpect
import getpass
child = pexpect.spawn('python daemon.py &')
child.expect_exact('Password:')

passwd = getpass.getpass()

child.sendline(passwd)

index = child.expect_exact('Started Successfully')
print index
4

2 回答 2

3

pexpect 有一个方法close(self, force=True)关闭它与子进程的连接。

根据文档,如果 force=True 则终止子进程

child.close(force=False)

应该断开连接,但让应用程序继续运行。

于 2012-09-28T23:03:30.920 回答
1

Dany 建议:“您是否考虑过使用 os.fork() 然后运行守护程序模块?”

您的回答是“是的,但我不知道如何将密码传递给守护程序。必须确保密码安全,即不要存储在硬盘上,也不要在屏幕上显示它。”

但是您无需执行任何操作即可将密码传递给守护程序。分叉后,它仍然可以访问。例如:

passwd = getpass.getpass()
pid = os.fork()
if pid:
  print 'Parent thinks passwd is', passwd
else:
  print 'Child thinks passwd is', passwd

所以,在父进程中读取密码,然后分叉守护进程;它已经有了密码,所以它不需要任何 tty。问题解决了。

于 2012-09-28T23:33:06.843 回答