私はしばらくVirtualboxを使用してきましたが、Virtualboxと対話する方法を学んだ唯一の方法は、グラフィカルインターフェイスを介していました。
ゲストと対話するためにホストシステムでスクリプトを作成できるように、コマンドラインを介して仮想マシンにbashコマンドを送信する方法はありますか?
例えば
$ sendMessage vmName "echo hello"
新しい仮想化ソフトウェアを試してみたいと思います。
私は現在Macを使用しており、この方法でLinuxクライアントを実行したいと思います。
編集する:
潜在的なマルウェアを実行して動作を確認したいと思います。理想的には、ゲストが完全に隔離されるようにゲストのネットワーキングを無効にしたいと思います。
私はゲストとホストが純粋にstdin / stdoutを介して通信したいと思います。
答え1
共有ファイルシステムの使用
VirtualBoxサポートを使用してゲストのホストディレクトリを公開できます。テストするコードを共有ディレクトリに直接配置し、仮想マシンを起動し、コンソールを使用して共有ディレクトリに移動してコードを実行します。ネットワークは必要なく、ホストへの公開は共有ディレクトリにのみ存在し、スナップショットを使用してゲストファイルシステムへの変更を元に戻すことができます。
仮想シリアルポートの使用
ネットワークを設定せずにホストシステムがゲストと対話できるようにゲストシリアルポートを設定できます。
VirtualBoxで、設定 - >ポートに移動して最初のシリアルポートを有効にし、ポートモードを「Host Pipe」に設定します(「Create Pipe」が選択されていることを確認)。そのフィールドにパス(例:)を入力します/tmp/hostserial
。パスはホストに公開されるUnixソケットです。
ゲストをアクティブにします。今あなたの使命は、ゲストが内部的にシリアルポートと通信することです。この試み:
agetty -l /bin/bash -n ttyS0 115200 vt100
ttyS0
これにより、最初のシリアルポートでbashシェルが起動します。 OS Xホストにインストールされていることを確認し、netcat
次のことを試してください。
nc -U /tmp/hostserial
bash
ゲストと会話をする自分を発見することになります。これはまさにあなたが望むものではありませんが、とにかく役に立ちます。
私自身は、共有ディレクトリを使用する最初のオプションを選択します。
答え2
これを行うために特別なツールや他の仮想マシンシステムは必要ありません。ssh
あなたが欲しいものはすでに完了しています:
$ ssh vmName "echo hello"
VMのホスト名またはIPをvmName
。
ホスト名を使用している場合は、何らかの方法で解決できる必要があります。ゲストが静的IPを持っている場合、最も簡単な方法はでこれを行うことです/etc/hosts
。ゲストがDHCPを使用している場合は、DHCPに切り替えることをお勧めします。DNSこれは、DHCP サーバーの場合 (まだ実行していない場合) DNS サーバーとしても機能し、各 DHCP リースの DNS エントリを自動的に構築するためです。
あなたも欲しい鍵ベースのSSH認証設定したがって、毎回パスワードを入力する必要はありません。
今、この特定のコマンドはあまり役に立ちません。ローカルで入力したhello
ように、ホスト端末にのみエコーが表示されますecho hello
。何が起こっているのかを確認するには、次のように話してください。
$ ssh vmName 'echo $HOSTNAME'
HOSTNAME
(コマンドを実行する前にローカルシェルが補間されるのを防ぐために単一引用符を使用することに注意してください。)
ssh
はい非常に強い。これにより、SSHトンネルを介してローカルプロセスからリモートコンピュータにデータを転送したり、リモートプログラムの出力をローカルコンピュータにリダイレクトするなど、さまざまなトリックを実行できます。
答え3
自宅のメインサーバーでArch Linux virtualboxサーバーを実行しています。ヘッドレス(グラフィックヘッダーなし)で始まり、ラップトップまたはメインサーバーからSSH経由でボックスに接続します。
nohup vboxheadless --startvm ArchLinux >/tmp/ArchLinux.headless.out 2>&1 &
ネットワークを自動的に起動して設定するように仮想マシンを設定しました。 VNCレシーバーを設定して接続することもできます。しかし、私はssh
仮想マシンにコマンドを送信する方が便利だと思います。