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 我进入终端提示并允许进一步的命令。
我在 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 我进入终端提示并允许进一步的命令。