Simple Network Management Language
简单网络管理语言

About | Download | Document | Support | Q&A | Related Info/SW |

简 介



  简单网络管理语言(Simple Network Management Language)是一种类自然语言的脚本语言,它采用snmp、telnet、ping、dns、arp、ssh、tcp、udp、web等协议访问网络设备,内置smtp协议用于告警等邮件的发送,支持excel、mysql、sqlite等3种方式进行网管数据的存取。
  最新版本: snml8.13(ladybird20200205) utf8&ipv6
  项目托管地址:https://github.com/ladybirdSnml/snmlipv6utf8snmptelnetsshweb
  打包下载:https://ladybirdsnml.github.io/snmlipv6utf8snmptelnetsshweb/snml_utf8ipv6.zip
  本手册编辑日期:20200205
  技术支持邮箱1:ladybird_snml@protonmail.com
  技术支持邮箱2:ladybird_snml@hotmail.com
  简单网络管理语言(snml)支持CLI(命令行接口)和SNMP(简单网络管理协议)两种方式自动化的进行网络设备配置和管理。CLI 是基于telnet、ssh的人机交互界面,用于设备的参数配置和状态的查看。SNMP 是基于通讯协议的管理工具,实现网络设备参数的自动化监控和远程配置。
  网络设备的配置和管理的新技术是SDN(Software Defined Netrork)。软件定义网络是2006年斯坦福大学提出的网络设备分层编程控制系统,全新的网络设备自动化配置和管理体系。
  手册最新版:https://ladybirdsnml.github.io/snmlipv6utf8snmptelnetsshweb/snmldoc_utf8ipv6.html
  
  手机扫描二维码打开最新手册

目 录



第1章、变量(var)
1、直接赋值语句
2、变量复制语句
3、变量编辑语句
4、示例脚本[C:\snmlipv6\var\var_nms1.txt]
第2章、屏幕(screen)文本、绘图、声音
1、文本显示
2、绘图
3、声音
4、示例脚本[C:\snmlipv6\screen\screen_nms1.txt]
第3章、snmp工具、snml语言执行概述
1、网络设备开启snmp功能
2、示例脚本[C:\snmlipv6\snmp\snmp_ipv4.txt]
3、解释器[C:\snmlipv6\snml.exe]逐行解析执行脚本
4、示例脚本[C:\snmlipv6\snmp\snmp_ipv4.txt]语法解析
5、示例脚本[C:\snmlipv6\snmp\snmp_ipv6.txt]
第4章、telnet
1、示例脚本[C:\snmlipv6\telnet\telnet_ipv4.txt],查看文本区内容
2、示例脚本分析
3、脚本执行后查看变量区内容
4、示例脚本[C:\snmlipv6\telnet\telnet_ipv6.txt],查看文本区内容
第5章、文本区(text)
1、文本区增加内容
2、使用文本区头指针、尾指针选定文本区内容
3、文本区选定内容的编辑、存储、变量提取
4、文本区删除部分内容
5、示例脚本[C:\snmlipv6\text\text_nms1.txt]
第6章、判断语句(if)
1、判断变量的值(if.var)
2、判断文本区选定内容(if.text)
第7章、循环语句(loop)
第8章、dns
1、dns语句分析
2、示例脚本[C:\snmlipv6\ping\ping_ipv4.txt]中的dns语句部分
3、示例脚本[C:\snmlipv6\ping\ping_ipv6.txt]中的dns语句部分
第9章、ping
1、ping语句分析
2、示例脚本[C:\snmlipv6\ping\ping_ipv4.txt
3、示例脚本[C:\snmlipv6\ping\ping_ipv6.txt
第10章、arp
1、arp语句分析
2、示例脚本[C:\snmlipv6\arp\arp_nms1.txt]
第11章、excel
1、excel语句分析
2、示例脚本[C:\snmlipv6\excel\excel_nms1.txt]
第12章、smtp(e-mail)
1、smtp语句分析
2、示例脚本[C:\snmlipv6\smtp\smtp_nms1.txt]
第13章、tcp
1、tcp语句分析
2、示例脚本[C:\snmlipv6\tcp\tcp_client_ipv4.txt]
3、示例脚本[C:\snmlipv6\tcp\tcp_client_ipv6.txt]
第14章、udp
1、udp语句分析
2、示例脚本[C:\snmlipv6\udp\udp_ipv4.txt]
3、示例脚本[C:\snmlipv6\udp\udp_ipv6.txt]
第15章、ssh
1、ssh语句分析
2、示例脚本[C:\snmlipv6\ssh\ssh_ipv4.txt]
3、ssh注册脚本[C:\snmlipv6\ssh\sshreg_nms.txt]
4、示例脚本[C:\snmlipv6\ssh\ssh_ipv6.txt]
第16章、web
1、web语句分析
2、示例脚本[C:\snmlipv6\web\web_nms1.txt]
第17章、mysql数据库
1、mysql语句分析
2、示例脚本[C:\snmlipv6\mysql\mysql_utf8.txt]
第18章、sqlite数据库
1、sqlite语句分析
2、示例脚本[C:\snmlipv6\sqlite\sqlite_nms1.txt]
第19章、 Run(脚本执行控制)
1、run语句分析
2、示例脚本[C:\snmlipv6\run\run_nms1.txt]
第20章、 sys(执行本机命令)
1、sys语句分析
2、示例脚本[C:\snmlipv6\sys\sys_nms1.txt]
第21章、 macro
1、macro语句分析
2、示例脚本[C:\snmlipv6\macro\macro_nms1.txt]
附录1、全部语句句法格式


第1章、变量(var)


1、直接赋值语句


var {myvar1} value {test1}
定义变量myvar1的值为字符串“test1”

var {myvar2} value number {(1+2)*3/4-5}
定义变量myvar2的值为整形数字,计算表达式的值为-3

var {myvar3} value datetime
定义变量myvar3的值当前日期时间,示例值“2019-06-01 21:16:37”

2、变量复制语句

var {myvar4} copy var {myvar1}
定义变量myvar4,复制变量myvar1的值,值为字符串“test1”

var {myvar5} copy var {myvar2}
定义变量myvar5,复制变量myvar2的值,值为字符串“-3”

var {myvar6} copy var {myvar3} after {5} bytes length {5}
定义变量myvar6,复制变量myvar3的部分值,从第5字节后面拷贝5个字节的长度,值为字符串“06-01”

var {myvar7} copy var {myvar5}
定义变量myvar5,复制变量myvar5的值,值为字符串“-3”

3、变量编辑语句


var {myvar4} add {2}
变量myvar4的值追加字符串“2”,值为字符串“test12”

var {myvar5} add number {1}
变量myvar5的值整数加1,值为-2

var {myvar6} replace {-} with {.}
变量myvar6的值进行字符串值的替换,把“-”替换为“.”,值为“06.01”

var {myvar7} adjust length {10} align {right}
变量myvar7的值进行长度调整,调整为10个字节,右对齐,值为“       -3”

4、示例脚本[C:\snmlipv6\var\var_nms1.txt],脚本为纯文本文件,支持UTF8的文件编码格式。


1)脚本内容如下:
C:\snmlipv6\var\var_nms1.txt
001var {myvar1} value {test1}
002var {myvar2} value number {(1+2)*3/4-5}
003var {myvar3} value datetime
004
005var {myvar4} copy var {myvar1}
006var {myvar5} copy var {myvar2}
007var {myvar6} copy var {myvar3} after {5} bytes length {5}
008
009var {myvar4} add {2}
010var {myvar5} add number {1}
011var {myvar6} replace {-} with {.}
012
013var {myvar7} copy var {myvar5}
014var {myvar7} adjust length {10} align {right}
015
016screen.text at point {10} {30} string {myvar1 = [~myvar1~]}
017screen.text at point {10} {50} string {myvar2 = [~myvar2~]}
018screen.text at point {10} {70} string {myvar3 = [~myvar3~]}
019screen.text at point {10} {90} string {myvar4 = [~myvar4~]}
020screen.text at point {10} {110} string {myvar5 = [~myvar5~]}
021screen.text at point {10} {130} string {myvar6 = [~myvar6~]}
022screen.text at point {10} {150} string {myvar7 = [~myvar7~]}
023
024run.end
脚本文件保存为UTF8编码,如下图所示:

#screen.text语句见第二章屏幕部分。

2)通过C:\snmlipv6\var_nms1.bat执行,批处理文件内容如下:

C:\snmlipv6\snml.exe nolog C:\snmlipv6\var\var_nms1.txt
  参数1:“C:\snmlipv6\snml.exe” 为解释器程序
  参数2:“nolog”指定运行模式和日志的级别,nolog为显示图形界面但不记录日志
  参数3:“C:\snmlipv6\var\var_nms1.txt”为脚本文件的全路径文件名

3) 点击“Go”或“run”执行脚本。



目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第2章、屏幕(screen)文本、绘图、声音


1、文本显示

screen.text at point {10} {30} string {myvar1 = [~myvar1~]}
在屏幕的坐标点(10,30)处显示字符串“myvar1 = [~myvar1~]”,在语句解释执行时,会进行变量值的替换,“~myvar1~”表示需替换变量myvar1的值,最终显示的内容为“myvar1 = [test1]”

screen.set font {仿宋} size {16}
设置文本显示的字体和大小

screen.set color red {255} green {128} blue {127}
设置屏幕绘图、文本的颜色,RGB三色,每个颜色值的范围为0-255

2、绘图


screen.line from point {10} {30} to point {110} {90}
屏幕绘制直线,从坐标点(10,30)到从坐标点(110,90)

screen.set mode {fill}
设置屏幕为填充模式
screen.rect from point {10} {30} to point {110} {90}
屏幕绘制实心矩形,从坐标点(10,30)到从坐标点(110,90)
screen.arc at point {10} {30} radius {10} from {90} to {270}
屏幕绘制实心扇形,圆心为坐标点(10,30),半径10,角度从90度到270度

screen.set mode {stroke}
设置屏幕为划线模式
screen.rect from point {10} {30} to point {110} {90}
屏幕绘制矩形框,从坐标点(10,30)到从坐标点(110,90)
screen.arc at point {10} {30} radius {10} from {90} to {270}
屏幕绘制圆弧,圆心为坐标点(10,30),半径10,角度从90度到270度

screen.image url {C:\snmlipv6\tmp\snml_1.png} from point {0} {0} to point {213} {358}
在屏幕的矩形区域内显示图片,矩形区域为从坐标点(0,0)到(213,358)

screen.save to file {C:\snmlipv6\tmp\snml_1.png} from point {0} {0} to point {640} {480}
保存屏幕的矩形区域到图片(png格式),矩形区域为从坐标点(0,0)到(640,480)

3、声音


screen.play midi {1234567cdefgabCDEFGAB}
播放midi音乐“1234567cdefgabCDEFGAB”

screen.speak {tts语言播放演示,myvar1 = ~myvar1~}
播放语音“tts语言播放演示,myvar1 = test1”


4、示例脚本[C:\snmlipv6\screen\screen_nms1.txt],脚本为纯文本文件,支持UTF8的文件编码格式。

