如何创建新的终端会话并执行多个命令

时间:2012-07-16 08:32:36

标签: bash

我正在寻找一种自动启动开发环境的方法。我有三个必须启动的虚拟机,然后必须ssh每个虚拟机并打开它们。

到目前为止,我已经让他们开始并设法与他们合作:

#!/bin/sh 
virsh start virtual_1
virsh start virtual_2
virsh start virtual_3
sleep 2m

gnome-terminal --title "virtual_3: server" -x ssh root@192.168.1.132 &
gnome-terminal --title "virtual_2: 11.100" -x ssh root@192.168.11.100 &
gnome-terminal --title "virtual_1: 12.100" -x ssh root@192.168.12.100 &

如何在每个启动openvpn的终端中执行附加命令?

为简单起见,我试图在每个终端echo 1而不是启动VPN。

我发现终端启动时的多个命令可以像:

一样运行
gnome-terminal -x bash -c "cmd1; cmd2"

因此,为了让一个终端保持简单,我改变了:

gnome-terminal --title "virtual_3: server" -x ssh root@192.168.1.132 &

为:

gnome-terminal --title "virtual_3: server" -x bash -c "ssh root@192.168.1.132 ; echo 1" &

但是1没有打印在virtual_3的终端中。 然后我想,也许在终端准备好之前命令执行得太快,所以我尝试添加&&

gnome-terminal --title "virtual_3: server" -x bash -c "ssh root@192.168.1.132 &&; echo 1" &

但这也没有结果。

1 个答案:

答案 0 :(得分:11)

首先,如果你运行

gnome-terminal -x bash -c "cmd1; cmd2"

bash执行cmd1cmd2。它不首先执行cmd1,然后将cmd2提供给其结果。 ssh是在终端中运行的程序,在完成之前不会执行cmd2

因此,您需要运行ssh并告诉 执行您的命令。

您可以通过以下方式实现:

ssh user@address "command_to_execute"

但是,ssh在命令完成后退出。正如您在“With ssh, how can you run a command on the remote machine without exiting?”中看到的那样,您可以使用ssh选项执行-t,以便它不会退出:

ssh -t user@address "command_to_execute"

所以你的命令最终成为:

gnome-terminal --title "virtual_3: server" -x bash -c "ssh -t root@192.168.1.132 'echo 1'"

你是对的,单独给-t是不够的(尽管有必要)。 -ttty分配缓冲区,但不为您执行bash。来自ssh的手册:

  

-t 强制伪tty分配。这可用于在远程计算机上执行任意基于屏幕的程序,这可能非常有用,例如,实现菜单服务时。多个-t选项强制tty分配,即使ssh没有本地tty。

     

如果指定了command,则会在远程主机而不是登录shell上执行。

所以你需要的是,执行抨击你自己。因此:

ssh -t user@address "command_to_execute; bash"