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

简 介



  简单网络管理语言是一种类自然语言的脚本语言,它采用snmp、telnet、ping、dns、arp、ssh、tcp、udp、web等协议访问网络设备,内置smtp协议用于告警等邮件的发送,支持excel、mysql、sqlite等3种方式进行网管数据的存取。
  最新版本: snml8.13(ladybird)
  项目托管地址:https://github.com/snml2019/snml
  打包下载:https://snml2019.github.io/snml/snml2019.zip
  
  手机扫描二维码打开项目

  本手册编辑日期:20190701
  技术支持邮箱1:snml2019@protonmail.com
  技术支持邮箱2:snml2019@hotmail.com
  简单网络管理语言(snml)支持CLI(命令行接口)和SNMP(简单网络管理协议)两种方式自动化的进行网络设备配置和管理。CLI 是基于telnet、ssh的人机交互界面,用于设备的参数配置和状态的查看。SNMP 是基于通讯协议的管理工具,实现网络设备参数的自动化监控和远程配置。
  网络设备的配置和管理的新技术是SDN(Software Defined Netrork)。软件定义网络是2006年斯坦福大学提出的网络设备分层编程控制系统,全新的网络设备自动化配置和管理体系。
  手册最新版:https://snml2019.github.io/snml/snmldoc8.html
  
  手机扫描二维码打开最新手册

  打包下载:https://snml2019.github.io/snml/snml2019.zip

目 录



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


1)脚本内容如下:
C:\snml2019\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 {myvar3 = [~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
#screen.text语句见第二章屏幕部分。

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

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

3) 点击“Go”或“连续执行按钮”执行脚本。



目录: 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:\snml2019\tmp\snml_1.png} from point {0} {0} to point {213} {358}
在屏幕的矩形区域内显示图片,矩形区域为从坐标点(0,0)到(213,358)

screen.save to file {C:\snml2019\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:\snml2019\screen\screen_nms1.txt]

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



目录: 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:\snml2019\snmp\snmp_1.txt]

C:\snml2019\snmp\snmp_1.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.1}
003screen.text at point {20} {20} string {snmp.get 返回值: ~cisco7200~}
004snmp.getnext oid {1.3.6.1.2.1.1.3}
005screen.text at point {20} {40} string {snmp.getnext 返回oid值:~snmp.oid~ 返回值:~snmp.value~}
006run.end

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

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

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

4、示例脚本[C:\snml2019\snmp\snmp_1.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语句表示脚本执行结束。

目录: 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:\snml2019\telnet\telnet_nms1.txt],查看文本区内容

C:\snml2019\telnet\telnet_nms1.txt
001var {v_time} value datetime
002screen.text at point {10} {30} string {2、telnet测试开始,当前时间:~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
017#telnet.send {show run%0a}
018#telnet.recv for {5} seconds
019#telnet.send text
020telnet.close
021
022var {v_time} value datetime
023screen.text at point {10} {60} string {telnet测试完成,当前时间:~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个变量的值,参见下图:


目录: 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:\snml2019\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:\snml2019\tmp\text1.txt}
文本区选定内容保存到文件中,覆盖文件的原来内容

text.save append to file { c:\snml2019\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:\snml2019\text\text_nms1.txt]

C:\snml2019\text\text_nms1.txt
001
002screen.set color red {0} green {0} blue {0}
003screen.text at point {150} {30} string {16、text测试}
004var {v_y} value {60}
005screen.text at point {10} {~v_y~} string {序号}
006screen.text at point {100} {~v_y~} string {以9x9乘法表为例,演示text相关功能}
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 {第~v_y~行:}
020  #run.set loglevel {debug}
021  text.add {第~v_y~行: }
022  run.set loglevel {nolog}
023  loop.begin
024    var {v_x} add number {1}
025    var {v_time} value datetime
026    var {v_xy} value number {~v_x~*~v_y~}
027    var {v_xy} adjust length {3} align {left}
028    #run.set loglevel {debug}
029    text.add {~v_x~*~v_y~=~v_xy~ }
030    run.set loglevel {nolog}
031    var {x} value number {~v_x~*50}
032    
033    screen.text at point {~x~} {~y~} string {~v_x~*~v_y~=~v_xy~}
034    
035    if.var {v_x} >= {~v_y~}
036      #run.set loglevel {debug}
037      text.add {%0d%0a}
038      run.set loglevel {nolog}
039      loop.exit
040    if.end
041  loop.end
042  text.tailpointer move to tail
043  text.headpointer move forward after {第~v_y~行:}
044  
045  text.line get all words
046  #text.line get all words between {1} and {%0d} separated by { }
047  text.get var {word_no2} word number {2}
048  
049  if.var {v_y} >= {9}
050    loop.exit
051  if.end
052loop.end
053
054text.headpointer move to head
055text.tailpointer move to tail
056text.save to file {C:\snml2019\tmp\text99.txt}
057text.replace {*} with {x}
058text.headpointer move to head
059text.tailpointer move to tail
060text.save to file {C:\snml2019\tmp\text99x.txt}
061
062text.replace {x} with {X}
063text.headpointer move to head
064text.tailpointer move to tail
065text.save to file {C:\snml2019\tmp\text99X2.txt}
066
067text.replace {行:1X} with {.行. 1 * }
068text.headpointer move to head
069text.tailpointer move to tail
070text.save to file {C:\snml2019\tmp\text99X3.txt}
071
072text.replace {X2} with {乘以2}
073text.replace {X8} with {乘以8}
074
075text.headpointer move to head
076text.tailpointer move to tail
077text.save append to file {C:\snml2019\tmp\text99X3.txt}
078
079run.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:\snml2019\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:\snml2019\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]

