SecureCRT脚本⼀则(07
引⾔
做AP上层应⽤开发时,需要经常打包、烧写⽂件系统,通过终端仿真软件 SecureCRT 登录后⽤串⼝控制。俗话说,⼯欲善其事必先利其器,⼯具软件与⽣产⼒密切相关,值得仔细设置并熟悉之。搜到两篇不错的设置⽂章:SecureCRT 使⽤技巧,SecureCRT好⽤的设置。SecureCRT ⽀持脚本,可以实现⼀定程度上的⾃动化操作,把⼀些常⽤操作序列封装成脚本也不错,⽬前⽤的是SecureCRT 5.1
正⽂
SecureCRT 脚本的资料⽹上不多,⾃带的帮助⽂件中 ActiveX Scripting 章有简要描述,这⾥概览下
1. 最常⽤的 ActiveX script 引擎有 VBScript 和 JScript,都是微软的东东,所以 SecureCRT ⽀持这两种脚本语⾔。脚本的头部指定脚本与接⼝类型,脚本内容以 main 函数作为执⾏⼊⼝
# $language = "VBScript" 或 # $language = "JScript" 或# $language = "Python"
# $interface = "1.0"
Sub Main 或 function main() { 或 def main():
.....
End Sub } main()
======= 07-20 补充 v6.6 内容 ========
5.1 是 2006 年的⽼版本了,⽂档描述不怎么清楚。⽬前更新到
6.6 版,从功能到⽂档都有了较⼤完善。帮助⾥提到 6.6 的 Scripting 加强,包括⽀持 Python 脚本,和更多的脚本传参⽅式,如按钮和键映射。帮助⾥各内置对象的使⽤描述更清晰,⽽且还附加了若⼲实例,不错
=====
2. SecureCRT 提供了内置对象与脚本交互,这些对象封装了属性与操作,可⽤来操纵程序⾏为。其中 crt 是顶级对象,代表了 SecureCRT 进程,其属性有 ActivePrinter(打印
机),Dialog,Screen,Session(会话),Version,Window(窗⼝)这些⼆级对象,操作有 Sleep,Quit
其中,Screen 最为常⽤,可以⽤来操作屏幕的输⼊输出,但要注意的是,Screen 只代表客户区的可见部分,这部分的⼤⼩可以通过会话选项⾥的逻辑⾏、列数来设定。⽽整个会话的输出记录是回滚区,没有对应的对象;Dialog 提供了输⼊框和 MessageBox
======= v6.6 新增对象 ========
相⽐ 5.1,crt 多了些对象属性:Arguments(命令⾏参数),Clipboard(剪贴
板),FileTransfer,操作上则添加了 tab 操作(标签页属性)和加强了错误处理(处理脚本出错但继续执⾏的情况),GetScriptTab ⽐较常⽤,⽤来获得执⾏脚本所在的 tab 对象。其下的⼆级对象也加了不少属性和操作
=====
3. Screen 的属性与操作
属性:CurrentColumn,CurrentRow(当前光标所在逻辑⾏),Columns,Rows(可见区中的输出⾏数),Synchronous(同步模式,据说为了避免某些情况下的数据丢失,建议开启)。因为逻辑⾏、列数限定了可见区的⼤⼩,所以当输出满屏时, CurrentRow 和 Rows 的值其实是⼀样的,都是最⼤值,不会随着屏幕输出再改变,这种设计实在是有些 egg hurt,不知能否通过设置来解决
操作:
Clear 清掉所有输出,包括回滚与提⽰符,直接变⽩板,杯具
号外:(upRowL - err_LH)可能会<=0,执⾏出错,但这种情况很少见,就这么将就了吧
本打算通过上次的输⼊⾏和当前提⽰符之间的输出来判断执⾏是否出错,但因为 screen ache & hurt 的属性设计,难以做到。考虑到出错信息⼀般都在输出的尾部,所以这⾥就偷鸡取巧了,只取了最后两⾏做判断
======= 07-20 修正版 ========
1 #$language = "JScript"
2 #$interface = "1.0"
3
4var g_prompt = "RedBoot> "; //bootloader 提⽰符
5var g_cmdSequ = [ "ip_address -l 10.10.0.3/24 -h 10.10.0.23",
6"load -r -v -b 0x80100000 rootfs.squashfs",
7"fis create -b 0x80100000 -e 0x0 -l 0x800000 rootfs"
8 ]; //烧写命令序列
9var g_errRegx = /(error|can't)/i; // 错误信息匹配,忽略⼤⼩写
10
11var dlg = crt.Dialog;
12var screen = crt.Screen;
13
14function main()
15 {
16var curVersion = getVersion();
17if (curVersion >= 6.6) {
18 objTab = crt.GetScriptTab();
19 screen = objTab.Screen;
20 }
21 screen.Synchronous = true;
22
23return execCmds();
24 }
25/* 获取软件版本 */
26function getVersion()
27 {
28return parseFloat(crt.Version); // 6.6
29 }
30/* 获取命令输出 */
31function getCmdOutput(command, prompt)
32 {
33 screen.Send(command + '\r');
34 screen.WaitForString('\r'); // not capture the command issued
35return screen.ReadString(prompt);
36 }
37/* 执⾏命令序列 */
38function execCmds()
js脚本开发39 {
40do {
41 var cursorMV = screen.WaitForCursor(1);
43 } while (cursorMV) // 当光标不再移动
44
45for (var i=0; i<g_cmdSequ.length; ++i) {
46var retString = getCmdOutput(g_cmdSequ[i], g_prompt);
47if (retString.search(g_errRegx) > 0) {
48 dlg.MessageBox("ERROR: " + g_cmdSequ[i] + "!");
49return -1;
50 }
51 }
56
57return 0;
58 }
更新说明:这⾥使⽤ readstring 来获得完整命令输出,不再根据最后两个输出⾏来判断;为了保证执⾏脚本时没有命令正被执⾏,这⾥⽤了1秒来判断光标是否在移动,不过我还是觉得⽼版的判断⽅式更稳妥点
-----------------------------
其实 Linux 下还有 expect 命令,可以按照设定的⽅式与交互式程序进⾏“会话”,也是不错的选择。⾃动登录的⼩例⼦:
#!/usr/bin/expect -f
set timeout 30
spawn ssh -l username 192.168.1.1
expect "password:"
send "ispass\r"
interact
可参考:expect spawn、linux expect ⽤法⼩记,linux expect⾃动登录ssh,ftp
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论