我正在寻找一种自动启动开发环境的方法。我有三个必须启动的虚拟机,然后必须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" &
但这也没有结果。
答案 0 :(得分:11)
首先,如果你运行
gnome-terminal -x bash -c "cmd1; cmd2"
您bash
执行cmd1
和cmd2
。它不首先执行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
是不够的(尽管有必要)。 -t
为tty
分配缓冲区,但不为您执行bash。来自ssh
的手册:
-t 强制伪tty分配。这可用于在远程计算机上执行任意基于屏幕的程序,这可能非常有用,例如,实现菜单服务时。多个-t选项强制tty分配,即使ssh没有本地tty。
如果指定了
command
,则会在远程主机而不是登录shell上执行。
所以你需要的是,执行抨击你自己。因此:
ssh -t user@address "command_to_execute; bash"