2、示例脚本[C:\snml2019\ping\ping_nms1.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:\snml2019\ping\ping_nms1.txt]

C:\snml2019\ping\ping_nms1.txt
001screen.text at point {150} {30} string {9、ping测试:ttl、size、roundtrip_time、ip}
002
003var {v_ttl} value {0}
004var {v_y} value {60}
005screen.text at point {50} {~v_y~} string {发送ping请求参数}
006screen.line from point {10} {75} to point {180} {75}
007screen.text at point {350} {~v_y~} string {ping应答参数}
008screen.line from point {200} {75} to point {630} {75}
009
010#run.set loglevel {debug}
011var {v_y} value {80}
012screen.text at point {10} {~v_y~} string {目的IP地址}
013screen.text at point {110} {~v_y~} string {TTL}
014screen.text at point {150} {~v_y~} string {字节数}
015
016screen.text at point {200} {~v_y~} string {IP地址}
017screen.text at point {300} {~v_y~} string {TTL}
018screen.text at point {350} {~v_y~} string {字节数}
019screen.text at point {400} {~v_y~} string {毫秒数}
020screen.text at point {450} {~v_y~} string {ping.status}
021
022#screen.line from point {10} {100} to point {630} {100}
023
024
025#var {ip_addr} value {192.168.118.2}
026run.set loglevel {debug}
027dns.get var {ip_addr} host {mail.163.com}
028
029var {v_ttl} value {0}
030var {v_y} value {80}
031var {v_sendbytes} value {1000}
032loop.begin
033  var {v_ttl} add number {1}
034  var {v_y} add number {20}
035  run.set loglevel {debug}
036  ping.ip {~ip_addr~} ttl {~v_ttl~} size {~v_sendbytes~}
037  run.set loglevel {nolog}
038  screen.text at point {10} {~v_y~} string {~ping.dest_ip~}
039  screen.text at point {110} {~v_y~} string {~v_ttl~}
040  screen.text at point {150} {~v_y~} string {~v_sendbytes~}
041  
042  screen.text at point {200} {~v_y~} string {~ping.reply_ip~}
043  screen.text at point {300} {~v_y~} string {~ping.reply_ttl~}
044  screen.text at point {350} {~v_y~} string {~ping.reply_bytes~}
045  screen.text at point {400} {~v_y~} string {~ping.roundtrip_time_milliseconds~}
046  screen.text at point {450} {~v_y~} string {~ping.status~}
047  if.var {v_ttl} > {16}
048    loop.exit
049  if.end
050loop.end
051
052run.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:\snml2019\arp\arp_nms1.txt]中的arp语句部分。

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


