0.
实现要求:
通过2个简单的脚本,检测任意网段中ssh可达的设备并链接。
同时对所有设备写入任意华为命令脚本。并记录设备回显的所有内容(如1000台设备 'dis cu'显示结果)
![](https://img-blog.csdnimg.cn/4e2e74cbc0a54a2dbe8174991497e1cb.png)
![](https://img-blog.csdnimg.cn/1e3f50f2e1134d4a96d36420f2d6a210.png)
![](https://img-blog.csdnimg.cn/6a9141f298414808a8b16f9a20d1535c.png)
1.
实验准备
![](https://img-blog.csdnimg.cn/d232cf35f45b4493b4dcb7121d6463bb.png)
此处主要是华为的设备,模拟器使用ensp,4台路由器配置同网段地址来模拟ssh环境,配置好接口地址,
![](https://img-blog.csdnimg.cn/e0c9771571144e598807f472e86068f9.png)
确保能ping通真机环境,这是第一步的关键。
![](https://img-blog.csdnimg.cn/778381f209e946dba82a6472f9595ccc.png)
接来下来配置ensp 的ssh,开启ssh功能,配置user账号名称huawe密码123,其中AR4的密码配置为456,可以参考如下脚本
注意修改名称,修改ip地址,AR4的local-user 密码 ,其他相同
![](https://img-blog.csdnimg.cn/3360b8d7ab2d40af9e08db0748a67db2.png)
sys
sys R1
int g 0/0/0
ip add 169.254.18.1 24
q
stelnet server enable
user-interface vty 0 4
protocol inbound all
authentication-mode aaa
aaa
local-user huawei password cipher 123
local-user huawei privilege level 3
local-user huawei service-type ssh
ssh user huawei authentication-type all
尝试ssh到ensp路由器的AR1
![](https://img-blog.csdnimg.cn/3ba327c896794147bdbe7219597a9187.png)
![](https://img-blog.csdnimg.cn/3bace512e5a64dd1a52fb168e1004862.png)
![](https://img-blog.csdnimg.cn/4844e9f9df2e49aa9bad3ad590e5fe7e.png)
可以看到是ssh链接到了AR1上,实验的准备环节到此结束。
2.
选择网段进行ip地址扫描,确定可达的设备ip地址,并记录在文件夹中。
此步骤的原因是:如果现网环境中,你管理着几百上千台设备时,你并不清楚哪些设备是可达的,用一个简单的py脚本ping测试一下,
这里使用的是最新版的python和pycharm,都是可以在官网免费下载的,这里就不做赘述。
![](https://img-blog.csdnimg.cn/4c31a17eca394f04ab84d90fbc306d52.png)
确保cmd中可以进入py,
![](https://img-blog.csdnimg.cn/b24461abf85b44bb9ded69aef3aade72.png)
这里用到的需要导入的模块都可以在pycharm中下载。
![](https://img-blog.csdnimg.cn/3ed7461b1c3348769bd3c69efbb6cde4.png)
简单解释一下这个代码的逻辑。
导入的是2个模块 一个是pythonping,可以简单的理解为ping的一个模块,另外一个是os,可以和操作系统进行互动。
因为后面会把可以ping通的ip地址记录在一个txt文本中,我命名为reachable_ip.txt ,做了一个简单的if语句,
如果文件夹中存在这个txt的话就删除,这样可以保证这个文件是最新的。
ip地址分为4段,这里用嵌套for循环来遍历多个网段中的所有设备,
因为我这里用的是回环网卡桥接,所以地址是169.254开头,你们按照自己的地址进行更改,
图里的会扫描的地址段为,169.254.18中的1-15,如果需要扫描多个网段就修改ip_3的数值,把ip_4修改成(1,255)
![](https://img-blog.csdnimg.cn/ea550a03116146d88ba58510baceecd8.png)
可以看见现在script中是没有reachable_ip.txt这个文件的,来运行一下py1看看结果。
![](https://img-blog.csdnimg.cn/b22f6b6e14594c39a9ca75b135db24ff.png)
![](https://img-blog.csdnimg.cn/ebff0237509c4327bdfad3fec6d74061.png)
![](https://img-blog.csdnimg.cn/71e036b4f6f041ea8362432fd339d529.png)
![](https://img-blog.csdnimg.cn/dc29612ae7e04742a811765b306aed82.png)
没有问题,多了可达ip的txt文件,里面的4个ip地址对应的4台ensp中的路由器。
这里特别说明一点
![](https://img-blog.csdnimg.cn/4e5c7fe6969e4226862caf63004d6906.png)
这里导入的pythonping默认超时时间为2秒,尝试等待次数为4次,这样导致ping一个不通的地址需要8秒,
如果网段很多的话就会很慢,可以按住ctrl,把超时时间timeout=0.1秒,等待次数count=2。偶尔检测不出来的话超时时间设置大一些。
![](https://img-blog.csdnimg.cn/192723370ea047f7932e1fd9868bd316.png)
3,
利用paramiko链接到设备,执行command.txt中的华为设备命令,并生成一个txt来记录设备回显的所有内容,同时加入try except来跳过有问题的设备
在之前AR4中我们把密码设置成了456,现网环境中也会存在这个问题,设备数量过多的情况下会存在某些设备ssh配置不通或者密码错误的情况,
这时候如果不跳过的话就会中断脚本进程。
![](https://img-blog.csdnimg.cn/39af8d1246c049d9b8fdad6bfafa5fb0.png)
简单说明一下 time和datatime是用来生成回显文件的时候记录时间,socket是ssh出错时except的判断依据,
getpass可以引导输入密码时不显示明文。
![](https://img-blog.csdnimg.cn/55a00819b0424338ba7bb2c453cbf021.png)
这里建立2个空列表,分别用来记录ip出问题的设备,和ssh密码不正确的设备,因为py1脚本中测试了ip可达性,所以等等我会在txt中加入一条不可达的ip地址。
![](https://img-blog.csdnimg.cn/30aa0f35f9fa49b193ba7cc22ffbc901.png)
这一段是paramiko链接的代码,橘色的hostname是py1脚本reachable_ip.txt中的ip地址,在for循环下 txt中有几个ip地址就会链接几次。
username是上面input函数引导用户输入的账号,这里我们是huawei,password是上面getpass引导输入的密码,这里是123。
登录成功后打印出 "成功登录" 加上ip 来显示进度。
![](https://img-blog.csdnimg.cn/2e24d74d818f4f40a7852160b017c785.png)
注意这里是用了sys.argv[1]来代替华为命令的txt文本名称,也就是文件夹中的command.txt , 需要在cmd运行脚本后跟上这个文本名称,这样做的目的是提升可扩展性。
如果你想运行别的命令脚本,就可以这么写:py 2.py ospf.txt , 当然我们这里是py 2.py command.txt。 这个txt的位置就等于sys.argv[1]
sleeep(3) 的作用是让其写入华为命令时等待3秒让交换机路由器有个反应时间,不会遗漏命令。
这里写入设备回显内容时open(),用的是w覆写,所以同天运行的脚本生成的txt都是最新的,日期不同时会生成新日期的txt文件。
注意输出内容时改成'ascii',不然显示内容很乱看不清。
继续
![](https://img-blog.csdnimg.cn/11b96144d0574919be6150b9644dae06.png)
这里一定要注意层级,python的代码缩进很严格,不同的位置也代表着代码作用域不同,
except一定是和try个层级的,并一定属于ip地址for循环下,
这里遇到2种无法连接的情况下选择跳过,并打印出来,加入到上面创建的2个err空列表中。
最后在for循环结束后统一显示。
![](https://img-blog.csdnimg.cn/f779309931f9415c8499c7adc6ab71dd.png)
这是command.txt的配置内容。可以自行修改成想要的,比如统一修改所有或者某个网段所有设备的ip地址,vlan,ospf等等等等,总之是任何你需要的命令没有限制。
这里要注意。dis cu往往有大量的内容,正常情况下一次只显示24条内容。需要不停的去空格来显示,
![](https://img-blog.csdnimg.cn/43fcd2385fff44cfbec6a58b7cc8fbfd.png)
进入到user-interface vty 0中 这个0是值第一个ssh登录设备的用户,也可能不是0 看具体情况,用 dis user-interface vty 0 来验证,
如果当前有用户登录的话前面有个'+'号,
![](https://img-blog.csdnimg.cn/33b3362eaeb34d779907d678aa56da72.png)
screen-length 0 temporary 简单理解为一次性显示所有内容不需要再按空格,不然回显内容是不完整的,python无法写入到txt中。
4,
验证,让我们来运行一下py2看看结果。
这里我在reachable_ip.txt中再加入一条不可达的地址1.1.1.1 来测试一下py2脚本代码鲁棒性。
![](https://img-blog.csdnimg.cn/dfc20512ae024126a90a041bff356c56.png)
这里注意一定要跟上命令脚本名称,不然代码是无法运行的。
![](https://img-blog.csdnimg.cn/166672940faa40b98000818a726e5105.png)
输入账号huawei,密码123
![](https://img-blog.csdnimg.cn/2b266425a4a9494c99c62a595c931e03.png)
![](https://img-blog.csdnimg.cn/f142be585f17415e95ab7e7775eb06b5.png)
![](https://img-blog.csdnimg.cn/2cf5323b56154ec3a5d16bb993ed51db.png)
![](https://img-blog.csdnimg.cn/69d634ed18d44b03b8f4596c9770a7aa.png)
可以看到记录出了1.1.1.1 不可达的信息,同时提示了AR4的密码不正确,因为我们配置的密码是456
文件夹中多个3个txt带有ip地址和日期,文件内容为dis cu的回显内容。
5.
总结,至此为止实验全部结束,其中用设计的python代码思路都很基础,我认为如果是网工方向的话足以,并不需要学到十分高明的开发方法,也不需要考虑到性能等等,
后续也可以用多线程来提高运行速度,这都是后话,有兴趣大家可以自行研究。当然还有linux系统的shell脚本也可以实现类似效果但是没有python好用,毕竟这么多模块在这呢。其中遇到的所有问题都可以百度解决(亲测)。
最后一图附上py2代码,提供参考。
![](https://img-blog.csdnimg.cn/0a0dbbe0bd244905ba51cfdc98a30dcb.png)
![](https://img-blog.csdnimg.cn/2ce9d8211e2647379aa07a6a08a4abe4.png)
![](https://img-blog.csdnimg.cn/71f76a7f087d4506b07ad2e80ea0b6f4.png)