一般的な問題は、pexpectを使用してsudo権限が必要なスクリプトを呼び出すことですが、パスワードを入力する必要はありません。pexpectでexpect()とinteract()を同時に使用する
私の計画は、pdopectを使ってsudo権限でbashセッションを作成し、そこからスクリプトを呼び出すことです。基本的に私はいつもセッションをビジーにしたい、1つのスクリプトが停止したときに、別のスクリプトを開始したい。しかし、スクリプトが実行されている間、私はユーザーに制御権を与えたい。意味:
スクリプトは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("[email protected]")
s.sendline("cd ~")
while(s.isalive()):
pass
s.close()
、それは私に任意の出力を与えるものではありませんが、プロセスが開始されているようだ:(概念実証のための)私のコードは次のようになります。それでも、CTRL-CやCTRL-Dでプロセスを強制終了することはできません。プロセスを個別に終了する必要があります。私が期待している動作は、パスワードの入力を求めるプロンプトが表示された後、自動的にディレクトリをホームディレクトリに変更する必要があります。 私はそれがうまくいかない理由を正確には知りませんが、出力はinteract()またはexpect()のどちらかにしか転送されません。
これを解決する方法を知っている人はいますか?前もって感謝します。
Greadはアイデア!ありがとう、これは動作させる必要があります! – brandenb