C:\snml2019\arp\arp_nms1.txt
001screen.text at point {250} {30} string {1、Arp 测试}
002var {v_ttl} value {0}
003var {v_y} value {60}
004screen.text at point {50} {~v_y~} string {IP地址}
005screen.line from point {10} {75} to point {180} {75}
006screen.text at point {350} {~v_y~} string {MAC地址}
007screen.line from point {200} {75} to point {630} {75}
008
009var {v_ip1} value {10.174.38.163}
010var {v_ip2} value {10.174.38.164}
011
012var {v_i} value {0}
013var {v_y} value {80}
014loop.begin
015  var {v_i} add number {1}
016  var {v_y} add number {20}
017  var {ip} copy var {v_ip~v_i~}
018  var {v_time} value datetime
019  
020  screen.text at point {10} {~v_y~} string {~v_i~}
021  screen.text at point {50} {~v_y~} string {~ip~}
022  screen.text at point {400} {~v_y~} string {~v_time~}
023  arp.get var {arp_ip} ip {~ip~}
024  
025  screen.text at point {200} {~v_y~} string {~arp_ip~}
026  if.var {v_i} >= {2}
027    loop.exit
028  if.end
029loop.end
030run.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:\snml2019\excel\snml.xlsx”的sheet:“Sheet1”

1、excel语句分析


excel.open {C:\snml2019\excel\snml.xlsx} sheet {Sheet1}
打开excel文件,本示例中打开文件“C:\snml2019\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:\snml2019\excel\excel_nms1.txt]


C:\snml2019\excel\excel_nms1.txt
001screen.text at point {250} {30} string {11、excel 测试}
002var {v_y} value {60}
003screen.text at point {50} {~v_y~} string {写入C、D列}
004screen.line from point {10} {75} to point {180} {75}
005screen.text at point {220} {~v_y~} string {读取IP列}
006screen.line from point {200} {75} to point {340} {75}
007screen.text at point {350} {~v_y~} string {读取MAC列}
008screen.line from point {350} {75} to point {630} {75}
009excel.open {C:\snml2019\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:\snml2019\excel\snml.xlsx}
邮件添加附件“C:\snml2019\excel\snml.xlsx”

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

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

C:\snml2019\smtp\smtp_nms1.txt
001screen.text at point {250} {30} string {12、smtp:发送邮件测试}
002
003var {v_time} value datetime
004var {v_y} value {60}
005
006
007screen.text at point {10} {~v_y~} string {sina邮箱发送邮件开始:~v_time~}
008
009smtp.server {smtp.sina.com} port {25} username {xxxaaaaabbb@sina.com} password {myPassword}
010smtp.subject {发送邮件测试:~v_time~} body {邮件正文%0a,发送时间:~v_time~}
011smtp.add attachment {C:\snml2019\excel\snml.xlsx}
012smtp.add attachment {C:\snml2019\tmp\text99.txt}
013run.set loglevel {debug}
014smtp.send to {myEmail@163.com}
015run.set loglevel {nolog}
016screen.text at point {300} {~v_y~} string {发送邮件完成}
017
018
019var {v_time} value datetime
020var {v_y} add number {20}
021
022screen.text at point {10} {~v_y~} string {126邮箱发送邮件开始:~v_time~}
023
024smtp.server {smtp.126.com} port {25} username {xxxaaaaabbb@126.com} password {myPassword}
025smtp.subject {发送邮件测试:~v_time~} body {邮件正文%0a,发送时间:~v_time~}
026smtp.add attachment {C:\snml2019\excel\snml.xlsx}
027smtp.add attachment {C:\snml2019\tmp\text99.txt}
028run.set loglevel {debug}
029smtp.send to {myEmail@163.com}
030run.set loglevel {nolog}
031screen.text at point {300} {~v_y~} string {发送邮件完成}
032
033
034var {v_time} value datetime
035var {v_y} add number {20}
036screen.text at point {10} {~v_y~} string {163邮箱发送邮件开始:~v_time~}
037
038smtp.server {smtp.163.com} port {25} username {myEmail@163.com} password {myPassword}
039smtp.subject {发送邮件测试:~v_time~} body {邮件正文%0a,发送时间:~v_time~}
040smtp.add attachment {C:\snml2019\excel\snml.xlsx}
041smtp.add attachment {C:\snml2019\tmp\text99.txt}
042run.set loglevel {debug}
043smtp.send to {xxxaaaaabbb@126.com}
044run.set loglevel {nolog}
045screen.text at point {300} {~v_y~} string {发送邮件完成}
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.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:\snml2019\tcp\tcp_nms1.txt]

C:\snml2019\tcp\tcp_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {13.1、tcp.client测试}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {序号}
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~:~server_port~}
020  run.nms {C:\snml2019\tcp\tcp_server1.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:\snml2019\tcp\tcp_server1.nms ~server_port~} ,为无界面后台执行脚本语句,详见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、全部语句

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

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:\snml2019\udp\udp_nms1.txt]

C:\snml2019\udp\udp_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {14.1、udp.client测试}
003var {v_y} value {60}
004screen.text at point {10} {~v_y~} string {序号}
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~:~server_port~}
020  run.nms {C:\snml2019\udp\udp_server1.nms ~server_port~}
021  udp.client connect ip {127.0.0.1} port {~server_port~}
022  udp.send {udp.client:~v_time~}
023  udp.send {%0d%0a04}
024  udp.send {client.end%0d%0a}
025  udp.recv {1} packets
026  udp.recv {2} seconds
027  udp.close
028  
029  screen.text at point {250} {~v_y~} string {~text.bytes~}
030  if.var {v_y} > {400}
031    loop.exit
032  if.end
033  
034loop.end
035
036run.end

备注:run.nms {C:\snml2019\udp\udp_server1.nms ~server_port~} ,为无界面后台执行脚本语句,详见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、全部语句

第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}
登录远程设备,设备的IP地址为:192.168.186.132,服务端口号为: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:\snml2019\ssh\ssh_nms1.txt]

C:\snml2019\ssh\ssh_nms1.txt
001screen.text at point {150} {30} string {15、ssh测试,(ssh需要发送邮件索取授权)}
002var {v_y} value {60}
003screen.text at point {10} {~v_y~} string {序号}
004
005screen.line from point {10} {75} to point {160} {75}
006
007screen.line from point {180} {75} to point {270} {75}
008
009screen.line from point {300} {75} to point {630} {75}
010
011screen.text at point {10} {400} string {ssh需要发送邮件索取授权,邮箱1:snml2019@protonmail.com}
012screen.text at point {10} {425} string {ssh需要发送邮件索取授权,邮箱2:snml2019@hotmail.com}
013
014var {v_time} value datetime
015var {v_i} value {0}
016
017loop.begin
018  
019  var {v_i} add number {1}
020  var {v_y} add number {18}
021  
022  ssh.connect ip {192.168.186.132} port {22} username {cisco} password {cisco}
023  ssh.set onrecv {-More-} send { %0a}
024  ssh.recv for {3} seconds
025  ssh.send {show version%0a}
026  ssh.recv expect {Version}
027  ssh.recv for {3} seconds
028  ssh.close
029  text.headpointer move to head
030  text.tailpointer move to tail
031  text.save append to file {C:\snml2019\ssh\ssh_out~v_i~.txt}
032  screen.text at point {10} {~v_y~} string {~v_i~}
033  screen.text at point {50} {~v_y~} string {ssh.recv:接收到~text.bytes~字节 }
034  text.delete from headpointer
035  
036  if.var {v_y} > {400}
037    loop.exit
038  if.end
039loop.end
040run.end

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

C:\snml2019\ssh\sshreg_nms.txt
001screen.text at point {150} {30} string {15、ssh测试,(ssh需要发送邮件索取授权)}
002var {v_y} value {60}
003screen.text at point {10} {~v_y~} string {序号}
004
005screen.line from point {10} {75} to point {630} {75}
006
007screen.line from point {10} {425} to point {630} {425}
008screen.text at point {10} {435} string {ssh需要发送邮件索取授权,执行ssh_req.bat,发送ssh_req.txt索取授权}
009screen.text at point {10} {455} string {邮箱1:snml2019@protonmail.com,邮箱2:snml2019@hotmail.com}
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 {ssh需要发送邮件索取授权,执行ssh_req.bat,发送ssh_req.txt索取授权%0d%0a}
026text.add {邮箱1:snml2019@protonmail.com,邮箱2:snml2019@hotmail.com%0d%0a}
027
028text.headpointer move to head
029text.tailpointer move to tail
030text.save append to file {C:\snml2019\ssh\ssh_req.txt}
031screen.text at point {10} {80} string { 授权请求文件C:\snml2019\ssh\ssh_req.txt 已生成, ~text.bytes~字节 }
032run.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:\snml2019\web\web_nms1.txt]