C:\snmlipv6\screen\screen_nms1.txt
001screen.set font {Arial} size {16}
002screen.text at point {140} {60} string {Simple Network Management Language (SNML)}
003
004screen.set font {华文行楷} size {24}
005screen.text at point {180} {100} string {简单网络管理语言}
006screen.line from point {10} {120} to point {630} {120}
007screen.set font {Arial} size {12}
008screen.play midi {cdefgab 1234567}
009
010var {x} value { 10}
011var {y} value { 300}
012
013macro.call {draw_ladybird}
014
015
016screen.text at point {10} {180} string {术语1:简单网络管理协议S N M P( Simple Network Management Protocol )}
017screen.text at point {10} {230} string {术语2:简单网络管理语言 S N M L ( Simple Network Management Language )}
018screen.text at point {200} {350} string {版本:snml8.13(ladybird-ipv6-20200205)}
019screen.text at point {200} {375} string {技术支持邮箱1:snml_ladybird@protonmail.com}
020screen.text at point {200} {400} string {技术支持邮箱2:snml_ladybird@hotmail.com}
021screen.text at point {10} {440} string {Now remember, Pinocchio, be a good boy. And always let your conscience be your guide.}
022screen.text at point {10} {455} string {Love is the flame of life, without it, everything becomes dark. -- Romain Rolland. }
023screen.speak {Now remember, Pinocchio, be a good boy. And always let your conscience be your guide.}
024screen.speak {Love is the flame of life, without it, everything becomes dark. -- Romain Rolland. }
025
026screen.line from point {50} {220} to point {630} {220}
027screen.line from point {50} {265} to point {630} {265}
028screen.line from point {30} {290} to point {630} {290}
029screen.line from point {130} {315} to point {630} {315}
030run.set loglevel {info}
031
032screen.speak {1、什么是简单网络管理协议S N M P( Simple Network Management Protocol )?}
033
034screen.text at point {50} {205} string {简单网络管理协议是可以管理不同厂家网络设备的简单通讯协议。}
035screen.speak {简单网络管理协议是可以管理不同厂家网络设备的简单通讯协议。}
036screen.text at point {50} {250} string {简单网络管理语言是一种类自然语言的脚本语言,它采用snmp、telnet、ping、dns、arp、ssh、}
037screen.speak {简单网络管理语言是一种类自然语言的脚本语言,它采用snmp、telnet、ping、dns、arp、ssh、}
038screen.text at point {30} {275} string {tcp、udp、web等协议与网络设备的互动,内置了smtp协议用于告警等邮件的发送,}
039screen.speak {tcp、udp、web等协议与网络设备的互动,内置了smtp协议用于告警等邮件的发送,}
040screen.text at point {130} {300} string {支持excel、mysql、sqlite等3种方式进行管理信息数据的存取。}
041screen.speak {支持excel、mysql、sqlite等3种方式进行管理信息数据的存取。}
042screen.save to file {C:\snmlipv6\tmp\snml_1.png} from point {0} {0} to point {640} {480}
043run.end
044
045macro.begin {draw_ladybird}
046  #var {x} value {0}
047  #var {y} value {0}
048  screen.set mode {stroke}
049  screen.set color red {0} green {0} blue {0}
050  #screen.rect from point {0} {0} to point {127} {127}
051  screen.set color red {255} green {0} blue {0}
052  screen.set mode {fill}
053  
054  var {x1} value number {~x~+60}
055  var {y1} value number {~y~+78}
056  screen.arc at point {~x1~} {~y1~} radius {50} from {0} to {360}
057  screen.set color red {0} green {0} blue {0}
058  
059  var {x1} value number {~x~+60}
060  var {y1} value number {~y~+33}
061  screen.arc at point {~x1~} {~y1~} radius {25} from {180} to {360}
062  
063  var {x1} value number {~x~+60}
064  var {y1} value number {~y~+28}
065  screen.set color red {0} green {0} blue {0}
066  screen.arc at point {~x1~} {~y1~} radius {100} from {85} to {95}
067  
068  var {x1} value number {~x~+60}
069  var {y1} value number {~y~+33}
070  var {x2} value number {~x~+80}
071  var {y2} value number {~y~+5}
072  
073  screen.line from point {~x1~} {~y1~} to point {~x2~} {~y2~}
074  var {x2} value number {~x~+40}
075  screen.line from point {~x1~} {~y1~} to point {~x2~} {~y2~}
076  
077  var {x1} value number {~x~+80}
078  var {y1} value number {~y~+5}
079  screen.arc at point {~x1~} {~y1~} radius {2} from {0} to {360}
080  var {x1} value number {~x~+40}
081  screen.arc at point {~x1~} {~y1~} radius {2} from {0} to {360}
082  
083  screen.set color red {255} green {255} blue {255}
084  
085  var {x1} value number {~x~+48}
086  var {y1} value number {~y~+20}
087  screen.arc at point {~x1~} {~y1~} radius {5} from {0} to {360}
088  var {x1} value number {~x~+72}
089  screen.arc at point {~x1~} {~y1~} radius {5} from {0} to {360}
090  
091  screen.set color red {0} green {0} blue {0}
092  
093  var {x1} value number {~x~+48}
094  var {y1} value number {~y~+19}
095  screen.arc at point {~x1~} {~y1~} radius {3} from {0} to {360}
096  
097  var {x1} value number {~x~+72}
098  screen.arc at point {~x1~} {~y1~} radius {3} from {0} to {360}
099  
100  var {x1} value number {~x~+60}
101  var {y1} value number {~y~+43}
102  screen.arc at point {~x1~} {~y1~} radius {10} from {0} to {360}
103  
104  var {x1} value number {~x~+90}
105  var {y1} value number {~y~+59}
106  screen.arc at point {~x1~} {~y1~} radius {8} from {0} to {360}
107  var {x1} value number {~x~+30}
108  screen.arc at point {~x1~} {~y1~} radius {8} from {0} to {360}
109  
110  var {x1} value number {~x~+75}
111  var {y1} value number {~y~+73}
112  screen.arc at point {~x1~} {~y1~} radius {8} from {0} to {360}
113  var {x1} value number {~x~+45}
114  screen.arc at point {~x1~} {~y1~} radius {8} from {0} to {360}
115  
116  var {x1} value number {~x~+90}
117  var {y1} value number {~y~+100}
118  screen.arc at point {~x1~} {~y1~} radius {8} from {0} to {360}
119  var {x1} value number {~x~+30}
120  screen.arc at point {~x1~} {~y1~} radius {8} from {0} to {360}
121macro.end
执行C:\snmlipv6\screen_nms1.bat,点击“Go”或“run”执行脚本,脚本执行结果如下:



目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第3章、snmp工具、snml语言执行概述


  snmp( Simple Network Management Protocol )简单网络管理协议是可以管理不同厂家网络设备的简单通讯协议。

1、网络设备开启snmp功能

Cisco设备配置snmp
参考文档: https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/snmp/configuration/12-4t/snmp-12-4t-book/nm-snmp-cfg-snmp-support.html#GUID-048B997C-AB98-4602-B07B-3130577154F1
举例 :
Router>enable
Router# configure terminal
Router(config)# snmp-server community MyPassword RO

HUAWEI设备配置snmp
参考文档: https://support.huawei.com/enterprise/zh/doc/DOC1000088739?section=j005
H3C设备配置snmp
参考文档: http://www.h3c.com/cn/d_201108/723419_30005_0.htm
举例 :
<Sysname>system-view
[Sysname] snmp-agent
[Sysname] snmp-agent sys-info version v1 v2c
[Sysname] snmp-agent community read MyPassword

2、查看示例脚本[C:\snmlipv6\snmp\snmp_ipv4.txt]

C:\snmlipv6\snmp\snmp_ipv4.txt
001snmp.open version {2c} ip {192.168.186.132} port {161} password {cisco}
002snmp.get var {cisco7200} oid {1.3.6.1.2.1.1.5.0}
003screen.text at point {5} {20} string {snmp.get (oid:1.3.6.1.2.1.1.5.0) return value: [~cisco7200~]}
004snmp.getnext oid {1.3.6.1.2.1.1.3}
005screen.text at point {5} {40} string {snmp.getnext (oid:1.3.6.1.2.1.1.5.0) }
006screen.text at point {55} {60} string {return oid: [~snmp.oid~] return value: [~snmp.value~]}
007run.end

3、由解释器 [C:\snmlipv6\snml.exe] 逐行解析执行脚本

  批处理文件C:\snmlipv6\snmp_ipv4.bat,双击执行,开始调用解释器程序。

C:\snmlipv6\snml.exe nolog C:\snmlipv6\snmp\snmp_ipv4.txt
  批处理文件中执行C:\snmlipv6\snml.exe,snml.exe是简单网络管理语言的解释器。后面两个命令行参数,第一个参数nolog参数的含义是不记录日志,第二个参数C:\snmlipv6\snmp\snmp_ipv4.txt为网管脚本文件的文件名。
  点击“Go”或“run”执行脚本,脚本执行结果如下:

4、示例脚本[C:\snmlipv6\snmp\snmp_ipv4.txt]语法解析


1)snmp.open version {2c} ip {192.168.186.132} port {161} password {MyPassword}
snmp.open语句用来打开snmp管理协议,有4个参数,所有参数用左右大括弧{}括起来。
第一个参数{2c}为snmp协议的版本号,支持1、2、2c;
第二个参数{192.168.186.132}为网络设备的IP地址;
第三个参数{161}为网络设备snmp服务的端口号,默认值为UDP的161端口;
第四个参数{MyPassword}为网络设备snmp服务的密码

2)snmp.get var {cisco7200_SysName} oid {1.3.6.1.2.1.1.5.0}
snmp.get语句向snmp.open指定的网络设备发送snmp.get请求报文,并接收应答。
第二个参数{1.3.6.1.2.1.1.5.0}为请求网络设备参数的oid值;
第一个参数{cisco7200_SysName}为变量名字,该变量用来保存网络设备返回值;
在本例子中网络设备返回oid {1.3.6.1.2.1.1.5.0} 对应的值“R2_7206.test.cisco”,
变量区生成或更新变量:cisco7200_SysName=[R2_7206.test.cisco];

3)screen.text at point {20} {20} string {snmp.get 返回值: ~cisco7200_SysName~}
screen.text语句在解释器的屏幕上显示文本。
第一、二个参数{20}和 {20}为屏幕的坐标点(20,20),在该位置开始显示文本;
第三个参数{snmp.get 返回值: ~cisco7200_SysName~}为要显示的文本内容,用两个~线连接一个变量,
在本语句中,显示“snmp.get 返回值:”+ 变量cisco7200_SysName的值,变量cisco7200_SysName=[R2_7206.test.cisco],最后显示内容为:“snmp.get 返回值:R2_7206.test.cisco”

4)snmp.getnext oid {1.3.6.1.2.1.1.3}
snmp.getnext语句向snmp.open指定的网络设备发送snmp.getnext请求报文,并接收应答。
第一个参数{1.3.6.1.2.1.1.3}为请求网络设备参数的oid值;
网络设备接收到snmp.getnext指令后,返回与指定oid紧邻的下一个oid值和及对应参数值,在本例中网络设备返回oid {1.3.6.1.2.1.1.3}的紧邻的下一个oid值为”1.3.6.1.2.1.1.3.0”,参数值为” 0 Days 1 Hours 1 Minutes 34 Seconds”;
由于本语句执行后产生的变量值有两个,语句用规定的两个变量名来保存网络设备返回的两个值,变量名和值如下:
snmp.oid=[1.3.6.1.2.1.1.3.0]
snmp.value=[0 Days 1 Hours 1 Minutes 34 Seconds]

5)screen.text at point {20} {100} string {snmp.getnext 返回oid值:~snmp.oid~ 返回值:~snmp.value~}
screen.text语句在解释器的屏幕上显示文本。
第一、二个参数{20}和 {100}为屏幕的坐标点(20,100),在该位置开始显示文本;
第三个参数{snmp.getnext 返回oid值:~snmp.oid~ 返回值:~snmp.value~}为要显示的文本内容,用两个~线连接一个变量,在本语句中,显示“snmp.getnext 返回oid值:”+ 变量snmp.oid的值+“返回值:”+变量snmp.value 的值,最后显示内容为:“snmp.getnext 返回oid值:1.3.6.1.2.1.1.3.0返回值:0 Days 1 Hours 1 Minutes 34 Seconds”
6)run.end
run.end语句表示脚本执行结束。

5、查看示例脚本[C:\snmlipv6\snmp\snmp_ipv6.txt]

