2023年11月27日发(作者:)

SecureCRT⾃动化脚本

本⽂⽬录

脚本⽂件头

脚本中头两⾏(必须写在头两⾏,且最好不要有空格回车之类的字符)所必须添加的标识,这两⾏标识告诉Crt当前执⾏的脚本需要使⽤什么

解释器进⾏解释。其中language为语⾔,现⽀持Jscript、VBScript、Python、Perl,interface。

JS

# $language = "JScript"

# $interface = "1.0"

python

# $language = "python"

# $interface = "1.0"

crt的属性

Dialog

介绍

定义了⼀个Dialog(对话框),通过这个对象,可以通过调⽤该对象的⼦属性和⽅法实现对话框的相关功能。

JS

var diaObj = ;

Dialog的⽅法

FileOpenDialog

解释

定义了⼀个Dialog(对话框),通过这个对象,可以通过调⽤该对象的⼦属性和⽅法实现对话框的相关功能。

语法

([arglist])

参数

(1)title:弹窗最上⾯的标题⽂字,见运⾏结果中窗⼝最上⾯的"请选择⼀个⽂件"。

(2)buttonLabel:见下图中的"Open"按钮,即打开⽂件⽤的,⾄于名称可以使⽤"Open"或者"打开"均可。

(3)defaultFilename:默认⽂件名,如下,在弹窗的"⽂件名"中默认有""。注意:当有默认⽂件名时即使当前⽂件夹中没有该⽂件,

在点击"打开"按钮后,结果依然会返回该⽂件的当前⽬录的绝对路径。

运⾏结果

MessageBox

解释

弹出⼀个消息框,可以定义按钮,使⽤按钮和⽂本消息来实现和⽤户的简单对话。

语法

eBox(message [, title [icon|buttons]])

参数

(1)message:消息⽂字,必选参数,见运⾏结果中的消息正⽂。

(2)title:弹窗的标题描述,见运⾏结果中的标题处。

(3)icon:警⽰图标,见结果中的图1到图4。icon的取值有:16(叉号,表⽰错误),32(问号,表⽰确认),48(叹号,表⽰警告),64(提

⽰,表⽰信息提⽰)

(4)buttons:按钮类型,定义不同的类型,可以有不同的选项,同时⿏标点击不同的选项时也有不同的返回值。button取值范围为0到6,

–0:见图5,点击后返回值为1;

–1:见图6,点击’确定’时,返回1,点击’取消’时返回2;

–2:见图7,点击’终⽌’时,返回3,点击’重试’时返回4,点击’忽略’时返回5;

–3:见图8,点击’是’时,返回6,点击’否’时,返回7,点击’取消’时返回2;

–4:见图9,点击’是’时,返回6,点击’否’时,返回7;

–5:见图10,点击’重试’时,返回4,点击’取消’时返回2;

–6:见图11,点击’取消’时,返回2,点击’重试’时,返回10,点击’继续’,返回11;

运⾏结果

图7:button=2

参数

(1)message:消息⽂字,必选参数,见运⾏结果中的消息正⽂。

(2)title:弹窗的标题描述,见运⾏结果中的标题处。

(3)default:输⼊框中的默认值,如果为"",则没有默认值。

(4)isPassword:是否要隐藏输⼊的⽂字,类似于⽇常输⼊密码时显⽰****

(5)运⾏结果如下图1,如果点击’ok’,返回输⼊的字符串,否则返回""

JS

password = crt.Dialog.Prompt("这⾥是正⽂","这⾥是弹窗标题","这是默认值",true)

运⾏结果

Screen

介绍

定义Screen(屏幕)对象,该对象是整个脚本中的灵魂,包含数据抓取、数据发送、等待数据等等重要功能都是有该对象的⼦属性和⽅法实现

的。

JS

var scrObj = crt.Screen;

Screen的属性

CurrentColumn

解释

返回当前光标处的列坐标。

语法

tColumn

JS

var curCol = crt.Screen.CurrentColumn;

crt.Dialog.MessageBox(curCol);

CurrentRow

解释

返回当前光标处的⾏坐标。但这个功能有个问题就是当满屏输出后这个值⼀直表⽰最⼤值,等同于底下要讲的⼦属性四:Rows的值。

语法

tRow

JS

var curRow = crt.Screen.CurrentRow;

crt.Dialog.MessageBox(curRow);

Columns

解释

返回当前屏幕的最⼤列宽。

语法

s

JS

var cols = crt.Screen.Columns;

crt.Dialog.MessageBox(cols);