C:\snml2019\web\web_nms1.txt
001screen.text at point {150} {30} string {16、web测试}
002
003screen.text at point {10} {55} string {序号}
004screen.text at point {100} {55} string {以github为例,演示web相关功能}
005screen.line from point {10} {75} to point {630} {75}
006var {i} value {0}
007var {x} value {0}
008var {y} value {0}
009
010loop.begin
011  var {i} add number {1}
012  var {t1} value datetime
013  var {y} value number {70+28*~i~}
014  screen.text at point {5} {~y~} string {第~i~行:}
015  
016  web.open {https://github.com/snml2019/snml/blob/master/snmlVer.txt}
017  web.get
018  
019  text.headpointer move to head
020  text.tailpointer move to tail
021  text.save to file {C:\snml2019\web\web_out~i~.txt}
022  
023  screen.text at point {50} {~y~} string {~t1~, text.bytes = ~text.bytes~ bytes.}
024  
025  if.var {i} >= {9}
026    loop.exit
027  if.end
028loop.end
029
030run.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等

2、示例脚本[C:\snml2019\mysql\mysql_nms1.txt]

C:\snml2019\mysql\mysql_nms1.txt
001screen.text at point {150} {30} string {17、mysql测试:mysql.open、mysql.exec、mysql.log}
002var {v_y} value {60}
003
004screen.text at point {10} {~v_y~} string {序号}
005screen.text at point {250} {~v_y~} string {测试内容}
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 {8.25.9.16} port {3306} user {snmlCmDb} password {MyCmDbpassword} database {snmlcmdb2}
018  mysql.exec {delete from snml_log where 1=1}
019  mysql.log {mysql测试: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.logcount=~mysql.1.logcount~}
025  
026  if.var {v_y} > {400}
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=[4410]
41 mysql.1.nms_file=[C:\snml2019\mysql\mysql_nms1.txt] 42 mysql.1.nms_errors=[0]
43 mysql.1.run_pid=[7744]
44 mysql.1.cur_time=[2019-06-21 09:54:27]
45 mysql.1.log=[mysql测试:v_i=15]
46 mysql.1.run_steps=[257]
47 mysql.1.run_line=[19]
48 mysql.1.run_errors=[0]
49 mysql.1.run_seconds=[20]
50 mysql.1.run_argc=[3]
51 mysql.1.var_count=[54]
52 mysql.1.var_bytes=[1094]
53 mysql.1.text_bytes=[0]
54 mysql.1.memo=[ver:2019.7.6]


目录: 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:\snml2019\sqlite\sqlite_test.db}
sqlite打开数据库文件“C:\snml2019\sqlite\sqlite_test.db”,如果不存在就会自动创建数据库文件

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”到数据库中

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

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

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

sqlite.close
关闭数据库

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

C:\snml2019\sqlite\sqlite_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {18、sqlite测试:sqlite.open、sqlite.exec、sqlite.save、sqlite.load}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {序号}
006screen.text at point {250} {~v_y~} string {测试内容}
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  sqlite.open {C:\snml2019\sqlite\sqlite_test.db}
019  sqlite.log {sqlite测试:v_i=~v_i~}
020  sqlite.exec {select * from snml_log}
021  
022  sqlite.save var {v_time}
023  sqlite.exec {select * from snml_var}
024  
025  sqlite.save var name prefix {sqlite}
026  sqlite.load var {v_time}
027  sqlite.load var name prefix {sqlite}
028  sqlite.close
029  screen.text at point {10} {~v_y~} string {~v_i~}
030  screen.text at point {70} {~v_y~} string {v_time=~v_time~}
031  
032  if.var {v_y} > {400}
033    loop.exit
034  if.end
035loop.end
036run.end

变量值如下:
52 sqlite.2.log_id=[2]
53 sqlite.2.nms_file=[C:\snml2019\sqlite\sqlite_nms1.txt] 54 sqlite.2.nms_errors=[0]
55 sqlite.2.run_pid=[1008]
56 sqlite.2.cur_time=[2019-06-21 10:14:44]
57 sqlite.2.log=[sqlite.open ......]
58 sqlite.2.run_steps=[37]
59 sqlite.2.run_line=[18]
60 sqlite.2.run_errors=[2]
61 sqlite.2.run_seconds=[4]
62 sqlite.2.run_argc=[3]
63 sqlite.2.var_count=[42]
64 sqlite.2.var_bytes=[971]
65 sqlite.2.text_bytes=[0]
66 sqlite.2.memo=[ver:2019.7.6]

