运行环境:
物理机:win10 1903
网络设备:EVE-NG模拟器上运行思科三层路由器
网络设备OS版本:cisco ios(versions 15.6)
python环境:pycharm 3.3
python解析器版本:3.7
实验目的:给R4的lo1口配置地址:2.2.2.2/24
实验括扑:
- 因为我的环境较为特殊,Telnetlib要接入的是eve中的虚拟接口,而且eve中的端口都是默认打开的,并且不需要输入账号与密码,也就是说,只要是通过web页面点击设备进行访问,全部都是免Telnet、ssh就能够进入到管理界面(实际上通过web管理下,eve是通过telnet向设备发送命令)。那这样的话就没有办法去模拟真机环境下的Telnet和SSH,所以我就又想了个办法,那我用python先登录到R3,然后在R3上去登录其他路由器(比如R4),这样不也可以吗?下面我将这样来演示,先登录到R3,再从R3上去Telnet R4。退出也是通过捕捉关键字来实现退出。
- 因为做这个实验时间本人环境等问题还没有解决,后面想到了更好的方法将在后面展示,本篇文章将对所存在问题进行详细描述;本人写作能力有限,而且还是新手、文章可能难以理解,望各位见谅。
- 下面的每台三层交换机都默认配置了Telnet和SSH,Telnet用户名是python,密码是123,SSH用户名是ccie,密码是cisco
以下代码参考《网络工程师的python之路》这本书:
import telnetlib #导入Telnetlib模块
host = "192.168.142.128"
user = "python" #定义四个变量,分别是地址、用户名、密码、和退出字符串
password = "123"
enter = "enter"
exit_telnet = "exit"
tn = telnetlib.Telnet(host,32771) #赋值tn,尝试以Telnet登录到192.168.142.128,32771。
tn.write(b"\r\n") #输入换行符,等于输入enter键。进入用户模式
tn.write(b"en\n") #进入R3的特权模式
tn.read_until(b"Password: ") #用read_until检测关键字:Password
tn.write(password.encode('ascii') + b"\n") #当符合关键字条件之后,输入用户名,并用\n换行
tn.write(b"telnet 192.168.2.12\n") #利用python将Telnet到R4的命令发送给R3
tn.read_until(b"Username: ") #登录到R4后,会提示Username,跟前面一样,读取关键字
tn.write(user.encode('ascii') + b"\n")
tn.read_until(b"Password: ") #登录到R4后,读取关键字,并输入密码
tn.write(password.encode('ascii') + b"\n")
# ----------------------------------------下面的配置都是网工烂熟于心的配置了,这里就不再介绍---------
tn.write(b"en\n")
tn.write(b"123\n")
tn.write(b"conf t\n")
tn.write(b"int lo1\n")
tn.write(b"ip add 2.2.2.2 255.255.255.0\n")
tn.write(b"do sh ip int br\n")
tn.write(b"end\n")
tn.write(b"exit\n")
tn.read_until(b"[Connection to") #检测是否退出了R4的Telnet,这里只需检测是否为[Connection开头即可。
tn.write(exit_telnet.encode('ascii') + b"\n") #当检测到已经退出R4的Telnet,说明已经退回到R3的特权模式。这里再次输入exit退出。
tn.close()
print(tn.read_all().decode('ascii')) #用read_all方法将登录SW1后执行命令的所有过程都记录下来,并通过print打印出来
#我觉得最有可能的是,要进行打印的字符串pycharm无法识别,导致只显示一个1.
最终效果: