如何使用python在已打开的特定终端窗口中执行命令?
我可以使用python在新终端中执行命令,但我想重用现有的终端。并且有多个终端开放。 该命令应该在特定终端中运行。
例如:
我正在使用Ubuntu。
执行此操作的原因:
答案 0 :(得分:0)
我的解决方案有点麻烦并且存在安全问题。也许其他人可以发布一个更好的。
要在打开的终端窗口中执行命令,我使用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])
我在使用python 3.5运行kali(使用xfce4-terminal)的rPi上测试了这个。