C:\snmlipv6\snmp\snmp_ipv6.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {10.snmp test (ipv6): snmp.open snmp.get snmp.getnext}
003run.set loglevel {debug}
004snmp.open version {2c} ip {fe80::2} port {161} password {cisco}
005snmp.get var {v_snmp} oid {1.3.6.1.2.1.1.1.0}
006screen.text at point {10} {60} string {Cisco3725 ipv6:[fe80::2], snmp.get(1.3.6.1.2.1.1.1.0)=[~v_snmp~]}
007
008var {v_y} value {140}
009screen.text at point {10} {~v_y~} string {No.}
010screen.text at point {50} {~v_y~} string {Test Method}
011screen.line from point {10} {155} to point {230} {155}
012screen.text at point {270} {~v_y~} string {snmp.oid}
013screen.line from point {250} {155} to point {350} {155}
014screen.text at point {390} {~v_y~} string {snmp.value}
015screen.line from point {370} {155} to point {630} {155}
016
017var {v_time} value datetime
018var {v_i} value {0}
019
020
021var {snmp.oid} value {1.3.6.1.2.1.1.1.0}
022loop.begin
023  
024  var {v_i} add number {1}
025  var {v_y} add number {18}
026  screen.text at point {10} {~v_y~} string {~v_i~}
027  
028  screen.text at point {50} {~v_y~} string {snmp.getnext(~snmp.oid~)}
029  snmp.getnext oid {~snmp.oid~}
030  screen.text at point {250} {~v_y~} string {~snmp.oid~}
031  screen.text at point {370} {~v_y~} string {~snmp.value~}
032  
033  var {v_y} add number {18}
034  snmp.get var {v_snmp} oid {~snmp.oid~}
035  screen.text at point {50} {~v_y~} string {snmp.get(~snmp.oid~)}
036  
037  screen.text at point {370} {~v_y~} string {~v_snmp~}
038  
039  if.var {v_y} > {400}
040    loop.exit
041  if.end
042loop.end
043run.end
脚本执行结果如下:



目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第4章、telnet


  telnet协议是远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上登录远程主机、网络设备开展工作的能力。

1、示例脚本[C:\snmlipv6\telnet\telnet_ipv4.txt],查看文本区内容

C:\snmlipv6\telnet\telnet_ipv4.txt
001var {v_time} value datetime
002screen.text at point {10} {30} string {2. telnet ipv4 (192.168.186.132:23) test , datetime: ~v_time~}
003
004telnet.connect ip {192.168.186.132} port {23}
005telnet.recv expect {Username:}
006telnet.send {cisco%0a}
007telnet.recv expect {Password}
008
009telnet.send {cisco%0a}
010telnet.recv expect {>}
011telnet.send {enable%0a}
012telnet.set onrecv {More} send { }
013telnet.set delay {200} ms after per byte send
014telnet.send {show version%0a}
015telnet.recv for {5} seconds
016
017telnet.send {show run%0a}
018telnet.recv for {5} seconds
019telnet.send {exit%0a}
020telnet.close
021
022var {v_time} value datetime
023screen.text at point {10} {60} string {telnet tested end. datetime:~v_time~}
024
025run.end


  点击右下角的“文本区”单选按钮,显示脚本执行时的文本区的内容,如上图所示为telnet登录网络设备时显示的屏幕内容,将在下一章介绍文本区。

2、示例脚本分析

var {v_time} value datetime
screen.text at point {10} {30} string {2、telnet测试开始,当前时间:~v_time~}

telnet.connect ip {192.168.186.132} port {23}
登录远程设备,设备的IP地址为:192.168.186.132,服务端口号为:23

telnet.recv expect {Username:}
接收服务器发送的文本,一直接收到指定字符串“Username:”

telnet.send {cisco%0a}
发送用户名字符串“cisco”和换行键。

  要点1:snml参数中特殊字符的表示方法
例如不可见字符、回车、换行、tab等,采用%+两位16进制ASCII码的方式表示,例如本例中%0a代表换行。
由于%用于转义标识字符,当需要%字符时,应用%25标识,同样{用%7b标识,}用%7d标识。ASCII码表如下:

telnet.recv expect {Password}
接收服务器发送的文本,一直接收到指定字符串“Password”

telnet.send {cisco%0a}
发送密码字符串“cisco”和换行键。

telnet.recv expect {>}
接收服务器发送的文本,一直接收到指定字符串“>”

telnet.send {enable%0a}
发送字符串“enable”和换行键。

telnet.set onrecv {More} send { }
设置telnet自动输入选项,当接收到“More”时,自动发送一个空格

telnet.set delay {200} ms after per byte send
设置telnet输入选项,每发送一个字节后,暂停200毫秒,再发送下一个字符。模拟人工键盘输入,防止设备压力过大。

telnet.send {show version%0a}
发送字符串“show version”命令和换行键。

telnet.recv for {5} seconds
接收5秒钟内服务器发送的文本,当服务器发送的文本中含有“More”时,自动发送一个空格

telnet.send text
发送选中的文本区域

telnet.close
关闭telnet连接。

var {v_time} value datetime
screen.text at point {10} {60} string {telnet测试完成,当前时间:~v_time~}

run.end

3、脚本执行后查看变量区内容


  点击右下角的“变量区”单选按钮,显示脚本执行时的全部变量的值,注意telnet.status、telnet.onrecv、telnet.autosend 3个变量的值,参见下图:

4、示例脚本[C:\snmlipv6\telnet\telnet_ipv6.txt],查看文本区内容

C:\snmlipv6\telnet\telnet_ipv6.txt
001var {v_time} value datetime
002screen.text at point {10} {30} string {2. telnet ipv6 ([FE80::1]:23) test , datetime: ~v_time~}
003
004telnet.connect ip {FE80::1} port {23}
005telnet.recv expect {Username:}
006telnet.send {cisco%0a}
007telnet.recv expect {Password}
008
009telnet.send {cisco%0a}
010telnet.recv expect {>}
011telnet.send {enable%0a}
012telnet.set onrecv {More} send { }
013telnet.set delay {200} ms after per byte send
014telnet.send {show version%0a}
015telnet.recv for {5} seconds
016
017telnet.send {show run%0a}
018telnet.recv for {5} seconds
019telnet.send {exit%0a}
020telnet.close
021
022var {v_time} value datetime
023screen.text at point {10} {60} string {telnet tested end. datetime:~v_time~}
024
025run.end

脚本执行结果如下:

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第5章、文本区(text)


  Snml解释器包含脚本区、变量区和文本区3个区的内容。文本区用来存储远程登录(telnet、ssh)、访问(tcp、udp)网络设备、服务时,网络设备、服务端返回的文本内容,例如show run、show version等命令的返回内容。
  telnet.recv、ssh_recv 等语句接收网络设备返回的文本,存储到文本取,变量text.bytes为文本区的字节长度。对文本区本身的操作语句如下:

1、文本区增加内容

text.add {当前文本区字节数:~text.bytes~通过脚本增加文本区的内容,添加到文本区的末尾%0a}
文本区增加内容,例句参数引用了变量text.bytes,并在行尾增加换行字符(%0a)

text.add from file {C:\snmlipv6\tmp\text1.txt}
文本区增加内容,从文件中读取内容,添加到文本区的末尾。

2、使用文本区头指针、尾指针选定文本区内容

text.headpointer move to head
把头指针移动到文本区的开始处,即第一字节

text.headpointer move to tail
把头指针移动到文本区的结尾处,即最后一个字节

text.headpointer move to {4} byte
把头指针移动到文本区的指定字节位置,本示例语句移动到第4字节

text.headpointer move forward {A4} bytes
把头指针移动从当前位置开始向前移动字节位置,本示例语句向前移动4个字节

text.headpointer move forward after {version}
把头指针移动从当前位置开始向前移动到特定字符串的后面,本示例语句向前移动到“version”的后面1个字节位置

text.tailpointer move to head
把尾指针移动到文本区的开始处,即第一字节

text.tailpointer move to tail
把尾指针移动到文本区的结尾处,即最后一个字节

text.tailpointer move to {4} byte
把尾指针移动到文本区的指定字节位置,本示例语句移动到第4字节

text.tailpointer move backward {4} bytes
把尾指针移动从当前位置开始向后移动字节位置,本示例语句向后移动4个字节

text.tailpointer move backward before {Software}
把尾指针移动从当前位置开始向后移动到特定字符串的前面,本示例语句向后移动到“Software”的前面1个字节位置

3、文本区选定内容的编辑、存储、变量提取

  通过移动头指针和尾指针,从头指针(text.headpointer)和尾指针(text.tailpointer)之间的文本内容即为文本区的选定内容

text.replace {version1} with {Version2}
文本区选定内容进行查找替换,本示例语句把“version1”替换为“Version2”


text.save to file { C:\snmlipv6\tmp\text1.txt}
文本区选定内容保存到文件中,覆盖文件的原来内容

text.save append to file { C:\snmlipv6\tmp\text1.txt}
文本区选定内容追加方式保存到文件中,添加在文件原来内容的尾部

text.get var {IOSversion} after {20} bytes length {8}
文本区选定内容中提取变量“IOSversion”,定位在选定区域第20字节后面,长度为8

text.get var { IOSversion } between { Version } and {,RELEASE}
文本区选定内容中提取变量“IOSversion”,定位在字符串“Version”和字符串“,RELEASE”之间

text.get var { IOSversion } after { Version } length {7}
文本区选定内容中提取变量“IOSversion”,定位在字符串“Version”后面,长度为7

text.get var { IOSversion } word number {6}
文本区选定内容中提取变量“IOSversion”,选定区域第6个单词

text.line get all words
文本区选定内容提取当前行中的所有单词

text.line get all words between {[} and {]} separated by {,}
文本区选定内容提取所有单词,在“[”“]”之间,分隔符为“,”

4、文本区删除部分内容

text.delete from headpointer
删除文本区头指针后面的内容

text.delete from {3} byte
删除文本区头从指定字节后面的内容,本示例语句删除从第3字节开始的后面所有内容

text.delete from tailpointer
删除文本区尾指针后面的内容

5、示例脚本[C:\snmlipv6\text\text_nms1.txt]

C:\snmlipv6\text\text_nms1.txt
001run.set loglevel {info}
002screen.set color red {0} green {0} blue {0}
003screen.text at point {150} {30} string {16、text test}
004var {v_y} value {60}
005screen.text at point {10} {~v_y~} string {No.}
006screen.text at point {100} {~v_y~} string {9x9 multiplication table}
007screen.line from point {10} {75} to point {630} {75}
008var {v_i} value {0}
009var {v_x} value {0}
010var {v_y} value {0}
011var {x} value {0}
012var {y} value {0}
013var {v_xy} value {0}
014
015loop.begin
016  var {v_y} add number {1}
017  var {v_x} value {0}
018  var {y} value number {70+28*~v_y~}
019  screen.text at point {5} {~y~} string {Line:~v_y~}
020  text.add {Line:~v_y~}
021  loop.begin
022    var {v_x} add number {1}
023    var {v_time} value datetime
024    var {v_xy} value number {~v_x~*~v_y~}
025    var {v_xy} adjust length {3} align {left}
026    
027    text.add {~v_x~*~v_y~=~v_xy~ }
028    
029    var {x} value number {~v_x~*50}
030    
031    screen.text at point {~x~} {~y~} string {~v_x~*~v_y~=~v_xy~}
032    
033    if.var {v_x} >= {~v_y~}
034      
035      text.add {%0d%0a}
036      loop.exit
037    if.end
038  loop.end
039  
040  text.tailpointer move to tail
041  text.headpointer move forward after {Line:~v_y~}
042  
043  text.line get all words
044  #text.line get all words between {1} and {%0d} separated by { }
045  text.get var {word_no2} word number {2}
046  
047  if.var {v_y} >= {9}
048    loop.exit
049  if.end
050loop.end
051
052text.headpointer move to head
053text.tailpointer move to tail
054text.save to file {C:\snmlipv6\text\text99.txt}
055text.replace {*} with {x}
056text.headpointer move to head
057text.tailpointer move to tail
058text.save to file {C:\snmlipv6\text\text99x.txt}
059
060text.replace {x} with {X}
061text.headpointer move to head
062text.tailpointer move to tail
063text.save to file {C:\snmlipv6\text\text99X2.txt}
064
065
066run.end

  脚本执行画面如下:


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第6章、判断语句(if)


  判断语句有if.var、if.text和if.end构成程序块,当if.var、if.text语句为真时,执行if块内的语句;当if.var、if.text语句为假时,不执行if块内的语句。格式如下:

