【发布时间】:2017-09-08 08:02:58
【问题描述】:
一般的问题是,我想使用 pexpect 来调用需要 sudo 权限的脚本,但我并不总是想输入我的密码(只输入一次)。
我的计划是使用 pexpect 生成一个具有 sudo 权限的 bash 会话并从那里调用脚本。基本上我总是想让会话保持忙碌,每当一个脚本停止时,我想启动另一个。但是在脚本运行时,我希望用户能够控制。含义:
脚本应该在诸如expect("root@")之类的之后调用,所以每当会话空闲时,它就会启动另一个脚本。当脚本运行时,interact() 正在让用户控制他想要提供的可能输入。
我的想法是使用不同的线程来解决这个问题。我的代码(用于概念验证)如下所示:
import pexpect
import threading
class BashInteractThread(threading.Thread):
def __init__(self, process):
threading.Thread.__init__(self)
self.pproc = process
def run(self):
self.pproc.interact()
s = pexpect.spawn("/bin/bash", ['-i', '-c', "sudo bash"])
it = BashInteractThread(s)
it.start()
s.expect("root@")
s.sendline("cd ~")
while(s.isalive()):
pass
s.close()
当我调用这个脚本时,它没有给我任何输出,但是这个过程似乎已经开始了。不过,我不能 CTRL-C 或 CTRL-D 来终止进程 - 我必须单独终止进程。我期望的行为是提示输入密码,然后它应该自动将目录更改为主目录。 我不完全知道为什么它不起作用,但我猜输出只会转发到interact() 或expect()。
有人知道如何解决这个问题吗?提前致谢。
【问题讨论】:
-
python3.8.2 要求:filter_buf += s.decode("utf-8")
标签: python-2.x pexpect