一般的问题是,我想使用 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()
Run Code Online (Sandbox Code Playgroud)
当我调用这个脚本时,它没有给我任何输出,但这个过程似乎已经开始。尽管如此,我还是无法使用 CTRL-C 或 CTRL-D 来终止该进程——我必须单独终止该进程。我期望的行为是提示输入密码,然后它应该自动将目录更改为主目录。我不完全知道为什么它不起作用,但我想输出只会转发到交互()或期望()。
有没有人知道如何解决这个问题?提前致谢。