if.var
  if块内的语句1
  if块内的语句2
  ……
if.end

if.text
  if块内的语句1
  if块内的语句2
  ……
if.end
  参见示例脚本[C:\snmlipv6\text\text_nms1.txt]中的if语句部分。

1、判断变量的值(if.var)

if.var {x} > {4}
判断变量“x”的整形值是否 > 4

if.var {x} >= {4}
判断变量“x”的整形值是否 >= 4

if.var {x} < {4}
判断变量“x”的整形值是否 < 4

if.var {x} <= {4}
判断变量“x”的整形值是否 <= 4

if.var {x} == {4}
判断变量“x”的整形值是否 = 4

if.var {x} <> {4}
判断变量“x”的整形值是否不等于(<>) 4

if.var {versionIOS} in {12.4,12.3,12.2}
判断变量“versionIOS”的字符串的值是否在字符串“12.4,12.3,12.2”中

if.var {versionIOS} not in {12.4,12.3,12.2}
判断变量“versionIOS”的字符串的值是不否在字符串“12.4,12.3,12.2”中

if.var {versionIOS} contain {12.3}
判断变量“versionIOS”的字符串的值是否包含字符串“12.3”

if.var {versionIOS} not contain {12.3}
判断变量“versionIOS”的字符串的值是否不包含字符串“12.3”

2、判断文本区选定内容(if.text)

if.text contain {Version}
判断文本区的选定内容中是否包含字符串“Version”,如果包含就为真,执行if块内的语句。

if.text not contain { Version }
判断文本区的选定内容中是否不包含字符串“Version”,如果不包含就为真,执行if块内的语句。


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第7章、循环语句(loop)


  循环语句有loop.begin和loop.end构成程序块。loop.next和loop.exit结合if语句控制loop的执行。

loop.begin
  loop块内的语句
  
  loop.next
  不执行loop.next后面的语句,继续下一次循环,跳转到loop.begin执行
  
  loop块内的语句
  ……
  loop.exit
  不执行loop.exit后面的语句,跳出循环,跳转到loop.end执行
  
loop.end
参见示例脚本[C:\snmlipv6\text\text_nms1.txt]中的loop语句部分。


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第8章、dns


  域名系统(DNS)是一种用于TCP/I应用程序的分布式数据库,它提供主机名字和 IP地址之间的转换及有关电子邮件的选路信息。

1、dns语句分析


dns.get var {ip_addr} host {mail.163.com}

查询主机“mail.163.com”的IP地址,保存到变量“ip_addr”中。本示例中变量ip_addr=[220.181.12.207]

dns.set ipmode {ipv6}
设置DNS查询的模式为IPV6,来查询域名的IPV6地址。
dns.get var {ip_addr} host {www.ipv6-test.com}
查询主机“www.ipv6-test.com”的IPV6地址,保存到变量“ip_addr”中。

2、示例脚本[C:\snmlipv6\ping\ping_ipv4.txt]中的dns语句部分


3、示例脚本[C:\snmlipv6\ping\ping_ipv6.txt]中的dns语句部分




目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第9章、ping


  “ping”这个名字源于声纳定位操作。目的是为了测试另一台主机、网络设备是否可达。ping是一个通信协议,是TCP/IP协议的一部分;ping也是Windows、Unix和Linux系统下的一个命令, ping命令可检查网络是否连通,分析和判定网络故障。

1、ping语句分析

ping.ip {220.181.12.207} ttl {64} size {32}

ping测试,主机、设备ip为220.181.12.207,发送报文的ttl值为64,发送报文的长度为32字节
ping语句执行后,系统创建、更新以下变量,示例值如下:
ping.dest_ip=[220.181.12.207],目的IP
ping.received_responses=[1],接收到响应报文的个数
ping.roundtrip_time_milliseconds=[56],响应时间(毫秒)
ping.reply_ip=[220.181.12.207],应答报文的IP,当ttl减小到0的时候,网络设备应答
ping.reply_ttl=[54],应答报文的ttl
ping.reply_bytes=[32],应答报文的长度
ping.status=[IP_SUCCESS]
ping语句执行后,通过检查变量“ping.status”是否为“IP_SUCCESS”来判断ping是否成功。

2、示例脚本[C:\snmlipv6\ping\ping_ipv4.txt]

C:\snmlipv6\ping\ping_ipv4.txt
001screen.text at point {150} {30} string {9.ping test (ipv4): ttl,size,roundtrip_time,ip}
002
003var {v_ttl} value {0}
004var {v_y} value {60}
005screen.text at point {50} {~v_y~} string {send ping request}
006screen.line from point {10} {75} to point {180} {75}
007screen.text at point {350} {~v_y~} string {ping response}
008screen.line from point {200} {75} to point {630} {75}
009
010var {v_y} value {80}
011screen.text at point {10} {~v_y~} string {Dest IP Addr}
012screen.text at point {110} {~v_y~} string {TTL}
013screen.text at point {150} {~v_y~} string {Bytes}
014
015screen.text at point {200} {~v_y~} string {IP Addr}
016screen.text at point {300} {~v_y~} string {TTL}
017screen.text at point {350} {~v_y~} string {Bytes}
018screen.text at point {400} {~v_y~} string {ms}
019screen.text at point {450} {~v_y~} string {ping.status}
020
021run.set loglevel {debug}
022dns.get var {ip_addr} host {mail.163.com}
023run.set loglevel {nolog}
024
025var {v_ttl} value {0}
026var {v_y} value {80}
027var {v_sendbytes} value {1000}
028loop.begin
029  var {v_ttl} add number {1}
030  var {v_y} add number {20}
031  run.set loglevel {debug}
032  ping.ip {~ip_addr~} ttl {~v_ttl~} size {~v_sendbytes~}
033  run.set loglevel {nolog}
034  screen.text at point {10} {~v_y~} string {~ping.dest_ip~}
035  screen.text at point {110} {~v_y~} string {~v_ttl~}
036  screen.text at point {150} {~v_y~} string {~v_sendbytes~}
037  
038  screen.text at point {200} {~v_y~} string {~ping.reply_ip~}
039  screen.text at point {300} {~v_y~} string {~ping.reply_ttl~}
040  screen.text at point {350} {~v_y~} string {~ping.reply_bytes~}
041  screen.text at point {400} {~v_y~} string {~ping.roundtrip_time_milliseconds~}
042  screen.text at point {450} {~v_y~} string {~ping.status~}
043  if.var {v_ttl} > {16}
044    loop.exit
045  if.end
046loop.end
047
048run.end

  脚本执行画面如下:

3、示例脚本[C:\snmlipv6\ping\ping_ipv6.txt]


C:\snmlipv6\ping\ping_ipv6.txt
001screen.text at point {150} {30} string {9.ping test (ipv6): ttl,size,roundtrip_time,ip}
002
003var {v_ttl} value {0}
004var {v_y} value {60}
005screen.text at point {50} {~v_y~} string {send ping request}
006screen.line from point {10} {75} to point {180} {75}
007screen.text at point {350} {~v_y~} string {ping response}
008screen.line from point {200} {75} to point {630} {75}
009
010var {v_y} value {80}
011screen.text at point {10} {~v_y~} string {Dest IP Addr}
012screen.text at point {110} {~v_y~} string {TTL}
013screen.text at point {150} {~v_y~} string {Bytes}
014
015screen.text at point {200} {~v_y~} string {IP Addr}
016screen.text at point {400} {~v_y~} string {ms}
017screen.text at point {450} {~v_y~} string {ping.status}
018
019#run.set loglevel {debug}
020dns.set ipmode {ipv6}
021#dns.get var {ip_addr} host {www.ipv6-test.com}
022
023var {ip_addr} value {FE80::1}
024
025var {v_ttl} value {0}
026var {v_y} value {80}
027var {v_sendbytes} value {1000}
028loop.begin
029  var {v_ttl} add number {1}
030  var {v_y} add number {20}
031  ping.ip {~ip_addr~} ttl {~v_ttl~} size {~v_sendbytes~}
032  
033  screen.text at point {10} {~v_y~} string {~ping.dest_ip~}
034  screen.text at point {110} {~v_y~} string {~v_ttl~}
035  screen.text at point {150} {~v_y~} string {~v_sendbytes~}
036  screen.text at point {200} {~v_y~} string {~ping.reply_ip~}
037  screen.text at point {400} {~v_y~} string {~ping.roundtrip_time_milliseconds~}
038  screen.text at point {450} {~v_y~} string {~ping.status~}
039  if.var {v_ttl} > {16}
040    loop.exit
041  if.end
042loop.end
043
044run.end

  脚本执行画面如下:


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第10章、arp


  当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据 48 bit的以太网地址(MAC地址)来确定目的接口的。ARP为IP地址到对应的硬件地址之间提供动态映射。


1、arp语句分析

arp.get var { arp_ip_mac} ip {10.174.38.164}
查询IP地址 “10.174.38.164”设备的MAC地址,保存到变量“arp_ip_mac”中。

参见示例脚本[C:\snmlipv6\arp\arp_nms1.txt]中的arp语句部分。

2、示例脚本[C:\snmlipv6\arp\arp_nms1.txt]


C:\snmlipv6\arp\arp_nms1.txt
001screen.text at point {250} {30} string {1. Arp Test}
002var {v_ttl} value {0}
003var {v_y} value {60}
004screen.text at point {50} {~v_y~} string {IP Addr}
005screen.line from point {10} {75} to point {180} {75}
006screen.text at point {350} {~v_y~} string {MAC Addr}
007screen.line from point {200} {75} to point {630} {75}
008
009var {v_ip1} value {192.168.186.128}
010var {v_ip2} value {192.168.186.131}
011var {v_ip3} value {192.168.186.132}
012
013var {v_i} value {0}
014var {v_y} value {80}
015loop.begin
016  var {v_i} add number {1}
017  var {v_y} add number {20}
018  var {ip} copy var {v_ip~v_i~}
019  var {v_time} value datetime
020  
021  screen.text at point {10} {~v_y~} string {~v_i~}
022  screen.text at point {50} {~v_y~} string {~ip~}
023  screen.text at point {400} {~v_y~} string {~v_time~}
024  arp.get var {arp_ip} ip {~ip~}
025  
026  screen.text at point {200} {~v_y~} string {~arp_ip~}
027  if.var {v_i} >= {3}
028    loop.exit
029  if.end
030loop.end
031run.end

  脚本执行画面如下:


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第11章、excel


  Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。Excel成为最流行的个人计算机数据处理软件。

  文件“C:\snmlipv6\excel\snml.xlsx”的sheet:“Sheet1”

1、excel语句分析


excel.open {C:\snmlipv6\excel\snml.xlsx} sheet {Sheet1}
打开excel文件,本示例中打开文件“C:\snmlipv6\excel\snml.xlsx”的sheet:“Sheet1”
excel.get var {excel.B} cell {B2}
读取单元格“B2”的值,保存到变量“excel.B”中
excel.cell {C2} value {00-1B-FC-9A-A4-00 }
更新单元格“C2”的值为:“00-1B-FC-9A-A4-00”
excel.close
关闭excel文件

2、示例脚本[C:\snmlipv6\excel\excel_nms1.txt]


