小编And*_*dré的帖子

在 pexpect 中同时使用 expect() 和 interact()

一般的问题是,我想使用 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 来终止该进程——我必须单独终止该进程。我期望的行为是提示输入密码,然后它应该自动将目录更改为主目录。我不完全知道为什么它不起作用,但我想输出只会转发到交互()或期望()。

有没有人知道如何解决这个问题?提前致谢。

python-2.x pexpect

3
推荐指数
1
解决办法
4919
查看次数

标签 统计

pexpect ×1

python-2.x ×1