Python、运行终端,在里面执行命令

Python, run terminal, and execute command in it

我正在使用 Python 2.7.5,因为这个版本安装在我想要 运行 脚本的机器上。

我在 Tkinter 中创建了一个简单的 GUI,带有按钮和文本输入。 现在在一个输入中我提供了服务器的 ip 或主机名,在下一步中我读取输入字段的值并将其发送到 linux bash 终端,这里我遇到了问题。

从输入字段中读取值(效果很好)

nazwa_ip = self.Input_IP_hostname.get("1.0", 'end-1c')

下一个:

os.system('gnome-terminal --window-with-profile=MY_PROFILE -e "ssh -t user_name@nazwa_ip"')

这就是问题所在,因为它不会将 "nazwa_ip" 更改为读取值。该命令发送到终端:

ssh -t user_name@nazwa_ip

但我想发送:

ssh -t user_name@ip_adres_from_input_field

有人可以帮我解决这个问题吗?

字符串格式将在此处起作用:

os.system('gnome-terminal --window-with-profile=MY_PROFILE -e "ssh -t user_name@%s"' % nazwa_ip)

使用 subprocess 方法可能会更好。

import subprocess

nazwa_ip = self.Input_IP_hostname.get("1.0", 'end-1c')
ssh_param = "ssh -t user_name@{}".format(nazwa_ip)
subprocess.call(['gnome-terminal', '--window-with-profile=MY_PROFILE', '-e',  ssh_param])

根据 Python 文档,建议将 os.system 替换为 subprocess 模块。

status = os.system("mycmd" + " myarg")
# becomes
status = subprocess.call("mycmd" + " myarg", shell=True)

虽然 运行 子进程很容易,但在图形终端中启动一个与用户启动的行为完全一样的子进程有点棘手。您可以使用我的程序 interminal (link),它基本上执行 Stephen Rauch 的回答对 gnome-terminal 所做的操作,但通过 shell 以便用户环境变量和别名等全部可用,如果它们影响 ssh 的运行方式,这可能很有用。

您可以像这样从 Python 使用它:

import subprocess
subprocess.Popen(['interminal', 'ssh', '-t', 'username@{}'.format(ip_address)])