命令行友好的虚拟机

命令行友好的虚拟机

我已经使用 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向虚拟机发送命令更方便。

相关内容