我的解决方案有些笨拙,而且存在安全问题。也许其他人可以发布更好的解决方案。
为了在打开的终端窗口中执行命令,我使用了ttyecho(请参见unix.stackexchange上的post)。这种方法的安全问题似乎类似于使用shell=True
与subprocess.Popen
或subprocess.run
。
至于选择特定的打开终端,Linux命令ps a
列出与tty相关联的进程并标识tty。我正在使用Debian衍生版,因此我的打开终端显示为具有“pts/n”(伪终端从属)tty的进程,其中n是区分不同打开终端实例的整数。例如:
PID TTY STAT TIME COMMAND
191 tty7 Rsl+ 9:12 /usr/lib/xorg/Xorg :0 -seat seat0 -aut /var/run/ligh
1049 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux
1050 ttyS0 Ss+ 0:00 /sbin/agetty ==keep-baud 115200,38400,9600,ttyS0 vt22
4254 pts/0 Ss 0:00 bash
4675 pts/1 Ss+ 0:00 bash
4876 pts/2 Ss+ 0:00 sudo /srv/xxx/main.py
4878 pts/2 S+ 0:01 python3 /srv/xxx/main.py
5012 pty/0 R+ 0:00 ps a
假设您可以通过终端中已经运行的内容区分要在哪个终端中运行命令,您可以使用类似以下 Python 代码的方式:
import subprocess
r = subprocess.run(['ps', 'a'], stdout=subprocess.PIPE, universal_newlines=True)
try:
pts = [*(line for line in r.stdout.split('\n') if searchstring in line)][0]=.split(' ')[1][4:]
except IndexError:
pts = None
if pts:
r2 = subprocess.run(['sudo', 'ttyecho', '-n', '/dev/pts/' + pts, command])
我已经在运行Kali(使用xfce4-terminal)的rPi上使用Python 3.5进行了测试。
tmux
或screen
)。 - Charles Duffy