我该如何启动多个xterm窗口并在每个窗口上运行一个命令,且让每个窗口在执行命令后保持打开状态?

7

我很懒,更喜欢让计算机帮我完成工作。我每天都要通过ssh登录几台机器,因此我创建了一个简单的脚本,可以启动一些xterm窗口并将它们放置在我想要的位置(正如您所看到的,我正在使用bash):

#!/bin/bash
xterm -geometry 80x27+1930+0 &
xterm -geometry 80x27+2753+0 &
xterm -geometry 80x27+1930+626 &
xterm -geometry 80x27+2753+626 &

但是,我接下来要做的事情是去到第一个窗口并输入

ssh server_a

然后在第二个步骤中。
ssh server_b

我想让我的脚本在每个xterm窗口执行ssh命令,然后保留窗口让我继续使用。我看到了xterm的-e选项,但是窗口在我执行完命令后就会关闭。有没有办法做到这一点?抱歉如果这是一个重复的问题,我已经搜索过了,但没有任何结果。非常感谢!

你想让窗口在退出ssh会话后保留吗?还是因为你通过ssh运行特定命令,窗口立即退出,而你想让ssh会话保持开启(因此窗口也保持开启)? - Etan Reisner
4个回答

7

我希望能给出更为优雅的回答,但我所想到的方法确实可行:

xterm -e bash -c 'echo foo; exec bash'

echo foo替换为您选择的命令,然后您就可以开始了。

1
请注意,(至少某些版本的)xterm 还具有 -hold 选项,可以防止窗口在命令终止后立即关闭,因此您可以查看最终输出,如果这是所需的... - twalberg

2

这个答案提供了目前我所见过最好的解决方法。在执行终端时,使用bash --init-file标志,可以在shebang或执行终端时使用:

#!/bin/bash --init-file
commands to run

...并将其作为以下方式执行:

xterm -e /path/to/script
# or
gnome-terminal -e /path/to/script
# or
the-terminal -e bash --init-file /path/to/script/with/no/shebang

我对exec选项唯一的真正抱怨是,如果在执行exec bash之前执行的命令运行时间很长且用户中断它(^C),它不会运行shell。使用--init-file选项可以继续运行shell。

另一个选项是来自OpenWin项目的cmdtool

/usr/openwin/bin/cmdtool -I 'commands; here'
# or
/usr/openwin/bin/cmdtool -I 'commands; here' /bin/bash

cmdtool 注入使用 -I 传递的命令到从进程中,就像是用户输入的一样。这将导致执行的命令留存在 shell 历史记录中。


0
"ClusterSSH通过单个图形控制台窗口控制多个xterm窗口,允许在ssh连接上交互式地运行多个服务器上的命令。"

https://github.com/duncs/clusterssh/wiki

$ cssh server_a server_b
$ command

0

另一个选择是使用 Gnome Terminator。 它可以交互式地创建和定位终端,并且您可以在 Terminator 首选项中设置每个终端运行的命令。

此外,还可以使用键绑定执行诸如移动、旋转、最大化/最小化包含在 Terminator 窗口中的终端等许多额外技巧。

请参见:https://superuser.com/a/610048


不确定为什么他们给你点了踩,因为这是那种工作的正确答案。 - vimdude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接