背景:今天老师给了个小任务,对他之前探测到的活跃的路由器结点进行SNMP弱口令检测,给定的txt文本里大概有1000多个孤立的IP结点,solorwinds工具链中的IP Network Browser只能实现对三种IP地址模型的输入:1、单独IP; 2、子网段;3、IP地址段。根本没考虑到我这种大数据量的查询。所以不知不觉想到了对snmp协议进行探测windows命令行工具——snmputil.exe(随便可以下到,简单使用说明
http://blog.sina.com.cn/s/blog_701300bc0101976d.html),考虑到它是命令行工具,我之前有些过很多linux shell脚本,不妨使用windows批处理命令解决下。
脚本及实现步骤:
-
@echo off
-
setlocal enableDelayedExpansion
-
-
for /f %%i in (%1%) do (
-
for /f "delims=" %%t in ('snmputil get %%i public .1.3.6.1.2.1.1.5.0') do set var=%%t
-
-
if "!var!" == "error on SnmpMgrRequest 40" (
-
echo "%%i : 失败[var=!var!]" >>"失败%1%"
-
) else (
-
echo "%%i : 正确[var=!var!]" >>"正确%1%"
-
)
-
)
-
echo THE END
-
pause>nul
-
就是通过一个for循环,反复从命令行的第一个参数(按行存放IP的txt文本)中取值,然后,调用snmputil.exe进行查询,然后,跟据查询所得的结果判断,弱口令测试是否成功:如果成功,将输出存入指定文本文件;如果失败,将输出存入另一个文本文件。
实现过程遇到的问题:
1、延迟变量扩展:第二行的 setlocal 就是开启延迟变量扩展机制,windows批处理命令和Linux shell脚本有着显著的不同,windows中将if或for或其他任何地方出现的(...)之间的内容看做一条完整的语句,我们举一个例子:
-
@echo off
-
set var=aaa
-
if "%var%" == "aaa" (
-
set var=bbb
-
echo %var%
-
if "%var%" == "bbb" (
-
echo 修改成功
-
) else (
-
echo 修改失败
-
)
-
)
-
echo THE END !!!
-
pause>nul
返回结果:
也就是说第一个if中的赋值操作并不是在第二个if语句之前进行操作的,而是他们作为同一个完整的语句运行的,因此结果并不是想象的修改成功。因此应该使用变量延迟扩展机制。事先要加入机制开启环境设定,然后,将需要扩展的变量%var%改为!var!,就可得到相应的结果。
-
@echo off
-
setlocal enableDelayedExpansion
-
-
set var=aaa
-
if "!var!" == "aaa" (
-
set var=bbb
-
echo !
-
if "!var!" == "bbb" (
-
echo 成功
-
) else (
-
echo 失败
-
)
-
)
-
-
echo THE END !!!
-
pause>nul
2、shell脚本中的for循环,引用的变量都要多加%,比如,第一个参数 1% ,相应的应该表示为%1%;变量%i相应变为%%i。
3、变量使用一定要注意,比如,set num=1,后面无意多加了一个空格,看脚本根本看不出来,判断硬是判断错误,所以最好以这种方式进行赋值
set num="1",以免查不出错误纠结死;
4、windows批处理文件的编写相比linux shell脚本编写要麻烦的多,限制条件也多,就拿上述的1,2来说,在Linux中是完全不需要考虑的。所以说微软是做图形化系统的,在命令行方面远远不及Linux。图形化界面加上软件闭源,导致windows的扩展性和灵活性远远不及linux系统
阅读(2286) | 评论(0) | 转发(0) |