Telnet命令:老设备和不支持SSH时的备选
有些老旧的网络设备虚拟机,或者临时调试环境,没装SSH只有Telnet,cmd里telnet默认是关闭的,需要你先去控制面板的“启用或关闭Windows功能”里勾选Telnet客户端。
启用后,连接方式很简单:
telnet 虚拟机IP 端口
比如连一台IP为192.168.1.50、端口23的虚拟机:
telnet 192.168.1.50 23
Telnet和SSH最大的区别是数据传输不加密,登录密码以明文方式发送,在公网环境下千万不要用,只有在隔离的内网或者实验室环境才考虑。
mstsc命令:远程桌面连接Windows虚拟机
如果你要操作的是Windows虚拟机,图形界面操作更顺手,cmd里输入mstsc回车就能打开远程桌面连接窗口,但更高效的方法是在命令里直接带上IP:
mstsc /v:192.168.1.200
这条命令会立刻弹出远程桌面窗口,并尝试连接192.168.1.200这台虚拟机,如果要指定分辨率、全屏等参数,还可以用:
mstsc /v:192.168.1.200 /w:1440 /h:900
/w和/h分别指定窗口宽度和高度,实际体验中,mstsc比SSH更适合不懂命令行的新手,而且Windows虚拟机自带远程桌面服务,基本开箱即用。
cmd管理本地虚拟机的命令:VMware和Hyper-V的命令行工具
VMware Workstation的vmrun命令
VMware用户经常遇到一个问题:虚拟机启动太慢,能不能用cmd直接控制?其实VMware自带了一个命令行工具vmrun,但默认不加入环境变量,你需要先找到它的路径,在多数版本里,vmrun位于:
C:Program Files (x86)VMwareVMware Workstationvmrun.exe
使用方法如下,启动虚拟机:
"C:Program Files (x86)VMwareVMware Workstationvmrun.exe" start "D:虚拟机Ubuntu.vmx"
关闭虚拟机(客户机内系统正常关机):
vmrun stop "D:虚拟机Ubuntu.vmx" soft
强制断电:
vmrun stop "D:虚拟机Ubuntu.vmx" hard
挂起虚拟机:
vmrun suspend "D:虚拟机Ubuntu.vmx"
如果你觉得每次输全路径太麻烦,可以在系统环境变量里将vmrun所在的目录加入Path,之后就能直接使用vmrun命令了,这个思路和Windows下配置Java环境变量是一样的原理。
Hyper-V的PowerShell命令
Windows自带的Hyper-V虚拟化平台,用cmd能管一部分,但很多操作其实要依赖PowerShell,不过你可以直接在cmd里启动powershell执行命令,比如查看虚拟机列表:
powershell -Command "Get-VM"
启动指定虚拟机:
powershell -Command "Start-VM -Name 'UbuntuServer'"
关闭虚拟机:
powershell -Command "Stop-VM -Name 'UbuntuServer'"
创建检查点(快照):
powershell -Command "Checkpoint-VM -Name 'UbuntuServer' -SnapshotName 'BeforeUpdate'"
这里有个实际场景:你在公司用Hyper-V跑着一台内部测试机,每天下班前想自动创建快照,用cmd的计划任务调用上述PowerShell命令,就能实现无人值守备份,比起在Hyper-V管理器里手动点鼠标,效率提升非常明显。
VirtualBox的VBoxManage命令
用VirtualBox的用户也别急,它的命令是VBoxManage,同样需要先找到安装目录,典型路径为:
C:Program FilesOracleVirtualBoxVBoxManage.exe
启动名为“CentOS8”的虚拟机:
VBoxManage startvm "CentOS8"
注意这个命令在VirtualBox 6.1以后,默认是以分离模式启动,后台运行不占用cmd窗口,关闭虚拟机:
VBoxManage controlvm "CentOS8" acpipowerbutton
强制关机:
VBoxManage controlvm "CentOS8" poweroff
查看所有虚拟机状态:
VBoxManage list runningvms
cmd虚拟机网络诊断指令:ping、tracert、nslookup怎么配合使用
虚拟机网络不通,是新手最头疼的问题,在cmd里,有一套固定的排查流程,我把它拆解开讲。
ping命令:先确认虚拟机是否能响应
ping 192.168.1.100
如果通了,会返回类似“来自192.168.1.100的回复: 字节=32 时间=1ms TTL=64”的信息,如果超时,先检查虚拟机网卡是不是处于桥接或NAT模式,然后再看防火墙是否拦截了ICMP请求,很多Linux虚拟机默认禁ping,这时你可以临时关闭防火墙测试:
iptables -F
或者Windows虚拟机里执行:
netsh advfirewall set allprofiles state off
但要记住,这只是测试手段,测完记得开回防火墙。
tracert命令:定位哪一跳断了
ping通了但访问慢,或者ping不通但虚拟机确实活着,用tracert追踪路径:
tracert 192.168.1.100
输出会显示从你本地到虚拟机经过的每一个路由器IP和延迟,如果某一跳出现“请求超时”,而下一跳又能通,那通常是中间路由器屏蔽了探测包,不一定是故障,如果一路到最后一跳都超时,大概率是虚拟机防火墙或网卡问题。
nslookup命令:排查域名解析故障
虚拟机里访问外网域名失败,先看DNS解析正不正常,在cmd里输入:
nslookup www.baidu.com
正常会返回域名对应的IP,如果提示“找不到主机”,换一个公共DNS测试:
nslookup www.baidu.com 223.5.5.5
这个命令能帮你快速区分是DNS问题还是网络连通问题,实际运维中,相当一部分“虚拟机无法上网”的案例,最后发现都是虚拟机内DNS被配置成了无效地址,而不是物理网络故障。
cmd批量操作虚拟机的进阶技巧:for循环和批处理
当你需要同时操作多台虚拟机时,一条一条敲命令太累,cmd支持for循环,结合ssh或者Hyper-V命令,能实现批量操作,比如批量ping多台虚拟机:
for /L %i in (1,1,10) do ping 192.168.1.%i -n 1 >> result.txt
这条命令会依次ping 192.168.1.1到192.168.1.10,并把结果写入result.txt文件,注意,在cmd窗口里直接输入用单百分号%,如果你把这段代码写入.bat批处理文件,需要改成双百分号%%。
再举个例子,批量启动Hyper-V虚拟机,先创建一个虚拟机列表文件vms.txt,每行一个虚拟机名称,然后写一个批处理脚本:
@echo off
for /f %%i in (vms.txt) do (
powershell -Command "Start-VM -Name '%%i'"
)
执行后,cmd会逐行读取vms.txt,依次启动列出的虚拟机,这个脚本在实验室管理多台测试机时非常实用,配合计划任务还能实现定时批量开机。
用命令导出虚拟机列表保存到文件
管理多台虚拟机时,先把所有虚拟机名称和状态导出来,方便存档,Hyper-V环境下:
powershell -Command "Get-VM | Export-Csv -Path D:vminfo.csv"
VirtualBox环境下:
VBoxManage list vms > D:vms.txt
VMware环境下:
vmrun list > D:vmware_running.txt
这样生成的文件可以直接用Excel打开,或者配合批处理做后续操作。
cmd连接虚拟机时常见的五个坑及解决办法
连接超时,但虚拟机明明开机了
先确认虚拟机IP地址,在虚拟机内部执行ip addr(Linux)或ipconfig(Windows),查看实际IP,NAT模式下虚拟机的IP和主机不在同一网段是正常的,但host-only模式下如果IP配错,就会连接超时,解决办法是改用桥接模式,让虚拟机直接获取局域网IP。
SSH提示Permission denied
密码明明输入对了,却提示认证失败,多数情况是root用户默认禁止SSH登录,编辑虚拟机的/etc/ssh/sshd_config文件,找到PermitRootLogin,把值改成yes,然后重启SSH服务:
systemctl restart sshd
telnet命令不是内部或外部命令
前面提到了,Windows默认没装Telnet客户端,去控制面板程序启用或关闭Windows功能,勾选Telnet客户端,点确定后等待安装完成,重新打开cmd即可。
cmd无法运行vmrun
提示“vmrun不是内部或外部命令”,是因为没配环境变量,按Win+R输入sysdm.cpl打开系统属性,点击环境变量,在Path中添加VMware安装目录,保存后重新打开cmd。
mstsc连不上但网络通
虚拟机内Windows远程桌面服务没开启,右键此电脑属性远程桌面,选择“允许远程连接到此计算机”,同时确保防火墙允许远程桌面端口3389通过。
常用命令速查表
| 场景 | 命令 | 示例 |
|---|---|---|
| SSH连接 | ssh 用户@IP | ssh root@192.168.1.100 |
| Telnet连接 | telnet IP 端口 | telnet 192.168.1.50 23 |
| 远程桌面 | mstsc /v:IP | mstsc /v:192.168.1.200 |
| 启动VMware虚拟机 | vmrun start 路径 | vmrun start D:Ubuntu.vmx |
| 查看Hyper-V虚拟机 | powershell Get-VM | powershell -Command “Get-VM” |
| 启动VirtualBox虚拟机 | VBoxManage startvm 名称 | VBoxManage startvm “CentOS8” |
| 测试连通性 | ping IP | ping 192.168.1.100 |
| 追踪路由 | tracert IP | tracert 192.168.1.100 |
| 解析域名 | nslookup 域名 | nslookup www.baidu.com |
| 批量ping | for /L %i in (1,1,10) do ping | for /L %i in (1,1,10) do ping 192.168.1.%i |
cmd虚拟机指令的适用场景与选择建议
我建议你根据实际需求选命令,如果只是临时连一下虚拟机敲两条命令,直接用ssh或telnet最省事;如果要给虚拟机做快照、调整硬件配置,用VMware的vmrun或Hyper-V的PowerShell更专业;如果你手头有多台虚拟机想一次性同时启动,批处理循环是效率最高的方案。
记住一个核心思路:cmd本身只是个外壳,真正干活的是虚拟机平台提供的命令行工具,以及SSH、远程桌面这类连接协议,把上面的命令练熟,你的Windows电脑就能像控制台一样调度所有虚拟机。
常见问题解答
怎么知道虚拟机当前有没有开机?
用对应的平台命令查询,VMware执行vmrun list会列出所有正在运行的虚拟机;Hyper-V执行powershell -Command "Get-VM | Where-Object {$_.State -eq 'Running'}";VirtualBox执行VBoxManage list runningvms,如果一条命令都记不住,最简单的办法是ping一下虚拟机IP,能通说明至少网络层面是活的。
cmd和PowerShell操作虚拟机有什么区别?
cmd偏传统批处理,适合直接调用外部工具如vmrun、VBoxManage以及ssh指令,脚本简单直观,PowerShell能直接调用Hyper-V管理模块,返回对象化数据,便于筛选、排序、导出,实际使用中,如果你的虚拟化平台是Hyper-V,建议直接用PowerShell;如果是VMware或VirtualBox,两者的差别不大,看个人习惯。
有没有不需要安装任何客户端就能连接虚拟机的方法?
有,win10和win11自带的OpenSSH客户端就能直接连虚拟机,前提是虚拟机里装好了SSH服务端,这个服务大多数Linux发行版默认已安装,Windows虚拟机也可以安装OpenSSH Server,然后你在cmd里执行ssh 用户名@虚拟机IP,体验和Linux完全一致,如果虚拟机是图形界面的Windows系统,mstsc远程桌面也是系统自带的,无需额外安装软件。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/615830.html