Rows

解释

返回当前屏幕的最⼤⾏宽,这个⾏宽指的是可见区的,并不是指缓冲区的⾏宽。

语法

JS

var rows = crt.Screen.Rows;

crt.Dialog.MessageBox(rows);

IgnoreEscape

解释

定义当使⽤WaitForString、WaitForStrings 和 ReadString这三个⽅法时是否获取Escape字符(也就是特殊控制字符,如"n"),默认是

会获取的。

语法

Escape [ = True | False ]

参数

true|false:当设置为true时不会获取特殊字符,为false时会获取,默认为false。

JS

# $language = "JScript"

# $interface = "1.0"

// falsectrl+c

设置,获取

crt.Screen.IgnoreEscape = false;

crt.Dialog.MessageBox(crt.Screen.ReadString("03"));

// truectrl+c

设置,不获取

crt.Screen.IgnoreEscape = true;

crt.Dialog.MessageBox(crt.Screen.ReadString("03"));

MatchIndex

解释

当使⽤WaitForStrings 和 ReadString这两个⽅法获取字符串时,会根据参数的位置获取返回值,⽽MatchIndex就是这个位置,从1开始

计算,如果没有⼀个匹配到则返回0,可以根据下⾯的例⼦来看。

语法

ndex

JS

# $language = "JScript"

# $interface = "1.0"

var outPut = crt.Screen.ReadString("error", "warning", "#", 10);

switch (crt.Screen.MatchIndex) {

case 0:

crt.Dialog.MessageBox("Timed out!")

break;

case 1:

crt.Dialog.MessageBox("Found 'error'")

break;

case 2:

crt.Dialog.MessageBox("Found 'warning'")

break;

case 3:

crt.Dialog.MessageBox("Found '#'")

break;

}

Synchronous

解释

设置屏幕的同步属性,关于该属性需要谨慎对待,若设置为false,则在脚本中使⽤WaitForString、WaitForStrings或ReadString函数时

可能存在丢失⼀部分数据的现象,⽽设置为true时不会,但是设置为true后可能会存在屏幕卡顿的情况,出现这两种现象的原因应该是和这

⼏个函数以及打印字符到Screen的机制有关系,具体内部原因不明,就具体使⽤⽽⾔,如果是跑脚本的话最好还是不要设置为true,⼤量

的卡顿看着就会蛋疼了,还可能会造成CRT卡死。

语法

onous [ = True | False ]

参数

true|false :默认为false

JS

# $language = "JScript"

# $interface = "1.0"

crt.screen.Synchronous = true;

crt.screen.Send("rn");

crt.screen.ReadString("#");

crt.screen.Send("rn");

crt.screen.WaitForString("#");

crt.screen.Send("rn");

crt.screen.WaitForStrings("#",">");

Screen的⽅法

Clear

解释

清屏功能

语法

()

JS

crt.Screen.Send("rn");

crt.Screen.Clear();

Get

解释

按照坐标取出⼀个矩形框内的屏幕上的字符(即从某⾏某列开始到其它⾏其它列),不包含字符串中的回车换⾏符,所以这个多⽤于获取⽆格

式的光标处字符串或某⼩段特定区域字符串。

语法

(row1, col1, row2, col2)

JS

var getScr = crt.Screen.Get(31,50,31,56);

crt.Dialog.MessageBox(getScr);

这段代码获取的是(31,50,31,56)这个矩阵内的字符串,即下图中红⾊框中所⽰的7483052。

Get2

解释

按照坐标取出⼀个矩形框内的屏幕上的字符(即从某⾏某列开始到其它⾏其它列),包含字符串中的回车换⾏符,所以这个多⽤于获取⼤段带

格式的字符串。

语法

2(row1, col1, row2, col2)

JS

var getScr = crt.Screen.Get2(29,1,35,20);

crt.Dialog.MessageBox(getScr);

这段代码获取的是(29,1,35,20)这个矩阵内的所有带回车换⾏的字符串,即下图中红⾊框中⽂字。

IgnoreCase

解释

使⽤全局参数设置控制在使⽤WaitForString、WaitForStrings和ReadString这三个函数时是否对⼤⼩写敏感,默认为false指⼤⼩写敏感

即⼤⼩写字符串都会检查,设置为true时则不会检测⼤⼩写。

语法

Case

请注意,语法中并没有带(),根据语法来看,这个不像是⽅法,但是在CRT的使⽤说明中标注为了⽅法⽽不是属性,且在python的脚本中

# $language = "JScript"

# $interface = "1.0"

crt.Screen.IgnoreCase = true;

crt.Screen.Send("show memoryrn");

crt.Screen.WaitForString("more");

crt.Screen.Send("rn");

crt.Screen.WaitForStrings("more","#");

crt.Screen.Send("rn");

crt.Screen.ReadString("more","#");

Send

解释

向远端设备或者向屏幕(向屏幕发送的功能是CRT7.2以后版本才提供的)发送字符串。如语法中所表⽰的,string是待发送的字符串,这个

字符串可以包含转码字符⽐如"r","n","03"(ctrl+c),当向屏幕上发送字符串时需要指定第⼆个参数为true。有了向屏幕发送字符串的功

能,我们就可以很⽅便的和⽤户进⾏交互了。可以打印出⼀些我们需要的报错信息之类的。

语法

(string, [, bSendToScreenOnly])

JS

# $language = "JScript"

# $interface = "1.0"

// "show memory"

向远程设备发送英⽂命令

crt.Screen.Send("show memoryrn");

//

向屏幕上发送字符串

crt.Screen.Send("hello,world!rn",true);

可是运⾏了这段代码后很可能会发现,底下的向屏幕发送的字符串先打印到屏幕上了,效果如下,原因是Crt发送到屏幕的字符串可能先于

远程设备返回的字符串,因此会先打印下⾯的。解决办法就是可以在发送屏幕的这⼀段前⾯加⼀个延时,这样就不会先打印下⾯的了。

SendKeys

解释

向当前窗⼝发送按键,包含组合按键,⽐如可以发送类似"CTRL+ALT+C"等这样的组合键,这样写即可:

ys("^%c");

这个功能需要语⾔本⾝⽀持,⽬前只有VBS和JS脚本可以使⽤,Python和Perl都不可以。

语法

ys(string)

JS

# $language = "JScript"

# $interface = "1.0"

crt.Screen.Clear();

crt.screen.sendkeys("mc~");

crt.Sleep(2000);

crt.screen.sendkeys("{f1}");

crt.Sleep(2000);

crt.screen.sendkeys("{esc}0");

crt.Sleep(2000);

crt.screen.sendkeys("{esc}0");

crt.Sleep(2000);

crt.screen.sendkeys("y");

具体可以有哪些按键,参照下表,修改对应参数即可,可以根据需要⾃由组合:

Key(按键)Argument(参数)

SHIFT+

CTRL^

ALT%

BACKSPACE{BACKSPACE}, {BS}, or {BKSP}

BREAK{BREAK}

CAPS LOCK{CAPSLOCK}

DEL or DELETE{DELETE} or {DEL}

DOWN ARROW{DOWN}

END{END}

ENTER{ENTER} or ~

ESC{ESC}

HELP{HELP}

HOME{HOME}

/ on number pad{NUM_/}

Key(按键)Argument(参数)

* on number pad{NUM_*}

- on number pad{NUM_-}

+ on number pad{NUM_+}

Menu Function:

Telnet:

VT functions:

语法

ecial(string)

JS

# $language = "JScript"

# $interface = "1.0"

// Crt

以下是⽂档中举的例⼦,具体还有什么我也没有试过,各位可以⾃⼰试试

crt.screen.SendSpecial("MENU_PASTE");

crt.screen.SendSpecial("TN_BREAK");

crt.screen.SendSpecial("VT_PF1");

WaitForCursor

解释

等待光标移动,当移动时返回值为true,当有超时时间参数且超时时返回false,否则会⼀直等待光标移动。利⽤这个功能可以⽤来判断⼀

个命令的输出是否结束,只不过超时时间是以秒为单位的,对于脚本当中,这个时间还是略显久了。

语法

rCursor([timeout])

# $language = "JScript"

# $interface = "1.0"

// 5

秒内光标有移动时即发送⼀个命令

while (1) {

if ( crt.Screen.WaitForCursor(5) ) {

crt.Screen.Send("show versionrn");

}

}

WaitForKey

解释

检测有键盘按键时返回true,当有超时时间参数且超时时返回false,否则会⼀直等待按键。只可惜这个函数不知道输⼊的键是什么,否则

就可以针对性的判断了,它只能检测到有输⼊⽽已。

语法

rKey([timeout])

JS

# $language = "JScript"

# $interface = "1.0"

// 5

秒内有输⼊时发送⼀个命令

while (1) {

if ( crt.Screen.WaitForKey(5) ) {

crt.Screen.Send("show versionrn");

}

}

WaitForString

解释

⼀般⽤于发送命令后等待某字符串,这个字符串只要是屏幕上出现的即可,哪怕是粘贴上去的命令也会同样被检测到,也可以⽤于等待屏幕

的输出打印,不需要先发送命令。不过⼀般我们使⽤它来检测的都是发送命令后出现的标识符。

语法

rString(string,[timeout],[bCaseInsensitive])

参数

1、string,必选参数,等待的字符串,可以是特殊字符⽐如:rn;

2、timeout,可选参数,超时时间,当检测不到对应字符串时会返回false,没有此参数时会⼀直等待;

3、bCaseInsensitive,可选参数,⼤⼩写不敏感,默认值是false,表⽰将检测字符串的⼤⼩写,当为true时不检测⼤⼩写。

JS

# $language = "JScript"

# $interface = "1.0"

// 5

发送命令,并在秒内获取到对应的字符串后发送⼀条命令

crt.Screen.Send("rn");

if ( crt.Screen.WaitForString("#",5) ) {

crt.Screen.Send("show versionrn");

}

crt.Screen.Send("rn");

if ( crt.Screen.WaitForString(">",5) ) {

crt.Screen.Send("whorn");

}

crt.Screen.Send("rn");

if ( crt.Screen.WaitForString("$",5) ) {

crt.Screen.Send("ls -lrn");

}

WaitForStrings

解释

和WaitForString是同样的功能,只不过可以等待多个字符串,如果有匹配到某个字符串,则返回值该字符串在这些字符串中的位置,位置

值从1开始。若在超时时间内没有匹配到则返回false,没有超时时间时会⼀直等待。

语法

rStrings([string1,string2..],[timeout],[bCaseInsensitive])

参数

1、string,必选参数,等待的字符串,最少有⼀个,可以是特殊字符⽐如:rn;

2、timeout,可选参数,超时时间,当检测不到对应字符串时会返回false,没有此参数时会⼀直等待;

3、bCaseInsensitive,可选参数,⼤⼩写不敏感,默认值是false,表⽰将检测字符串的⼤⼩写,当为true时不检测⼤⼩写。

JS

# $language = "JScript"

# $interface = "1.0"

var outPut = crt.Screen.WaitForStrings("error", "warning", "#", 10);

var waitIndex = crt.Screen.MatchIndex

switch (waitIndex) {

case 0:

crt.Dialog.MessageBox("Timed out!")

break;

case 1:

crt.Dialog.MessageBox("Found 'error'")

break;

case 2:

crt.Dialog.MessageBox("Found 'warning'")

break;

case 3:

crt.Dialog.MessageBox("Found '#'")

break;

}

ReadString

解释

这个功能和上⾯的WaitForStrings函数有些类似,都是等待某⼏个字符串出现,不过不同的是,ReadString函数还会读取字符串之前的所

有出现的字符,这个功能可以很⽅便的⽤于发送⼀个命令后获取这个命令的输出结果,不过这个函数也不是特别稳定,因为很可能存在命令

的输出结果很快,⽽屏幕⼜没有捕捉到时,要么会由于超时⽽返回false,要么会⼀直等待,最终返回的都是空值,因此完全依靠该函数获

取命令的输出的话并不是很把稳(如果程序对于稳定性要求很⾼的话,那么最好还是不要依赖这个函数。)

语法

ring([string1,string2..],[timeout],[bCaseInsensitive])

参数

1、string,必选参数,等待的字符串,最少有⼀个,可以是特殊字符⽐如:rn;

2、timeout,可选参数,超时时间,当检测不到对应字符串时会返回false,没有此参数时会⼀直等待;

3、bCaseInsensitive,可选参数,⼤⼩写不敏感,默认值是false,表⽰将检测字符串的⼤⼩写,当为true时不检测⼤⼩写。

JS

# $language = "JScript"

# $interface = "1.0"

//

发送命令并根据提⽰符获取命令的输出。

crt.Screen.Send("show versionrn");

crt.Screen.WaitForString("show version",2);

var outPut = crt.Screen.ReadString("error", "warning", "#", 10);

var waitIndex = crt.Screen.MatchIndex

switch (waitIndex) {

case 0:

crt.Dialog.MessageBox("Timed out!")

break;

case 1:

crt.Dialog.MessageBox("Found 'error'")

break;

case 2:

crt.Dialog.MessageBox("Found 'warning'")

break;

case 3:

crt.Dialog.MessageBox("命令的输出时:"+outPut);

break;

}

在这个举例中的第6⾏可以看到还使⽤了WaitForString,为什么要使⽤这个,有两个⽅⾯原因,⼀是确定命令已经被发送到了远端设备,

⼆是确保命令的输出结果中没有改命令,⽽仅仅是该命令的输出结果。

ScriptFullName

该对象返回当前执⾏脚本的全名,其中包含脚本路径和脚本名,可以使⽤中⽂路径和⽂件名。

JS

var scrName = crt.ScriptFullName;

Session

定义当前会话属性,该属性有许多很实⽤的属性和⽅法可以使⽤。

JS

var sessionObj = crt.Session;

Window

返回当前程序的窗⼝对象,该对象下有⼦对象,可以实现诸如隐藏当前窗⼝等的功能。

JS

var crtWin = crt.Window;

Version

返回当前Crt的软件版本,通常该属性⽤于⽐较版本新旧,以处理在不同版本上不能兼容的问题。

JS

// Crt7.3Crt

检查版本,如果低于,则退出

crtVer = crt.Version;

if ( crtVer < 7.3 ) {

crt.Quit();

}

crt的⽅法

GetActiveTab()

Crt软件的管理是多Tab的,该⽅法返回当前活跃状态的Tab界⾯,该界⾯作为⼀个新的Tab属性使⽤,⽽Tab属性本⾝⼜有许多⼦属性和⽅

法,因此该⽅法也是⽐较实⽤的⼀个函数。

JS

var actTab = crt.GetActiveTab();

python

Currenttab = iveTab()

GetScriptTab()

获取当前脚本执⾏的Tab对象,该对象有⼀些⼦对象和⽅法,通过获取Tab页⾯,可以轻松的实现在多个Tab中同时发送数据的功能。

JS

// Tab(Index1)

获取当前脚本执⾏的,并获取编号开始

var scriptTab = crt.GetScriptTab();

var tabNum = scriptTab.Index;

// Tab

在当前上发送数据

scriptTab.Screen.Send("脚本执⾏的Tab是:"+tabNum);

GetTabCount()

获取当前总Tab数⽬,是⼀个数值类型返回值。

JS

// Tab

获取总数⽬

var tabCount = crt.GetTabCount();

GetTab()

获取某个位置的Tab对象,该位置即为tab的Index,从1开始,即从当前Crt窗⼝的最左侧Tab数起。

JS

// Tab

获取指定编号的对象

var tabCount = crt.GetTabCount();

var gTab = "";

// Tab1Tab

到所有依次发送数据

for ( var i = 1 ; i <= tabCount; i++ ) {

gTab = crt.GetTab(i);

gTab.Screen.Send("当前Tab:"+i);

}

Sleep()

脚本暂停运⾏时间,millisecond:毫秒

JS

// Tab

获取指定编号的对象

var tabCount = crt.GetTabCount();

var gTab = "";

// Tab1Tab

到所有依次发送数据

for ( var i = 1 ; i <= tabCount; i++ ) {

gTab = crt.GetTab(i);

// 5

暂停秒再发送数据

crt.Sleep(5000);

gTab.Screen.Send("当前Tab:"+i);

}

python

(1000)

Quit()

退出Crt软件。(不是退出脚本,是直接退出软件。)

JS

// 如果直接使⽤的话只要有会话是激活的,那么就会有弹窗出来,因此,可以使⽤for循环,先将所有Tab断连,再退出。

// 断连所有Tab

var tabCount = Count();

var gTab = "";

for ( var i = 1 ; i <= tabCount; i++ ) {

gTab = (i);

nect();

}

// 此时可以直接退出Crt

()

例⼦1(python)

# $language = "python"

# $interface = "1.0"

#telnet

此⽅法表⽰你必须先登录⼀台服务器然后再去到另外⼀台服务器

#ip

主机的

host = '11.1.1.1'

#

主机的⽤户名

user = 'root'

#

主机的密码

passwd = 'password'

def main():

#r

向屏幕光标后发送以下⽂字内容,表⽰回车执⾏

crt.Screen.Send('telnet '+host+'r')

crt.Screen.WaitForString('login:')

crt.Screen.Send(user+"r")

crt.Screen.WaitForString('password:')

crt.Screen.Send(passwd+"r")

#

使⽤默认弹窗提⽰信息

crt.Dialog.MessageBox('登录成功!')

main()

例⼦2(JS)

# $language="JScript"

# $interface="1.0"

#主机的ip

host = '11.1.1.1'

#主机的⽤户名

user = 'root'