python osx 终端线程 subprocess.Popen

python osx terminal thread with subprocess.Popen

我在 Python 中有一个使用子进程和 Popen 的程序,但是当我 运行 一个特定的二进制文件时,一个名为 itnl/itunnel 的 iOS 工具,它保留了终端 window 打开用于记录目的,因此我无法向该终端写入任何进一步的命令,例如 ssh 命令。

我试过各种选项,包括我在另一个 SO 线程中找到的 creationflags,但它似乎在 OSX 上不起作用。

运行 OSX 和 python 2.7 自制程序安装。

if ("iPhone" in stdout or "iPad" in stdout):
        self.progressBox.AppendText('Device found. Starting iTunnel\n')
        cmd = toolsDir + "/itnl --iport 22 --lport 2222"
        p = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        stdout = p.communicate()[0]
        if "Device connected" in stdout:
            cmd = "ssh -p 2222 root@127.0.0.1"
            p = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

一旦隧道 运行s 它就坐在那里等待来自设备的连接,如下所示:

 [INFO] Waiting for new TCP connection on port 2222
 [INFO] Waiting for device...
 [INFO] Device connected: 6a0a098xxxxxxxx3cb2ef9ef6205

(这是当您键入 'ssh etc etc' 以完成连接时)

p.communicate() 将阻塞直到进程终止,因此它可以 return 该进程的所有输出。你想在非阻塞模式下使用它,在 SO 上搜索它应该会找到一些很好的例子。

您可能还想看看使用 pexpect 模块。

通过将任何输出发送到 dev/null 并使进程后台运行,找到了解决我的问题的方法:

./itnl --iport 22 --lport 2222 > /dev/null 2>&1 &

不太理想,因为我现在无法获取标准输出以查看设备是否已连接,但它 returns 我进入终端提示并允许进一步的命令。