C:\snmlipv6\excel\excel_nms1.txt
001screen.text at point {250} {30} string {11. excel Test}
002var {v_y} value {60}
003screen.text at point {50} {~v_y~} string {Write Col: C,D}
004screen.line from point {10} {75} to point {180} {75}
005screen.text at point {220} {~v_y~} string {Read Col: IP}
006screen.line from point {200} {75} to point {340} {75}
007screen.text at point {350} {~v_y~} string {Read Col: MAC}
008screen.line from point {350} {75} to point {630} {75}
009excel.open {C:\snmlipv6\excel\snml.xlsx} sheet {Sheet1}
010var {v_time} value datetime
011var {v_i} value {1}
012loop.begin
013  var {v_i} add number {1}
014  var {v_y} add number {18}
015  if.var {v_y} > {400}
016    loop.exit
017  if.end
018  var {v_time} value datetime
019  screen.text at point {10} {~v_y~} string {~v_i~}
020  screen.text at point {50} {~v_y~} string {~v_time~}
021  excel.cell {D~v_i~} value {[~v_time~]}
022  excel.get var {excel.B} cell {B~v_i~}
023  screen.text at point {200} {~v_y~} string {~excel.B~}
024  arp.get var {arp_ip_mac} ip {~excel.B~}
025  excel.cell {C~v_i~} value {~arp_ip_mac~}
026  excel.get var {excel.C} cell {C~v_i~}
027  screen.text at point {350} {~v_y~} string {~excel.C~}
028  
029loop.end
030excel.close
031run.end

  脚本执行画面如下:

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第12章、smtp(e-mail)


  电子邮件(e-mail)是最流行的应用,简单邮件传送协议 SMTP (Simple Mail Transfer Protocol)用于发送电子邮件。在snml语言中,可用email来自动发送告警邮件、设备配置参数等。

1、 smtp语句分析

smtp.server {smtp.163.com} port {25} username {122@163.com} password {123456}
设置smtp邮件服务器的参数,服务器域名“smtp.163.com”,端口号“25”,登录邮箱名“122@163.com”,邮箱密码“123456”

smtp.subject {发送邮件测试} body {邮件正文}
填写邮件的标题和正文的值,在本示例中标题为“发送邮件测试”,正文为“邮件正文”

smtp.add attachment {C:\snmlipv6\excel\snml.xlsx}
邮件添加附件“C:\snmlipv6\excel\snml.xlsx”

smtp.send to {123@126.com}
发送邮件到邮件接受者邮箱“123@126.com”

2、示例脚本[C:\snmlipv6\smtp\smtp_nms1.txt]

C:\snmlipv6\smtp\smtp_nms1.txt
001screen.text at point {250} {30} string {12. smtp Test: Send Mail}
002
003var {v_time} value datetime
004var {v_y} value {60}
005
006
007screen.text at point {10} {~v_y~} string {sina, Begin To Send A Mail: ~v_time~}
008
009smtp.server {smtp.sina.com} port {25} username {xxxaaaaabbb@sina.com} password {myPassword}
010smtp.subject {Test Send A Mail:~v_time~} body {Email Body%0a, Send Time: ~v_time~}
011smtp.add attachment {C:\snmlipv6\excel\snml.xlsx}
012smtp.add attachment {C:\snmlipv6\text\text99.txt}
013run.set loglevel {debug}
014smtp.send to {myEmail@163.com}
015run.set loglevel {nolog}
016screen.text at point {300} {~v_y~} string {Send Mail End.}
017
018
019var {v_time} value datetime
020var {v_y} add number {20}
021
022screen.text at point {10} {~v_y~} string {126, Begin To Send A Mail: ~v_time~}
023
024smtp.server {smtp.126.com} port {25} username {myEamil@126.com} password {myPassword}
025smtp.subject {Test Send A Mail:~v_time~} body {Email Body%0a, Send Time: ~v_time~}
026smtp.add attachment {C:\snmlipv6\excel\snml.xlsx}
027smtp.add attachment {C:\snmlipv6\text\text99.txt}
028run.set loglevel {debug}
029smtp.send to {ladybird_snml@protonmail.com}
030run.set loglevel {nolog}
031screen.text at point {300} {~v_y~} string {Send Mail End.}
032
033
034var {v_time} value datetime
035var {v_y} add number {20}
036screen.text at point {10} {~v_y~} string {163,Begin To Send A Mail: ~v_time~}
037
038smtp.server {smtp.163.com} port {25} username {myEmail@163.com} password {myPassword}
039smtp.subject {Test Send A Mail:~v_time~} body {Email Body%0a, Send Time: ~v_time~}
040smtp.add attachment {C:\snmlipv6\excel\snml.xlsx}
041smtp.add attachment {C:\snmlipv6\text\text99.txt}
042run.set loglevel {debug}
043smtp.send to {xxxaaaaabbb@126.com}
044run.set loglevel {nolog}
045screen.text at point {300} {~v_y~} string {Send Mail End.}
046
047run.end

  脚本执行画面如下:


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第13章、tcp


  TCP/IP起源于60年代末美国政府资助的一个分组交换网络研究项目,它成为被称作“全球互联网”或“因特网 ( Internet )”的基础。很多不同的厂家生产各种型号的计算机、网络设备,它们运行完全不同的操作系统,但 TCP/IP协议族允许它们互相进行通信。

1、 tcp语句分析

tcp.connect ip {192.168.1.2} port {65501}
Tcp客户端连接到服务器“192.168.1.2”的端口“65501”,又称为socket连接
变量tcp.status=[ESTABLISHED],表示连接成功

tcp.connect ip {FE80::1} port {65501}
Tcp客户端连接到服务器ipv6地址“FE80::1”的端口“65501”,又称为socket连接
变量tcp.status=[ESTABLISHED],表示连接成功
tcp.send {hello,string}
tcp发送字符串“hello,string”

tcp.send text
tcp发送文本选中区域内容

tcp.recv {server_begin:}
tcp接收指定字符串“server_begin:”

tcp.recv expect {server_end.}
tcp接收数据,一直到接收到指定字符串“server_end.”

tcp.recv for {20} bytes
tcp接收指定长度数据,本示例长度为20字节

tcp.recv for {5} seconds
tcp接收数据,一直接收5秒钟

tcp.close
tcp断开连接
变量tcp.status=[CLOSED]

2、示例脚本[C:\snmlipv6\tcp\tcp_client_ipv4.txt]

C:\snmlipv6\tcp\tcp_client_ipv4.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {13.1 tcp.client (ipv4) Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No. Time Server IP:Port}
005screen.text at point {250} {~v_y~} string {tcp.recv text.bytes}
006screen.line from point {10} {75} to point {460} {75}
007
008var {v_time} value datetime
009var {v_i} value {0}
010
011
012loop.begin
013  
014  var {v_i} add number {1}
015  var {v_y} add number {18}
016  var {v_time} value datetime
017  
018  var {server_port} value number {50000+~v_i~}
019  screen.text at point {10} {~v_y~} string {~v_i~, ~v_time~ 127.0.0.1:~server_port~}
020  run.nms {C:\snmlipv6\tcp\tcp_server_ipv4.nms ~server_port~}
021  tcp.connect ip {127.0.0.1} port {~server_port~}
022  tcp.send {tcp.client:~v_time~}
023  tcp.send {%0d%0a04}
024  tcp.send {client.end%0d%0a}
025  tcp.recv expect {server.end}
026  tcp.close
027  
028  screen.text at point {250} {~v_y~} string {~text.bytes~}
029  if.var {v_y} > {400}
030    loop.exit
031  if.end
032  
033loop.end
034
035run.end

备注:run.nms {C:\snmlipv6\tcp\tcp_server_ipv4.nms ~server_port~} ,为无界面后台执行脚本语句,详见run章节。
C:\snmlipv6\tcp\tcp_server_ipv4.nms
001
002screen.text at point {150} {30} string {13.2 tcp.server Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No.}
005screen.text at point {50} {~v_y~} string {tcp.server}
006screen.line from point {10} {75} to point {160} {75}
007screen.text at point {200} {~v_y~} string {tcp.send}
008screen.line from point {180} {75} to point {270} {75}
009screen.text at point {300} {~v_y~} string {tcp.recv}
010screen.line from point {300} {75} to point {630} {75}
011
012var {v_time} value datetime
013var {v_i} value {0}
014#run.set loglevel {debug}
015tcp.server listen port {~run.arg.4~}
016
017var {v_i} add number {1}
018var {v_y} add number {18}
019
020var {v_time} value datetime
021
022text.headpointer move to tail
023text.tailpointer move to tail
024tcp.recv {tcp.client:}
025tcp.recv for {3} bytes
026tcp.recv expect {client.end}
027tcp.recv for {3} seconds
028text.tailpointer move to tail
029
030tcp.send {tcp.server:~run.arg.4~,~v_i~[~v_time~]%0d%0a}
031tcp.send text
032tcp.send {%0d%0aserver.end%0d%0a}
033
034screen.text at point {10} {~v_y~} string {~v_i~}
035screen.text at point {50} {~v_y~} string { recv: ~tcp.client.ip~:~tcp.client.port~}
036screen.text at point {280} {~v_y~} string { send: tcp.server:~run.arg.4~}
037
038tcp.close
039run.end

  脚本执行画面如下:

3、示例脚本[C:\snmlipv6\tcp\tcp_client_ipv6.txt]

C:\snmlipv6\tcp\tcp_client_ipv6.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {13.3 tcp.client (ipv6) Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No. Time Server IP:Port}
005screen.text at point {250} {~v_y~} string {tcp.recv text.bytes}
006screen.line from point {10} {75} to point {460} {75}
007
008var {v_time} value datetime
009var {v_i} value {0}
010
011
012loop.begin
013  
014  var {v_i} add number {1}
015  var {v_y} add number {18}
016  var {v_time} value datetime
017  
018  var {server_port} value number {50000+~v_i~}
019  screen.text at point {10} {~v_y~} string {~v_i~, ~v_time~ [::1]:~server_port~}
020  run.nms {C:\snmlipv6\tcp\tcp_server_ipv6.nms ~server_port~}
021  tcp.connect ip {::1} port {~server_port~}
022  tcp.send {tcp.client:~v_time~}
023  tcp.send {%0d%0a04}
024  tcp.send {client.end%0d%0a}
025  tcp.recv expect {server.end}
026  tcp.close
027  
028  screen.text at point {250} {~v_y~} string {~text.bytes~}
029  if.var {v_y} > {400}
030    loop.exit
031  if.end
032  
033loop.end
034
035run.end

备注:run.nms {C:\snmlipv6\tcp\tcp_server_ipv6.nms ~server_port~} ,为无界面后台执行脚本语句,详见run章节。

C:\snmlipv6\tcp\tcp_server_ipv6.nms
001
002screen.text at point {150} {30} string {13.4 tcp.server (ipv4&ipv6)Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No.}
005screen.text at point {50} {~v_y~} string {tcp.server}
006screen.line from point {10} {75} to point {160} {75}
007screen.text at point {200} {~v_y~} string {tcp.send}
008screen.line from point {180} {75} to point {270} {75}
009screen.text at point {300} {~v_y~} string {tcp.recv}
010screen.line from point {300} {75} to point {630} {75}
011
012var {v_time} value datetime
013var {v_i} value {0}
014#run.set loglevel {debug}
015tcp.server listen port {~run.arg.4~}
016
017var {v_i} add number {1}
018var {v_y} add number {18}
019
020var {v_time} value datetime
021
022text.headpointer move to tail
023text.tailpointer move to tail
024tcp.recv {tcp.client:}
025tcp.recv for {3} bytes
026tcp.recv expect {client.end}
027tcp.recv for {3} seconds
028text.tailpointer move to tail
029
030tcp.send {tcp.server:~run.arg.4~,~v_i~[~v_time~]%0d%0a}
031tcp.send text
032tcp.send {%0d%0aserver.end%0d%0a}
033
034screen.text at point {10} {~v_y~} string {~v_i~}
035screen.text at point {50} {~v_y~} string { recv: ~tcp.client.ip~:~tcp.client.port~}
036screen.text at point {280} {~v_y~} string { send: tcp.server:~run.arg.4~}
037
038tcp.close
039run.end
  脚本执行画面如下:

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第14章、udp


  UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。常用的UDP端口号有:53(DNS)、69(TFTP)、161(SNMP)。

1、 udp语句分析

udp.server listen port {50002}
udp服务端,侦听端口“50002”,又称socket服务

udp.client connect ip {192.168.1.2} port {65501}

