×

VMware虚拟机安装华三HCL模拟器并远程登录

hqy hqy 发表于2022-12-23 09:24:51 浏览519 评论0

抢沙发发表评论

VMware虚拟机安装华三HCL模拟器并远程登录

我选择写HCL是因为HCL中的网络设备的控制台要用命名管道访问,跨网络打开命名管道的方法比较复杂,所以单独拿出来写。

创建虚拟机&安装软件

按照正常步骤创建虚拟机,配置随意,我这里用4核8GB。把嵌套虚拟化打勾(必须),把图形加速打勾(可选)。

建完虚拟机后安装操作系统,我用Windows Server 2012 R2,装系统步骤省略。

装完操作系统后安装HCL,我安装的版本是HCL v3.0.1,安装包中已经包含了VirtualBox,安装HCL的过程中会自动弹出VirtualBox安装程序,直接无脑下一步即可。

虚拟机操作系统配置

系统属性→高级系统设置→计算机名→更改。修改计算机名、改成一个好记的名称。这个改完要重启。

给虚拟机操作系统当前账户设置一个密码,后面会用到,从网络访问命名管道需要一次认证。

开启网络发现文件共享

Windows Server 2012 R2默认禁用网络发现,需要把相关服务开起来(参考 blog.csdn.net/ygterry/a)。

运行services.msc打开服务,把下列3个服务启动类型设为自动启动

  • Function Discovery Resource Publication

  • SSDP Discovery

  • UPnP Device Host

在自己的电脑上ping虚拟机主机名(我设置的是hcl),看是否能通

确认网络连通性没问题之后就可以摆设备远程登录了。

远程登录网络设备控制台

虚拟机中打开HCL,随便摆一台网络设备,开机。

打开虚拟机中的VirtualBox,查看当前网络设备在VirtualBox中的名称。这个名称是有规律的,其中的数字代表第几个工程第几台设备。

通过网络打开命名管道时,完整的管道路径为\\主机名\pipe\管道名,知道路径后就可以连接了。注意连接时需要进行一次认证,也就是上面提到的“给虚拟机操作系统当前账户设置一个密码”(我设置的是hcl),用设置的用户名密码进行认证。

准备就绪后就可以通过网络打开命名管道。然而,我找了一圈后,我发现常见的终端软件都不支持打开网络命名管道,无奈只能自己写一个。在自己电脑上新建一个Python文件,复制下面代码粘贴到Python文件中保存。

命名管道终端.py

import timeimport sysimport msvcrtimport win32pipe	#pywin32import win32file	#pywin32import win32wnet	#pywin32import win32netcon	#pywin32class C网络命名管道:
	def __init__(self, a路径: str, a用户名: str, a密码: str):
		self.m路径 = a路径
		self.m用户名 = a用户名
		self.m密码 = a密码
		self.m管道 = None
	def __del__(self):
		self.f关闭()
	def f连接(self):
		v网络资源 = win32wnet.NETRESOURCE()
		v网络资源.dwScope =  0
		v网络资源.dwType = win32netcon.RESOURCETYPE_ANY
		v网络资源.dwDisplayType =  0
		v网络资源.dwUsage =  0
		v网络资源.lpLocalName = None
		v网络资源.lpRemoteName = "\\\\" + self.m路径.split("\\")[2] + "\\IPC$"	#\\主机名\IPC$
		v结果 = win32wnet.WNetAddConnection2(
			v网络资源,
			self.m密码,
			self.m用户名,
			win32netcon.CONNECT_TEMPORARY,
		)
		self.m管道 = win32file.CreateFile(
			self.m路径,
			win32file.GENERIC_READ | win32file.GENERIC_WRITE,
			0,
			None,
			win32file.OPEN_EXISTING,
			0,
			None
		)
		v结果 = win32pipe.SetNamedPipeHandleState(
			self.m管道,
			win32pipe.PIPE_READMODE_BYTE | win32pipe.PIPE_NOWAIT,
			None,
			None
		)
		if v结果 == 0:
			raise RuntimeError()
	def f关闭(self):
		if self.m管道:
			win32file.CloseHandle(self.m管道)
			self.m管道 = None
	def f读(self):
		v数据 = b""
		while True:
			try:
				v结果, v读 = win32file.ReadFile(self.m管道, 65536)
				v数据 += v读
			except:	#没有数据时会抛异常,无视
				break
		return v数据
	def f写(self, a数据: str):
		win32file.WriteFile(self.m管道, a数据)class C终端:
	def __init__(self, a连接):
		self.m连接 = a连接
		self.m连接.f连接()
		self.m编码 = "utf-8"
	def __del__(self):
		self.m连接.f关闭()
	def f运行(self):
		while True:
			#输入
			if msvcrt.kbhit():
				v输入 = msvcrt.getch()
				self.m连接.f写(v输入)
			#输出
			v输出 = self.m连接.f读().decode(self.m编码)
			print(v输出, end = "")
			time.sleep(0)def main():
	v管道路径 = sys.argv[1]
	v用户名 = sys.argv[2] if len(sys.argv) >= 3 else ""
	v密码 =  sys.argv[3] if len(sys.argv) >= 4 else ""
	v连接 = C网络命名管道(v管道路径, v用户名, v密码)
	v终端 = C终端(v连接)
	v终端.f运行()if __name__ == "__main__":
	main()

使用方法很简单,在命令行运行这个py文件,后面加上3个参数:命名管道路径、远端操作系统用户名、远端操作系统密码。完整命令像这样:

python 命名管道终端.py \\hcl\pipe\topo1-device1 hcl hcl

运行前需要安装pywin32模块。最后运行效果如下。

image.pngimage.png


有一点需要注意,Python命令行程序在接收输入时如果按了Ctrl+C会抛出KeyboardInterrupt异常,上面的代码中没有对Ctrl+C做任何处理,所以按Ctrl+C的效果就是直接抛异常结束程序。而华三设备在没有配置的情况下开机会进入自动配置,会提示你按Ctrl+C或Ctrl+D中断,这时按Ctrl+D就行了。

还有另外一种方法可以可以访问远端的命名管道,通过一个叫“Named Pipe TCP Proxy”的软件把本地命名管道映射成TCP一个端口,然后用Telnet连接。具体过程就不阐述了。


打赏

本文链接:https://www.kinber.cn/post/3367.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客