8

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

到目前为止,我已经让他们开始并设法通过 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" &

但这也没有结果。

4

1 回答 1

11

首先,如果你运行

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

你可以bash执行cmd1and cmd2. 它不会先执行cmd1然后给出cmd2结果。ssh是在终端中运行的程序,在cmd2完成之前不会执行。

所以你需要运行ssh并告诉执行你的命令。

你可以这样做:

ssh user@address "command_to_execute"

但是,ssh在命令完成后退出。正如您在“使用 ssh,如何在不退出的情况下在远程机器上运行命令? ”中看到的那样,您可以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仅仅给予是不够的(尽管是必要的)。-t为您分配缓冲区,tty但不为您执行 bash。从手册ssh

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

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

所以你需要的是,执行 bash 你自己。所以:

ssh -t user@address "command_to_execute; bash"
于 2012-07-16T08:43:14.857 回答