以编程方式打开 GNOME 终端选项卡并按顺序执行命令

3
在远程工作时,我会在gnome-terminal中打开一系列选项卡,并执行命令。我希望将所有这些设置自动化为单个命令。
如果这些命令可以独立并行运行,我只需根据this question的答案进行调整。实际上,我尝试过使用以下shell脚本:

gnome-terminal --working-directory="/home/superelectric" --tab -t "gate" -e 'bash -c "export BASH_POST_RC=\"ssh gate_tunnel\"; exec bash"' --tab -t "mydesktop" -e 'bash -c "export BASH_POST_RC=\"ssh tunneled_mydesktop\"; exec bash"'

为了可读性而分布在多行中:

gnome-terminal \
  --working-directory="/home/superelectric" \
  --tab \
  -t "gate" \
  -e \
    'bash -c "export BASH_POST_RC=\"ssh gate_tunnel\"; exec bash"' \
  --tab \
  -t "mydesktop" \
  -e \
    'bash -c "export BASH_POST_RC=\"ssh tunneled_mydesktop\"; exec bash"'

第一部分打开一个标签页,命名为“gate”,并在其中执行“ssh gate_tunnel”。这是一个ssh别名,它通过学校面向外部的服务器“gate”打开到学校“mydesktop”的隧道。
第二部分打开另一个标签页,命名为“mydesktop”,并在其中执行“ssh tunneled_mydesktop”。这是另一个ssh别名,它通过隧道连接到我的桌面电脑。
~/.ssh/config: 

Host gate_tunnel
  LocalForward 8023 <my_desktop_at_school>:22
  HostName <my_school_server>

这是理论。实际上,这两个命令并行执行,而我需要确保第一个选项卡的命令(打开隧道)在执行第二个选项卡的命令(通过隧道连接)之前完成。
也许在第二个选项卡中有一些命令可以执行,等待ssh隧道打开?

锁定能解决你的问题吗?http://stackoverflow.com/q/169964/2157640 如果是这样,你可以将其标记为重复。 - Palec
最简单的方法是在第二个命令之前添加类似于“sleep 10;”这样的内容,但前提是您能够确保您的隧道会在10秒内打开(或者您设置的任何数字)。您能告诉我确切的隧道命令是什么(或尽可能接近的命令)吗? - Seth
确切的隧道命令如问题所引用,需要在~/.ssh/config中添加以下条目: Host gate_tunnel LocalForward 8023 <我在学校的桌面>:22 HostName <我学校的服务器> User SuperElectric ForwardX11 yes ServerAliveInterval 30 - SuperElectric
为什么需要在单独的标签页中打开隧道? - glenn jackman
你真的需要制表符吗?如果对你来说都一样,那就使用屏幕吧。 - Gaurav Joseph
显示剩余3条评论
2个回答

3

好的,我想我明白了。正如我在评论中所提到的,要从外部访问您的学校桌面,首先想到的是通过ssh进入学校网关,然后使用以下类似方式ssh到您的桌面:

$ ssh -t gate.school.edu ssh desktop_name

那么现在只有一个选项卡,所以您的问题不存在。

但是,在您当前的设置中,有一些非常酷的东西:
从家里访问几乎就像是直接连接到您的桌面设备一样,因此您可以直接使用scp进行传输,不需要再用gate了。但是使用上述解决方案就不再可能实现这一点,因为我们会得到一条间接连接:如果您想要scp,则必须通过gate进行,这很麻烦。

请查看此文章,了解如何使用ssh的ProxyCommand功能:

那么您就可以两全其美啦 :)


0

嗯...这可能不是一个完美的解决方案。理想情况下,您应该使用一些监视ssh连接的工具。但是,您可以使用ps检查ssh进程,并等待ssh命令启动。

#!/bin/bash

COUNTER=0
while [  $COUNTER -lt 10 ]; do # try 10 times
if ps aux ¦ grep <my_desktop_at_school> then
# the tunnel connected now execute the second command
'bash -c "export BASH_POST_RC=\"ssh tunneled_mydesktop\"; exec bash"'
else 
continue # or you could do something here if you wish
fi 
sleep 10 # sleep for 10 seconds and try again 
let COUNTER=COUNTER+1 
done

你需要在第二个标签页中运行此脚本。 希望能有所帮助。


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