8

開発環境の起動を自動化する方法を探しています。起動する必要がある 3 つの仮想マシンがあり、それぞれ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"

したがって、1つの端末をシンプルに保つために、次のように変更しました。

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実行すること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 オプションを指定すると、ssh にローカル tty がない場合でも、tty の割り当てが強制されます。

が指定されている場合、ログイン シェルの代わりにcommandリモート ホストで実行されます。

したがって、必要なのは、bash your self を実行することです。したがって:

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