【问题标题】:open gnome terminal tabs programmatically and execute commands in sequence以编程方式打开 gnome 终端选项卡并按顺序执行命令
【发布时间】:2014-11-25 01:00:29
【问题描述】:

远程工作时,我会在 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 别名,通过隧道连接到 mydesktop。

~/.ssh/config: 

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

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

是否有一些命令我可以在第二个选项卡中执行,“等待”直到 ssh 隧道打开?

【问题讨论】:

  • 锁定能回答你的问题吗? stackoverflow.com/q/169964/2157640如果是这样,您可以将其作为副本关闭。
  • 最简单的方法是在第二个命令之前添加sleep 10; 之类的内容,但当然,这只有在您确定隧道会在 10 秒内打开(或您输入的任何数字)的情况下才有效)。你能告诉我确切的隧道命令是什么(或尽可能接近)吗?
  • 问题中引用了确切的隧道命令,在 ~/.ssh/config 中有以下条目: Host gate_tunnel LocalForward 8023 :22 HostName User SuperElectric ForwardX11 是 ServerAliveInterval 30
  • 为什么需要在单独的选项卡中打开隧道?
  • @glennjackman 这正是我学会使用隧道的方式。该选项卡还可以让我轻松查看隧道是否仍处于打开状态。

标签: shell ssh tabs sysadmin gnome-terminal


【解决方案1】:

嗯...这可能不是一个完美的解决方案。理想情况下,您应该使用监视 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

您必须在第二个选项卡中运行此脚本。 希望对您有所帮助。

【讨论】:

    【解决方案2】:

    好的,我想我明白了。正如我在 cmets 中提到的,从外面到达学校桌面的第一件事就是通过 ssh 进入学校大门,然后从那里通过 ssh 进入你的桌面,如下所示:

    $ ssh -t gate.school.edu ssh desktop_name
    

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

    但是,您当前的设置非常酷
    在家里,几乎就像您直接连接到您的台式机一样,因此您可以直接scp 进入它而忘记门。使用上面的解决方案,这是不可能的,因为我们最终得到了一个间接连接:如果你想 scp,你必须从 gate 做,这很糟糕。

    查看这篇关于使用 ssh 的 ProxyCommand 功能的文章:

    你会得到两全其美的:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2016-12-13
      • 2010-11-14
      • 2014-10-10
      • 2023-03-17
      相关资源
      最近更新 更多