如何使用 VBoxManage guestcontrol 传递 shell 参数?

Goo*_*bot 2 command-line bash virtualbox scripts guest-additions

我在来宾机(均为 Ubuntu)上从主机运行命令:

VBoxManage guestcontrol Ubuntu1 run --exe "script.sh" --username xx --password xx --wait-stdout
Run Code Online (Sandbox Code Playgroud)

来宾计算机上的 shell 脚本如下

#!/bin/bash
echo $1
Run Code Online (Sandbox Code Playgroud)

执行shell脚本时如何传递参数1?

我认为它应该作为

run --exe "script.sh arg1"
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。

Tak*_*kat 6

SSH

我们可以通过从主机到该计算机的 SSH 会话在虚拟来宾上运行应用程序。但是,这需要启用网络,并且安装openssh-server并在来宾计算机上运行。

VBox管理访客控制

作为替代方案,我们可以使用 Virtual Box 的内置功能在正在运行的来宾 VM 上执行程序。这可以通过 来完成VBoxManage guestcontrol

下面的示例行将仅ls在虚拟机的根目录上运行:

VBoxManage --nologo guestcontrol "<vm_name>" run --exe "/bin/ls" --username <guestuser> --password <password> --wait-stdout
Run Code Online (Sandbox Code Playgroud)

在来宾上运行图形应用程序需要我们使用选项为来宾定义 DISPLAY 环境变量--putenv。下一个示例将在来宾上运行并打开 gedit:

VBoxManage --nologo guestcontrol "<vm_name" run --exe "/usr/bin/gedit" --username <guestuser> --password <password> --putenv "DISPLAY=:0" --wait-stdout
Run Code Online (Sandbox Code Playgroud)

我们还可以传递选项来打开程序。vmtest下一个示例将在来宾 gedit 中打开一个文件:

VBoxManage --nologo guestcontrol "vm_name" run --exe "/usr/bin/gedit" --username <guestuser> --password <password> --putenv "DISPLAY=:0" --wait-stdout -- gedit/arg0 vmtest
Run Code Online (Sandbox Code Playgroud)

选项和参数与命令分开,--如下面来自主机的脚本示例所示。


主机脚本示例

下面的脚本将在主机上运行时播放在来宾计算机中example.ogg使用的文件。paplay将变量替换为适当的值。

#!/bin/bash

VM_NAME=myvm
VM_USER=takkat
VM_PASSWD=topsecret
VM_EXEC=paplay
VM_EXEC_PATH=/usr/bin/paplay
VM_ARGS=/home/takkat/Music/example.ogg

VBoxManage --nologo guestcontrol $VM_NAME run --exe $VM_EXEC_PATH \
--username $VM_USER --password $VM_PASSWD --wait-stdout \
-- {$VM_EXEC}/arg0 $VM_ARGS
Run Code Online (Sandbox Code Playgroud)