udp客户端设置服务器参数,ipv4地址为“192.168.1.2”,端口“65501”,又称为socket连接
变量udp.client.localport=[55513],表示本地端口号
udp.server.ip=[192.168.1.2]
udp.server.port=[65501]

udp.client connect ip {::1} port {65501}
udp客户端设置服务器参数,ipv6地址为“::1”,端口“65501”,又称为socket连接

udp.send {hello,string}
udp发送字符串“hello,string”

udp.send text
udp发送文本选中区域内容

udp.recv {2} packets
udp接收两个数据包

udp.recv {5} seconds
udp接收数据5秒钟

udp.close
udp关闭socket

2、 示例脚本[C:\snmlipv6\udp\udp_ipv4.txt]

C:\snmlipv6\tcp\tcp_client_ipv4.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {13.1 tcp.client (ipv4) Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No. Time Server IP:Port}
005screen.text at point {250} {~v_y~} string {tcp.recv text.bytes}
006screen.line from point {10} {75} to point {460} {75}
007
008var {v_time} value datetime
009var {v_i} value {0}
010
011
012loop.begin
013  
014  var {v_i} add number {1}
015  var {v_y} add number {18}
016  var {v_time} value datetime
017  
018  var {server_port} value number {50000+~v_i~}
019  screen.text at point {10} {~v_y~} string {~v_i~, ~v_time~ 127.0.0.1:~server_port~}
020  run.nms {C:\snmlipv6\tcp\tcp_server_ipv4.nms ~server_port~}
021  tcp.connect ip {127.0.0.1} port {~server_port~}
022  tcp.send {tcp.client:~v_time~}
023  tcp.send {%0d%0a04}
024  tcp.send {client.end%0d%0a}
025  tcp.recv expect {server.end}
026  tcp.close
027  
028  screen.text at point {250} {~v_y~} string {~text.bytes~}
029  if.var {v_y} > {400}
030    loop.exit
031  if.end
032  
033loop.end
034
035run.end

备注:run.nms {C:\snmlipv6\udp\udp_server_ipv4_ipv6.nms ~server_port~} ,为无界面后台执行脚本语句,详见run章节。
C:\snmlipv6\udp\udp_server_ipv4_ipv6.nms
001
002screen.text at point {150} {30} string {13.2 udp.server ( ipv4 & ipv6 ) Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No.}
005screen.text at point {50} {~v_y~} string {udp.server}
006screen.line from point {10} {75} to point {160} {75}
007screen.text at point {200} {~v_y~} string {udp.send}
008screen.line from point {180} {75} to point {270} {75}
009screen.text at point {300} {~v_y~} string {udp.recv}
010screen.line from point {300} {75} to point {630} {75}
011
012var {v_time} value datetime
013var {v_i} value {0}
014#run.set loglevel {debug}
015udp.server listen port {~run.arg.4~}
016
017var {v_i} add number {1}
018var {v_y} add number {18}
019
020var {v_time} value datetime
021
022text.headpointer move to tail
023text.tailpointer move to tail
024udp.recv {1} packets
025udp.recv {1} seconds
026text.tailpointer move to tail
027
028udp.send {udp.server:~run.arg.4~,~v_i~[~v_time~]%0d%0a}
029udp.send text
030udp.send {%0d%0aserver.end%0d%0a}
031
032screen.text at point {10} {~v_y~} string {~v_i~}
033screen.text at point {50} {~v_y~} string { recv: ~udp.client.ip~:~udp.client.port~}
034screen.text at point {280} {~v_y~} string { send: udp.server:~run.arg.4~}
035
036udp.close
037run.end

  脚本执行画面如下:

3、 示例脚本[C:\snmlipv6\udp\udp_ipv6.txt]

C:\snmlipv6\udp\udp_ipv6.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {14.3 udp.client (ipv6) Test}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {No. Time Server IP:Port}
005screen.text at point {250} {~v_y~} string {udp.recv text.bytes}
006screen.line from point {10} {75} to point {460} {75}
007
008var {v_time} value datetime
009var {v_i} value {0}
010
011
012loop.begin
013  
014  var {v_i} add number {1}
015  var {v_y} add number {18}
016  var {v_time} value datetime
017  
018  var {server_port} value number {50000+~v_i~}
019  screen.text at point {10} {~v_y~} string {~v_i~, ~v_time~ [::1]:~server_port~}
020  run.nms {C:\snmlipv6\udp\udp_server_ipv4_ipv6.nms ~server_port~}
021  run.set loglevel {debug}
022  udp.client connect ip {::1} port {~server_port~}
023  udp.send {udp.client:~v_time~}
024  udp.send {%0d%0a04}
025  udp.send {client.end%0d%0a}
026  udp.recv {1} packets
027  udp.recv {2} seconds
028  udp.close
029  
030  screen.text at point {250} {~v_y~} string {~text.bytes~}
031  if.var {v_y} > {400}
032    loop.exit
033  if.end
034  
035loop.end
036
037run.end
  脚本执行画面如下:


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第15章、ssh


  SSH 为 Secure Shell 的缩写,可以代替Telnet的安全协议。telnet是不安全的,在网络上用明文传送口令和数据,安全验证方式容易受到“中间人”(man-in-the-middle)的攻击。

1、ssh语句分析


ssh.connect ip {192.168.186.132} port {22} username {cisco} password {cisco}
登录远程设备,设备的IPV4地址为:192.168.186.132,服务端口号为:22,用户名“cisco”密码“cisco”
ssh.connect ip {FE80::1} port {22} username {cisco} password {cisco}
登录远程设备,设备的IPV6 地址为:[FE80::1],服务端口号为:22,用户名“cisco”密码“cisco”

ssh.set onrecv {-More-} send { %0a}
设置ssh自动输入选项,当接收到“-More-”时,自动发送一个空格和换行符

ssh.recv expect {Version}
接收服务器发送的文本,一直接收到指定字符串“Version”

ssh.recv for {3} seconds
接收3秒钟内服务器发送的文本,当服务器发送的文本中含有“-More-”时,自动发送一个空格和换行符

ssh.send {show version%0a}
发送字符串“show version”命令和换行键。

ssh.send text
发送选中的文本区域

ssh.close
关闭ssh连接。

2、示例脚本[C:\snmlipv6\ssh\ssh_ipv4.txt]

C:\snmlipv6\ssh\ssh_ipv4.txt
001screen.text at point {150} {30} string {15. ssh (ipv4) Test, (use ssh you need to get ssh.key License File)}
002var {v_y} value {60}
003screen.text at point {10} {~v_y~} string {No. server ip:port send command recv }
004
005screen.line from point {10} {75} to point {30} {75}
006screen.line from point {50} {75} to point {270} {75}
007screen.line from point {300} {75} to point {630} {75}
008
009screen.text at point {10} {425} string {1. run ssh_req.bat 2. send email with file ssh_req.txt%0d%0a}
010screen.text at point {10} {450} string {email1: ladybird_snml@protonmail.com, email2: ladybird_snml@hotmail.com%0d%0a}
011
012var {v_time} value datetime
013var {v_i} value {0}
014run.set loglevel {debug}
015loop.begin
016  
017  var {v_i} add number {1}
018  var {v_y} add number {18}
019  
020  ssh.connect ip {192.168.186.132} port {22} username {cisco} password {cisco}
021  ssh.set onrecv {-More-} send { %0a}
022  ssh.recv for {3} seconds
023  ssh.send {show version%0a}
024  ssh.recv expect {Version}
025  ssh.recv for {3} seconds
026  ssh.close
027  text.headpointer move to head
028  text.tailpointer move to tail
029  text.save append to file {C:\snmlipv6\ssh\ssh_out_ipv4~v_i~.txt}
030  screen.text at point {10} {~v_y~} string {~v_i~}
031  screen.text at point {50} {~v_y~} string {192.168.186.132:22 send 'show version'}
032  screen.text at point {300} {~v_y~} string {ssh.recv : ~text.bytes~ Bytes }
033  text.delete from headpointer
034  
035  if.var {v_y} > {100}
036    loop.exit
037  if.end
038loop.end
039run.end

  脚本执行画面如下:

3、 示例脚本[C:\snmlipv6\ssh\sshreg_nms.txt]

C:\snmlipv6\ssh\sshreg_nms.txt
001screen.text at point {150} {30} string {15. ssh Test, Ssh needs a License. Please write email to get ssh.key file.}
002var {v_y} value {60}
003
004screen.line from point {10} {75} to point {630} {75}
005screen.line from point {10} {425} to point {630} {425}
006
007
008screen.text at point {10} {80} string {1. run ssh_req.bat 2. send email with file ssh_req.txt%0d%0a}
009screen.text at point {10} {100} string {email1: ladybird_snml@protonmail.com, email2: ladybird_snml@hotmail.com%0d%0a}
010
011var {v_time} value datetime
012var {v_i} value {0}
013
014text.add {run.version=[~run.version~]%0d%0a}
015text.add {run.arg.1=[~run.arg.1~]%0d%0a}
016text.add {v_time=[~v_time~]%0d%0a}
017
018text.add {os.type=[~os.type~]%0d%0a}
019text.add {os.version=[~os.version~]%0d%0a}
020
021text.add {nic.ip=[~nic.ip~]%0d%0a}
022text.add {nic.description=[~nic.description~]%0d%0a}
023text.add {nic.mac=[~nic.mac~]%0d%0a}
024
025text.add {1. run ssh_req.bat 2. send email with file ssh_req.txt%0d%0a}
026text.add {email1: ladybird_snml@protonmail.com, email2: ladybird_snml@hotmail.com%0d%0a}
027
028text.headpointer move to head
029text.tailpointer move to tail
030text.save append to file {C:\snmlipv6\ssh\ssh_req.txt}
031
032screen.text at point {120} {180} string { File C:\snmlipv6\ssh\ssh_req.txt created ok!, total ~text.bytes~ bytes.}
033run.end

  脚本执行画面如下:

4、示例脚本[C:\snmlipv6\ssh\ssh_ipv6.txt]

C:\snmlipv6\ssh\ssh_ipv6.txt
001screen.text at point {150} {30} string {15.3 ssh (ipv6) Test, (use ssh you need to get ssh.key License File)}
002var {v_y} value {60}
003screen.text at point {10} {~v_y~} string {No. server ip:port send command recv }
004
005screen.line from point {10} {75} to point {30} {75}
006screen.line from point {50} {75} to point {270} {75}
007screen.line from point {300} {75} to point {630} {75}
008
009screen.text at point {10} {425} string {1. run ssh_req.bat 2. send email with file ssh_req.txt%0d%0a}
010screen.text at point {10} {450} string {email1: ladybird_snml@protonmail.com, email2: ladybird_snml@hotmail.com%0d%0a}
011
012var {v_time} value datetime
013var {v_i} value {0}
014run.set loglevel {debug}
015loop.begin
016  
017  var {v_i} add number {1}
018  var {v_y} add number {18}
019  
020  ssh.connect ip {FE80::1} port {22} username {cisco} password {cisco}
021  ssh.set onrecv {-More-} send { %0a}
022  ssh.recv for {3} seconds
023  ssh.send {show version%0a}
024  ssh.recv expect {Version}
025  ssh.recv for {3} seconds
026  ssh.close
027  text.headpointer move to head
028  text.tailpointer move to tail
029  text.save append to file {C:\snmlipv6\ssh\ssh_out_ipv4~v_i~.txt}
030  screen.text at point {10} {~v_y~} string {~v_i~}
031  screen.text at point {50} {~v_y~} string {[FE80::1]:22 send 'show version'}
032  screen.text at point {300} {~v_y~} string {ssh.recv : ~text.bytes~ Bytes }
033  text.delete from headpointer
034  
035  if.var {v_y} > {100}
036    loop.exit
037  if.end
038loop.end
039run.end

  脚本执行画面如下:



目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第16章、web


  web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP协议的一种网络服务,部分网络设备支持基于web的远程管理。

1、web语句分析

