【问题标题】:start python program in the background that can prompt the user for password在后台启动可以提示用户输入密码的python程序
【发布时间】:2012-09-28 22:45:57
【问题描述】:

基本上我想在后台启动一个守护程序,它仍然会在控制台中提示用户输入密码。我用 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

【问题讨论】:

  • 我很确定你不能强迫你的程序不关闭......所以用户可以关闭你的程序来规避......
  • 好吧,如果用户明确关闭守护程序,我并不担心。我要做的是启动一个后台进程,用户可以在其中输入一个一次性密码在守护进程的开始。
  • 您是否考虑过使用 os.fork() 然后运行守护程序模块?
  • 是的,但我不知道如何将密码传递给守护进程。必须保持密码安全,即不要存储在硬盘上,也不要在屏幕上显示。
  • 如果是 windows 我可以帮你... :/

标签: python daemon background-process


【解决方案1】:

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

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

child.close(force=False)

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

【讨论】:

  • 这只会阻止它发送 SIGKILL。它仍然发送 SIGHUP 和 SIGINT
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 这正是我想做的。不知道为什么它以前没有打到我。谢谢
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多