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

时间:2014-09-30 11:52:35

标签: shell ssh tabs sysadmin gnome-terminal

远程工作时,我在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',然后执行&#s; gate_tunnel'在其中。这是一个ssh别名,打开通往“mydesktop”的隧道。在学校,通过学校面向外部的服务器,“#”;

第二部分打开另一个标签,将其命名为“mydesktop'”,并执行“ssh tunneled_mydesktop'在其中。这是另一个ssh别名,它通过隧道连接到mydesktop。

~/.ssh/config: 

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

这是理论。实际上,这两个命令并行执行,而我需要确保第一个选项卡的命令(开放隧道)在执行第二个选项卡命令(通过隧道连接)之前完成。

是否可以在第二个标签中执行一些命令,等待&#39;等等。直到ssh隧道打开?

2 个答案:

答案 0 :(得分:3)

好的,我想我明白了。正如我在评论中提到的那样,从外面到达学校桌面时首先想到的是进入学校门口并从那里进入桌面,例如:

$ ssh -t gate.school.edu ssh desktop_name

那时只有一个标签,所以你的问题不存在。

然而,您当前的设置还有非常酷的内容:
在家里,它几乎就像你直接连接到你的台式机一样,所以你可以直接scp进入它并忘掉门。由于上面的解决方案不再可能,因为我们最终得到了一个间接连接:如果你想scp,你必须从门进行,这很糟糕。

查看有关使用ssh&lt; strong> ProxyCommand 功能的文章:

然后你将获得两全其美:)

答案 1 :(得分: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

您必须在第二个标签中运行此脚本。 希望它有所帮助。