web.open {https://github.com/snml2019/snml/blob/master/snmlVer.txt}
web.get
以上两条语句用get方式获取web文件https://github.com/snml2019/snml/blob/master/snmlVer.txt,写入文本区

web.add header {myhead} value {myval1}
web.add var {login}
web.post
post方式可以提交web请求,可以添加变量

web.close
关闭web请求

2、示例脚本[C:\snmlipv6\web\web_nms1.txt]

C:\snmlipv6\web\web_nms1.txt
001screen.text at point {150} {30} string {16. Web Test}
002
003screen.text at point {10} {55} string {No.}
004screen.text at point {100} {55} string {github,snml2019.eu5.org web demo}
005screen.line from point {10} {75} to point {630} {75}
006var {i} value {0}
007var {x} value {0}
008var {y} value {0}
009
010var {i} add number {1}
011var {t1} value datetime
012var {y} value number {70+28*~i~}
013screen.text at point {5} {~y~} string {1. http://snml2019.eu5.org/index1.php}
014var {i} add number {1}
015var {t1} value datetime
016var {y} value number {70+28*~i~}
017run.set loglevel {debug}
018web.open {http://snml2019.eu5.org/index1.php}
019web.add var {nic.mac}
020web.get
021
022text.headpointer move to head
023text.tailpointer move to tail
024text.save to file {C:\snmlipv6\web\web_out_snml.eu5.txt}
025screen.text at point {80} {~y~} string {~t1~, text.bytes = ~text.bytes~ bytes.}
026
027var {i} add number {1}
028var {t1} value datetime
029var {y} value number {70+28*~i~}
030screen.text at point {5} {~y~} string {2. https://github.com/snml2019/snml/blob/master/snmlVer.txt}
031
032web.open {https://github.com/snml2019/snml/blob/master/snmlVer.txt}
033web.get
034
035text.headpointer move to head
036text.tailpointer move to tail
037text.save to file {C:\snmlipv6\web\web_out_github.txt}
038var {i} add number {1}
039var {y} value number {70+28*~i~}
040screen.text at point {80} {~y~} string {~t1~, text.bytes = ~text.bytes~ bytes.}
041
042web.close
043
044run.end

  脚本执行画面如下:


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第17章、mysql


  MySQL 是最流行的关系型数据库管理系统之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL分为社区版和商业版,体积小、速度快。

1、mysql语句分析

mysql.open ip {18.25.9.56} port {3306} user {admin} password {Dbpassword} database {snmldb2}
连接mysql数据库服务器,IP地址“18.25.9.56”,端口号“3306”,用户名“admin”,密码“Dbpassword”,打开的数据库名字“snmldb2”

mysql.exec {select count(*) as logcount from snml_log}
执行sql语句,create,select等语句

mysql.log {mysql测试:v_i=~v_i~}
日志记录语句,将在mysql服务器的表snml_log中插入记录,参数值写入log字段,同时自动写入的字段有
log_id、nms_file、nms_errors、run_pid、cur_time、run_steps、run_line、run_errors、run_seconds、run_argc、var_count、var_bytes、text_bytes、memo等

注意:需要在MySql数据库上建立表:snml_log,创建该表的SQL语句如下:
CREATE TABLE `snml_log` (
  `log_id` int(20) NOT NULL AUTO_INCREMENT,
  `nms_file` varchar(512) DEFAULT NULL,
  `nms_errors` int(11) DEFAULT NULL,
  `run_pid` int(11) DEFAULT NULL,
  `cur_time` datetime DEFAULT NULL,
  `log` varchar(1020) DEFAULT NULL,
  `run_steps` int(11) DEFAULT NULL,
  `run_line` int(11) DEFAULT NULL,
  `run_errors` int(11) DEFAULT NULL,
  `run_seconds` int(11) DEFAULT NULL,
  `run_argc` int(11) DEFAULT NULL,
  `var_count` int(11) DEFAULT NULL,
  `var_bytes` int(11) DEFAULT NULL,
  `text_bytes` int(11) DEFAULT NULL,
  `memo` varchar(512) DEFAULT NULL,
  PRIMARY KEY (`log_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  

2、示例脚本[C:\snmlipv6\mysql\mysql_utf8.txt]

C:\snmlipv6\mysql\mysql_utf8.txt
001screen.text at point {150} {30} string {17. mysql Test: mysql.open,mysql.exec,mysql.log}
002var {v_y} value {60}
003
004screen.text at point {10} {~v_y~} string {No.}
005screen.text at point {250} {~v_y~} string {Test Sql: delete, select; Test mysql.log}
006screen.line from point {10} {75} to point {50} {75}
007screen.line from point {70} {75} to point {630} {75}
008
009var {v_time} value datetime
010var {v_i} value {0}
011
012loop.begin
013  
014  var {v_i} add number {1}
015  var {v_y} add number {18}
016  
017  mysql.open ip {18.25.39.56} port {3306} user {Admin} password {Mypassword} database {snmldb2}
018  mysql.exec {delete from snml_log where 1=1}
019  mysql.log {mysql Test: v_i=~v_i~}
020  mysql.exec {select count(*) as logcount from snml_log}
021  mysql.exec {select * from snml_log}
022  
023  screen.text at point {10} {~v_y~} string {~v_i~}
024  screen.text at point {70} {~v_y~} string {mysql.errno=[~mysql.errno~], mysql.server.version=[~mysql.server.version~], mysql.rows=[~mysql.rows~], mysql.1.log=[~mysql.1.log~]}
025  
026  if.var {v_y} > {200}
027    
028    loop.exit
029  if.end
030loop.end
031run.end

  脚本执行画面如下:

变量值如下:
  33 mysql.client.version=[6.1.11]
  34 mysql.server.version=[5.7.20-log]
  35 mysql.errno=[0]
  36 mysql.error=[]
  37 mysql.rows=[1]
  38 mysql.fields=[15]
  39 mysql.1.logcount=[1]
  40 mysql.1.log_id=[4476]
  41 mysql.1.nms_file=[C:\snmlipv6\mysql\mysql_utf8.txt]
  42 mysql.1.nms_errors=[0]
  43 mysql.1.run_pid=[9132]
  44 mysql.1.cur_time=[2020-02-09 22:09:38]
  45 mysql.1.log=[mysql Test: v_i=8]
  46 mysql.1.run_steps=[138]
  47 mysql.1.run_line=[19]
  48 mysql.1.run_errors=[0]
  49 mysql.1.run_seconds=[13]
  50 mysql.1.run_argc=[3]


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第18章、sqlite


  SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,支持Windows/Linux/Unix等主流操作系统。和MySql不同,SQLite不需要安装服务器,直接在本地文件中存储数据,适合单机存储数据。

1、sqlite语句分析

sqlite.open {C:\snmlipv6\sqlite\sqlite_test.db}
sqlite打开数据库文件“C:\snmlipv6\sqlite\sqlite_test.db”,如果不存在就会自动创建数据库文件,同时创建snml_log和 snml_var表。

sqlite.log {sqlite测试: }
日志记录语句, 在表snml_log中插入记录,参数值写入log字段,同时自动写入的字段有
log_id、nms_file、nms_errors、run_pid、cur_time、run_steps、run_line、run_errors、run_seconds、run_argc、var_count、var_bytes、text_bytes、memo等

sqlite.exec {select * from snml_log}
执行sql语句,create,select等语句

sqlite.save var {v_time}
保存变量“v_time”到数据库中的 snml_var表

sqlite.load var {v_time}
从数据库的 snml_var表读取变量“v_time”

sqlite.save var name prefix {sqlite}
保存所有名字以“sqlite”开头的变量到数据库中的 snml_var表

sqlite.load var name prefix {sqlite}
从数据库中的 snml_var表读取所有名字以“sqlite”开头的变量

sqlite.close
关闭数据库

2、示例脚本[C:\snmlipv6\sqlite\sqlite_nms1.txt]

C:\snmlipv6\sqlite\sqlite_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {18. sqlite Test: sqlite.open, sqlite.exec, sqlite.save, sqlite.load}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {No.}
006screen.text at point {250} {~v_y~} string {Test Information}
007screen.line from point {10} {75} to point {50} {75}
008screen.line from point {70} {75} to point {630} {75}
009
010var {v_time} value datetime
011var {v_i} value {0}
012
013loop.begin
014  
015  var {v_i} add number {1}
016  var {v_y} add number {18}
017  screen.text at point {10} {~v_y~} string {~v_i~}
018  screen.text at point {70} {~v_y~} string {~v_time~}
019  
020  sqlite.open {C:\snmlipv6\sqlite\sqlite_test.db}
021  sqlite.exec {delete from snml_log}
022  sqlite.exec {delete from snml_var}
023  sqlite.log {sqlite Test: v_i=~v_i~}
024  sqlite.exec {select * from snml_log}
025  screen.text at point {200} {~v_y~} string {sqlite.1.log_id=[~sqlite.1.log_id~], sqlite.1.log = [~sqlite.1.log~]}
026  
027  
028  sqlite.save var {v_time}
029  sqlite.save var name prefix {sqlite}
030  sqlite.exec {select count(*) from snml_var}
031  screen.text at point {500} {~v_y~} string {sqlite.1.count(*)=[~sqlite.1.count(*)~]}
032  
033  sqlite.load var {v_time}
034  sqlite.load var name prefix {sqlite}
035  
036  sqlite.close
037  
038  
039  if.var {v_y} > {200}
040    loop.exit
041  if.end
042loop.end
043run.end

  脚本执行画面如下:

变量值如下:
  33 sqlite.version=[3.26.0]
  34 sqlite.snml_log=[1]
  35 sqlite.snml_var=[21]
  36 sqlite.rows=[1]
  37 sqlite.1.log_id=[78]
  38 sqlite.1.nms_file=[C:\snmlipv6\sqlite\sqlite_nms1.txt]
  39 sqlite.1.nms_errors=[0]
  40 sqlite.1.run_pid=[2952]
  41 sqlite.1.cur_time=[2020-02-10 20:15:18]
  42 sqlite.1.log=[sqlite Test: v_i=8]
  43 sqlite.1.run_steps=[226]
  44 sqlite.1.run_line=[23]
  45 sqlite.1.run_errors=[0]
  46 sqlite.1.run_seconds=[20]
  47 sqlite.1.run_argc=[3]
  48 sqlite.1.var_count=[52]
  49 sqlite.1.var_bytes=[1091]
  50 sqlite.1.text_bytes=[0]


目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第19章、 Run


   Run用来设置脚本执行的控制参数,例如日志级别、运行时间、错误处理模式、调用其他脚本等。

1、run语句分析

run.end
脚本执行结束,如果是后台无界面(hide模式)运行,进程退出。

run.sleep {2} seconds
脚本执行暂停2秒

run.set loglevel {debug}
  设置脚本执行时的日志级别,有debug,error,info,nolog几个级别,日志信息依次减少,nolog模式不记录日志。

run.set onerror {run.end}
  设置脚本执行时碰到执行错误怎么处理,参数“run.end”的处理方式时结束脚本执行,如果是后台无界面(hide模式)运行,进程退出。默认的处理方式是继续执行下一行。

run.set run.maxtime {33} seconds
  设置脚本执行的最长运行时间,本示例为33秒,每行执行完后检查脚本总执行时间,如果超过设置时间脚本执行结束,如果是后台无界面(hide模式)运行,进程退出。
  更新变量:run.end=[MaxRunTime]

run.set step.timeout {3} seconds
  设置后面每行脚本执行的超时时间,本示例为3秒,用于控制tcp、telnet等语句的等待时间,超时时本行脚本的执行强制结束,本行执行出错,继续执行下一行。

run.nms {C:\snmlipv6\ping\ping_ipv4.txt 192.168.1.2}
  以后台无界面(hide模式)运行脚本“C:\snmlipv6\ping\ping_ipv4.txt”,参数为“192.168.1.2”。

2、示例脚本[C:\snmlipv6\run\run_nms1.txt]

C:\snmlipv6\run\run_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {18. run Test}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {No.}
006screen.text at point {250} {~v_y~} string {Test Information}
007screen.line from point {10} {75} to point {50} {75}
008screen.line from point {70} {75} to point {630} {75}
009
010var {v_time} value datetime
011var {v_i} value {0}
012
013loop.begin
014  
015  var {v_i} add number {1}
016  var {v_y} add number {18}
017  
018  run.nms {C:\snmlipv6\ping\ping_ipv6.txt}
019  run.set run.maxtime {30} seconds
020  run.set loglevel {nolog}
021  run.set onerror {run.end}
022  run.set loglevel {debug}
023  run.set step.timeout {3} seconds
024  run.sleep {3} seconds
025  
026  screen.text at point {10} {~v_y~} string {~v_i~}
027  screen.text at point {70} {~v_y~} string {v_time=~v_time~, run.steps=~run.steps~, run.seconds=~run.seconds~, run.errors=~run.errors~, }
028  
029  if.var {v_y} > {400}
030    loop.exit
031  if.end
032loop.end
033run.end

  脚本执行画面如下:

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第20章、 sys


  sys用于执行本地的命令,访问本机的资源。

1、sys语句分析

sys.command {ping www.126.com}
sys.command {ipconfig /all}
  执行本机系统命令,本示例中“ping www.126.com”,“ipconfig /all”,执行命令显示的文本内容将写入文本区

sys.execute open {cmd}
交互式执行命令“cmd”

sys.execute send {dir c:\ %0d%0a}
交互式执行命令键入内容“dir c:\ %0d%0a”

sys.execute recv expect {可用字节}
交互式执行命令接收命令的输出文本,写入文本区,一直接收直到接收到特定字符串“可用字节”

sys.execute recv for {A4} seconds
交互式执行命令接收命令的输出文本,写入文本区,一直接收4秒钟时间。

sys.execute close
关闭交互式执行命令

2、示例脚本[C:\snmlipv6\sys\sys_nms1.txt]

C:\snmlipv6\sys\sys_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {20. sys Test}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {No.}
006screen.text at point {250} {~v_y~} string {Test Information}
007screen.line from point {10} {75} to point {50} {75}
008screen.line from point {70} {75} to point {630} {75}
009
010var {v_time} value datetime
011var {v_i} value {0}
012
013var {v_i} add number {1}
014var {v_y} add number {18}
015screen.text at point {10} {~v_y~} string {~v_i~}
016sys.command {ping www.126.com}
017screen.text at point {70} {~v_y~} string {v_time=~v_time~, sys.command(ping www.126.com), step.bytes=[~step.bytes~], text.bytes=[~text.bytes~]}
018
019var {v_i} add number {1}
020var {v_y} add number {18}
021screen.text at point {10} {~v_y~} string {~v_i~}
022sys.command {ipconfig /all}
023screen.text at point {70} {~v_y~} string {v_time=~v_time~, sys.command(ipconfig /all), step.bytes=[~step.bytes~], text.bytes=[~text.bytes~]}
024
025var {v_i} add number {1}
026var {v_y} add number {18}
027screen.text at point {10} {~v_y~} string {~v_i~}
028sys.execute open {cmd}
029sys.execute send {dir c:\ %0d%0a}
030sys.execute recv expect {snmlipv6}
031screen.text at point {70} {~v_y~} string {v_time=~v_time~, sys.execute(cmd->dir)), step.bytes=[~step.bytes~], text.bytes=[~text.bytes~]}
032sys.execute close
033
034run.end

  脚本另存为UTF8格式:

  脚本执行画面如下:

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

第21章、 macro


  如果一段脚本代码需要重复使用,就可以把这段脚本定义为一个宏,然后脚本中调用该宏即可。宏必须放置在run.end语句的后面

1、macro语句分析

macro.call {macro_test}
脚本中调用宏,本示例中宏的名字为“macro_test”

macro.begin {macro_test}
定义宏,本示例中宏的名字为“macro_test”。该语句必须放在run.end语句之后。

macro.return
宏返回语句

macro.end
宏结束语句

2、示例脚本[C:\snmlipv6\macro\macro_nms1.txt]

C:\snmlipv6\macro\macro_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {21. macro Test}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {No.}
006screen.text at point {250} {~v_y~} string {Test Information}
007screen.line from point {10} {75} to point {50} {75}
008screen.line from point {70} {75} to point {630} {75}
009
010var {v_time} value datetime
011var {v_i} value {0}
012
013loop.begin
014  
015  var {v_i} add number {1}
016  var {v_y} add number {18}
017  
018  macro.call {macro_test}
019  
020  screen.text at point {10} {~v_y~} string {~v_i~}
021  screen.text at point {70} {~v_y~} string {v_time=~v_time~}
022  
023  if.var {v_y} > {400}
024    loop.exit
025  if.end
026loop.end
027run.end
028macro.begin {macro_test}
029  
030  if.var {v_i} <= {10}
031    screen.text at point {270} {~v_y~} string {~v_i~<=10}
032    macro.return
033  if.end
034  if.var {v_i} > {12}
035    screen.text at point {270} {~v_y~} string {~v_i~>12}
036    macro.return
037  if.end
038  screen.text at point {270} {~v_y~} string {~v_i~ be 11 or 12}
039macro.end

  脚本执行画面如下:

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句

附录1、全部语句句法格式


  Display Function List,Type = 90 , Byte = 0 .
--- --- ---------------------------------------------------------------------------------------------------
  1   1 var {A2} value {A4}
  2   1 var {A2} value number {A5}
  3   1 var {A2} value datetime
  4   1 var {A2} add {A4}
  5   1 var {A2} add number {A5}
  6   1 var {A2} replace {A4} with {A6}
  7   1 var {A2} adjust length {A5} align {A7}
  8   1 var {A2} copy var {A5}
  9   1 var {A2} copy var {A5} after {A7} bytes length {A10}
 10   2 screen.set color red {A4} green {A6} blue {A8}
 11   2 screen.set mode {A3}
 12   2 screen.set font {A3} size {A5}
 13   2 screen.text at point {A4} {A5} string {A7}
 14   2 screen.line from point {A4} {A5} to point {A8} {A9}
 15   2 screen.rect from point {A4} {A5} to point {A8} {A9}
 16   2 screen.arc at point {A4} {A5} radius {A7} from {A9} to {A11}
 17   2 screen.image url {A3} from point {A6} {A7} to point {A10} {A11}
 18   2 screen.save to file {A4} from point {A7} {A8} to point {A11} {A12}
 19   2 screen.play midi {A3}
 20   2 screen.speak {A2}
 21   3 dns.get var {A3} host {A5}
 22   4 ping.ip {A2} ttl {A4} size {A6}
 23   5 arp.get var {A3} ip {A5}
 24   6 telnet.connect ip {A3} port {A5}
 25   6 telnet.recv expect {A3}
 26   6 telnet.recv for {A3} seconds
 27   6 telnet.set onrecv {A3} send {A5}
 28   6 telnet.set delay {A3} ms after per byte send
 29   6 telnet.send {A2}
 30   6 telnet.send text
 31   6 telnet.close
 32   7 text.add {A2}
 33   7 text.add from file {A4}
 34   7 text.headpointer move to head
 35   7 text.headpointer move to tail
 36   7 text.headpointer move to {A4} byte
 37   7 text.headpointer move forward {A4} bytes
 38   7 text.headpointer move forward after {A5}
 39   7 text.tailpointer move to head
 40   7 text.tailpointer move to tail
 41   7 text.tailpointer move to {A4} byte
 42   7 text.tailpointer move backward {A4} bytes
 43   7 text.tailpointer move backward before {A5}
 44   7 text.replace {A2} with {A4}
 45   7 text.save to file {A4}
 46   7 text.save append to file {A5}
 47   7 text.get var {A3} after {A5} bytes length {A8}
 48   7 text.get var {A3} between {A5} and {A7}
 49   7 text.get var {A3} after {A5} length {A7}
 50   7 text.get var {A3} word number {A6}
 51   7 text.line get all words
 52   7 text.line get all words between {A6} and {A8} separated by {A11}
 53   7 text.delete from headpointer
 54   7 text.delete from {A3} byte
 55   7 text.delete from tailpointer
 56   8 ssh.connect ip {A3} port {A5} username {A7} password {A9}
 57   8 ssh.set onrecv {A3} send {A5}
 58   8 ssh.recv expect {A3}
 59   8 ssh.recv for {A3} seconds
 60   8 ssh.send {A2}
 61   8 ssh.close
 62   9 snmp.open version {A3} ip {A5} port {A7} password {A9}
 63   9 snmp.get var {A3} oid {A5}
 64   9 snmp.getnext oid {A3}
 65  10 tcp.server listen port {A4}
 66  10 tcp.connect ip {A3} port {A5}
 67  10 dns.set ipmode {A3}
 68  10 tcp.send {A2}
 69  10 tcp.send text
 70  10 tcp.recv {A2}
 71  10 tcp.recv expect {A3}
 72  10 tcp.recv for {A3} bytes
 73  10 tcp.recv for {A3} seconds
 74  10 tcp.close
 75  11 udp.server listen port {A4}
 76  11 udp.client connect ip {A4} port {A6}
 77  11 udp.send {A2}
 78  11 udp.send text
 79  11 udp.recv {A2} packets
 80  11 udp.recv {A2} seconds
 81  11 udp.close
 82  12 if.var {A2} > {A4}
 83  12 if.var {A2} >= {A4}
 84  12 if.var {A2} < {A4}
 85  12 if.var {A2} <= {A4}
 86  12 if.var {A2} == {A4}
 87  12 if.var {A2} <> {A4}
 88  12 if.var {A2} in {A4}
 89  12 if.var {A2} not in {A5}
 90  12 if.var {A2} contain {A4}
 91  12 if.var {A2} not contain {A5}
 92  12 if.text contain {A3}
 93  12 if.text not contain {A4}
 94  12 if.end
 95  13 loop.begin
 96  13 loop.next
 97  13 loop.exit
 98  13 loop.end
 99  14 smtp.server {A2} port {A4} username {A6} password {A8}
100  14 smtp.subject {A2} body {A4}
101  14 smtp.add attachment {A3}
102  14 smtp.send to {A3}
103  15 macro.call {A2}
104  15 macro.begin {A2}
105  15 macro.return
106  15 macro.end
107  16 excel.open {A2} sheet {A4}
108  16 excel.cell {A2} value {A4}
109  16 excel.get var {A3} cell {A5}
110  16 excel.close
111  17 mysql.open ip {A3} port {A5} user {A7} password {A9} database {A11}
112  17 mysql.exec {A2}
113  17 mysql.log {A2}
114  18 sqlite.open {A2}
115  18 sqlite.exec {A2}
116  18 sqlite.log {A2}
117  18 sqlite.save var {A3}
118  18 sqlite.save var name prefix {A5}
119  18 sqlite.load var {A3}
120  18 sqlite.load var name prefix {A5}
121  18 sqlite.close
122  19 run.end
123  19 run.sleep {A2} seconds
124  19 run.set loglevel {A3}
125  19 run.set onerror {A3}
126  19 run.set run.maxtime {A3} seconds
127  19 run.set step.timeout {A3} seconds
128  19 run.nms {A2}
129  20 sys.command {A2}
130  20 sys.execute open {A3}
131  20 sys.execute send {A3}
132  20 sys.execute recv expect {A4}
133  20 sys.execute recv for {A4} seconds
134  20 sys.execute close
135  21 web.open {A2}
136  21 web.add header {A3} value {A5}
137  21 web.add var {A3}
138  21 web.get
139  21 web.post
140  21 web.close

    
  打包下载:https://ladybirdsnml.github.io/snmlipv6utf8snmptelnetsshweb/snml_utf8ipv6.zip

目录: 1、var 2、screen 3、snmp 4、telnet 5、text 6、if 7、loop 8、dns 9、ping 10、arp 11、excel 12、smtp 13、tcp 14、udp 15、ssh 16、web 17、mysql 18、sqlite 19、Run 20、sys 21、macro 附录1、全部语句