目录: 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,info,error,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:\snml2019\ping\ping_nms1.txt 192.168.1.2}
  以后台无界面(hide模式)运行脚本“C:\snml2019\ping\ping_nms1.txt”,参数为“192.168.1.2”。

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

C:\snml2019\run\run_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {18、run测试}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {序号}
006screen.text at point {250} {~v_y~} string {测试内容}
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:\snml2019\ping\ping_nms1.txt}
019  run.set run.maxtime {33} 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 {2} 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:\snml2019\sys\sys_nms1.txt]

C:\snml2019\sys\sys_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {20、sys测试}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {序号}
006screen.text at point {250} {~v_y~} string {测试内容}
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  sys.command {ping www.126.com}
019  sys.command {ipconfig /all}
020  
021  sys.execute open {cmd}
022  sys.execute send {dir c:\ %0d%0a}
023  sys.execute recv until {可用字节}
024  sys.execute close
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~,text.bytes=~text.bytes~}
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、全部语句

第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:\snml2019\macro\macro_nms1.txt]

C:\snml2019\macro\macro_nms1.txt
001screen.set color red {0} green {0} blue {0}
002screen.text at point {150} {30} string {21、macro测试}
003var {v_y} value {60}
004
005screen.text at point {10} {~v_y~} string {序号}
006screen.text at point {250} {~v_y~} string {测试内容}
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 tcp.send {A2}
    68  10 tcp.send text
    69  10 tcp.recv {A2}
    70  10 tcp.recv expect {A3}
    71  10 tcp.recv for {A3} bytes
    72  10 tcp.recv for {A3} seconds
    73  10 tcp.close
    74  11 udp.server listen port {A4}
    75  11 udp.client connect ip {A4} port {A6}
    76  11 udp.send {A2}
    77  11 udp.send text
    78  11 udp.recv {A2} packets
    79  11 udp.recv {A2} seconds
    80  11 udp.close
    81  12 if.var {A2} > {A4}
    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} in {A4}
    88  12 if.var {A2} not in {A5}
    89  12 if.var {A2} contain {A4}
    90  12 if.var {A2} not contain {A5}
    91  12 if.text contain {A3}
    92  12 if.text not contain {A4}
    93  12 if.end
    94  13 loop.begin
    95  13 loop.next
    96  13 loop.exit
    97  13 loop.end
    98  14 smtp.server {A2} port {A4} username {A6} password {A8}
    99  14 smtp.subject {A2} body {A4}
    100  14 smtp.add attachment {A3}
    101  14 smtp.send to {A3}
    102  15 macro.call {A2}
    103  15 macro.begin {A2}
    104  15 macro.return
    105  15 macro.end
    106  16 excel.open {A2} sheet {A4}
    107  16 excel.cell {A2} value {A4}
    108  16 excel.get var {A3} cell {A5}
    109  16 excel.close
    110  17 mysql.open ip {A3} port {A5} user {A7} password {A9} database {A11}
    111  17 mysql.exec {A2}
    112  17 mysql.log {A2}
    113  18 sqlite.open {A2}
    114  18 sqlite.exec {A2}
    115  18 sqlite.log {A2}
    116  18 sqlite.save var {A3}
    117  18 sqlite.save var name prefix {A5}
    118  18 sqlite.load var {A3}
    119  18 sqlite.load var name prefix {A5}
    120  18 sqlite.close
    121  19 run.end
    122  19 run.sleep {A2} seconds
    123  19 run.set loglevel {A3}
    124  19 run.set onerror {A3}
    125  19 run.set run.maxtime {A3} seconds
    126  19 run.set step.timeout {A3} seconds
    127  19 run.nms {A2}
    128  20 sys.command {A2}
    129  20 sys.execute open {A3}
    130  20 sys.execute send {A3}
    131  20 sys.execute recv expect {A4}
    132  20 sys.execute recv for {A4} seconds
    133  20 sys.execute close
    134  21 web.open {A2}
    135  21 web.add header {A3} value {A5}
    136  21 web.add var {A3}
    137  21 web.get
    138  21 web.post
    139  21 web.close
    
  打包下载:https://snml2019.github.io/snml/snml2019.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、全部语句