我已经使用 Virtualbox 一段时间了,但我学会与其交互的唯一方法是通过图形界面。
有没有办法通过命令行向虚拟机发送 bash 命令,以便我可以从主机编写与来宾交互的脚本?
例如
$ sendMessage vmName "echo hello"
我愿意尝试新的虚拟化软件。
我目前使用的是 Mac,我想以这种方式运行 Linux 客户机。
编辑:
我想运行可能的恶意代码以查看其行为。理想情况下,我想禁用访客上的网络,以便我可以确保访客完全隔离。
我希望客人和主人可以纯粹通过标准输入/标准输出进行通信。
答案1
使用共享文件系统
您可以使用 VirtualBox 支持在来宾中公开主机目录。将要测试的代码直接放入共享目录中,启动虚拟机,然后使用控制台导航到共享目录并运行代码。您不需要任何网络,对主机的暴露仅在一个共享目录中,并且您可以使用快照来恢复对来宾文件系统的任何更改。
使用虚拟串口
您可以配置访客串行端口,以便您可以从主机与访客交互,而无需配置任何网络。
在 VirtualBox 中,转到“设置”->“端口”,启用第一个串行端口,并将端口模式设置为“主机管道”(并确保选中“创建管道”)。在相应字段中输入路径(例如/tmp/hostserial
)。该路径是将在您的主机上公开的 Unix 套接字。
启动您的客人。现在你的工作是让客人内部与串行端口交谈。尝试这个:
agetty -l /bin/bash -n ttyS0 115200 vt100
ttyS0
这将在第一个串行端口上启动 bash shell 。在您的 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 条目。
您还会想要设置基于密钥的 SSH 身份验证因此您无需每次都输入密码。
现在,该特定命令不会做太多有用的事情。您只会看到hello
主机终端的回显,就像您echo hello
在本地输入一样。要查看发生了什么,请改为这样说:
$ ssh vmName 'echo $HOSTNAME'
(请注意使用单引号以防止本地 shellHOSTNAME
在运行命令之前进行插值。)
ssh
是非常强大的。您可以通过这种方式实现各种技巧,例如通过 SSH 隧道将数据从本地进程传输到远程计算机,以及将远程程序的输出重定向到本地计算机。
答案3
我家里的主服务器上运行着一个 Arch Linux virtualbox 服务器。我以无头方式启动它(没有图形头),然后从我的笔记本电脑或主服务器 ssh 进入盒子。
nohup vboxheadless --startvm ArchLinux >/tmp/ArchLinux.headless.out 2>&1 &
我已将虚拟机设置为启动并自动设置网络。您还可以设置 VNC 侦听器以使用它进行连接。但我发现ssh
向虚拟机发送命令更方便。