일반적인 문제는 pexpect를 사용하여 sudo 권한이 필요한 스크립트를 호출하고 싶지만 암호를 한 번만 입력하고 싶지는 않다는 것입니다.pexpect에서 expect()와 interact()를 동시에 사용하기
내 계획은 pdopect를 사용하여 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("[email protected]")
s.sendline("cd ~")
while(s.isalive()):
pass
s.close()
, 그것은 나에게 출력을 제공하지 않지만, 프로세스가 시작된 것 같습니다 : (개념 증명에 대한) 내 코드는 다음과 같습니다. 여전히 CTRL-C 나 CTRL-D로 프로세스를 죽일 수는 없습니다. 프로세스를 개별적으로 종료해야합니다. 내가 기대하는 행동은 암호를 입력하라는 메시지를받는 것이고 그 후에는 자동으로 디렉토리를 홈 디렉토리로 변경해야합니다. 정확히 작동하지 않는 이유를 정확히 알지 못하지만 출력이 interact() 또는 expect()로만 전달됩니다.
누구든지 해결 방법에 대한 아이디어가 있습니까? 미리 감사드립니다.
Gread 아이디어를! 고마워,이게 효과가 있어야 해! – brandenb