VMware虚拟机安装华三HCL模拟器并远程登录
我选择写HCL是因为HCL中的网络设备的控制台要用命名管道访问,跨网络打开命名管道的方法比较复杂,所以单独拿出来写。
创建虚拟机&安装软件
按照正常步骤创建虚拟机,配置随意,我这里用4核8GB。把嵌套虚拟化打勾(必须),把图形加速打勾(可选)。
建完虚拟机后安装操作系统,我用Windows Server 2012 R2,装系统步骤省略。
装完操作系统后安装HCL,我安装的版本是HCL v3.0.1,安装包中已经包含了VirtualBox,安装HCL的过程中会自动弹出VirtualBox安装程序,直接无脑下一步即可。
虚拟机操作系统配置
系统属性→高级系统设置→计算机名→更改。修改计算机名、改成一个好记的名称。这个改完要重启。
给虚拟机操作系统当前账户设置一个密码,后面会用到,从网络访问命名管道需要一次认证。
开启网络发现和文件共享。
Windows Server 2012 R2默认禁用网络发现,需要把相关服务开起来(参考 https://blog.csdn.net/ygterry/article/details/112858937)。
运行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模块。最后运行效果如下。
有一点需要注意,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 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝: