配合secureCRT实现自动化控制简单协议的交互

发现secureCRT 从8.0版本开始,支持内建Python解释器,可以直接运行脚本来控制窗口的交互,这真是极好的自动化工具,

经过一番研究,实现下面几个demo,已备后用:

1. 获得串口的数据

# $language = "python"
# $interface = "1.0"

def main():
	# Send the unix "date" command and wait for the prompt that
	# indicating that it completed. In general we want to be in
	# synchronous mode before doing send/wait operations.
	#
	crt.Screen.Synchronous = True
	crt.Screen.Send("date\r")

	promptString = "linux$"
	crt.Screen.WaitForString(promptString)

	# When we get here the cursor should be one line below the output of
	# the 'date' command. Subtract one line and use that value to read a
	# chunk of text (1 row, 40 characters) from the screen.
	# 
	screenrow = crt.Screen.CurrentRow - 1
	result = crt.Screen.Get(screenrow, 1, screenrow, 40)

	# Get() reads a fixed size of the screen. So you may need to use a
	# regular expression function or the str.split() method to do some
	# simple parsing if necessary. Just print it out here.
	#
	crt.Dialog.MessageBox(result)
	crt.Screen.Synchronous = False

main()

2.从串口获得数据,放入excel里

# $language = "python"
# $interface = "1.0"

# This script demonstrates how Python scripting can be used to interact
# with CRT and manipulate an spreadsheet file (for reading by other
# programs such as Microsoft Excel). This script uses Python's csv library
# to create a spreadsheet, then it sends a command to a remote server
# (assuming we're already connected). It reads the output, parses it and
# writes out some of the data to the spreadsheet and saves it.  This
# script also demonstrates how the WaitForStrings function can be used to
# wait for more than one output string.
# 
import os
import csv

def main():

	crt.Screen.Synchronous = True

	# Create an Excel compatible spreadsheet
	#
	filename = os.path.join(os.environ['TEMP'], 'chart.csv')
	fileobj = open(filename, 'wb')

	worksheet = csv.writer(fileobj)

	# Send the initial command to run and wait for the first linefeed
	#
	crt.Screen.Send("cat /etc/passwd\r")
	crt.Screen.WaitForString("\n")

	# Create an array of strings to wait for.
	#
	promptStr = "linux$"
	waitStrs = [ "\n", promptStr ]

	row = 1

	while True:

		# Wait for the linefeed at the end of each line, or the shell
		# prompt that indicates we're done.
		#	
		result = crt.Screen.WaitForStrings( waitStrs )

		# We saw the prompt, we're done.
		#
		if result == 2:
			break

		# Fetch current row and read the first 40 characters from the
		# screen on that row. Note, since we read a linefeed character
		# subtract 1 from the return value of CurrentRow to read the
		# actual line.
		#
		screenrow = crt.Screen.CurrentRow - 1
		readline = crt.Screen.Get(screenrow, 1, screenrow, 40)

		# Split the line ( ":" delimited) and put some fields into Excel
		#
		items = readline.split(":")
		worksheet.writerow(items[:2])

		row = row + 1


	fileobj.close()
	crt.Screen.Synchronous = False


main()

3. 从串口读取简单的字符串

# $language = "python"
# $interface = "1.0"

# ReadString.py
# 
# Description:
#     This example script captures the output of a command (ls -l) sent to a
#     remote machine by using the Screen.ReadString() method.  The captured
#     text is then displayed in a messagebox window.
# 
# This example demonstrates:
#     - How to use the basic functionality of the Screen.ReadString()
#       method to easily capture data from a remote system.
#     - How to use the Screen.IgnoreEscape property to change the way ReadString
#       (also applies to WaitForString() and WaitForStrings()) handles
#       non-printable characters.
#       By default, ReadString() will capture all data sent from the remote
#       during the time in which ReadString is capturing data, including escape
#       sequences.  If you do not want to capture escape sequences and instead
#       only capture visible ASCII text, set the Screen.IgnoreEscape property to
#       True, as in this example.
# 
# This script example assumes the user has logged in and is sitting at a command
# prompt as the script is launched from SecureCRT's 'Script -> Run' menu.

def Main():
	# Here is where we will set the value of the string that will indicate that
	# we have reached the end of the data that we wanted capture with the
	# ReadString method.
	szPrompt = "]->"

	# Using GetScriptTab() will make this script 'tab safe' in that all of the
	# script's functionality will be carried out on the correct tab. From here
	# on out we'll use the objTab object instead of the crt object.
	objTab = crt.GetScriptTab()
	objTab.Screen.Synchronous = True

	# Instruct WaitForString and ReadString to ignore escape sequences when
	# detecting and capturing data received from the remote (this doesn't
	# affect the way the data is displayed to the screen, only how it is handled
	# by the WaitForString, WaitForStrings, and ReadString methods associated
	# with the Screen object.
	objTab.Screen.IgnoreEscape = True

	# We begin the process by sending some a command. In this example script,
	# we're simply getting a file listing from a remote UNIX system using the
	# "ls -l" command.
	szCommand = "ls -l"
	objTab.Screen.Send(szCommand + "\r\n")

	# Wait for the command and the trailing CR to be echoed back from the remote
	# before we start capturing data... Otherwise, we'll capture the command we
	# issued, as well as the results, and in this example, we only want to
	# capture the results.
	objTab.Screen.WaitForString(szCommand + "\r\n")

	# This will cause ReadString() to capture data until we see the szPrompt
	# value.
	szResult = objTab.Screen.ReadString(szPrompt)

	# Display the results in a messagebox
	crt.Dialog.MessageBox(szResult)

Main()


4.发送一条命令,并获得反馈的字符串

# $language = "python"
# $interface = "1.0"

def Main():
	szPrompt = ">"

	objTab = crt.GetScriptTab()    #生成一个当前选项卡对象,以后所有的操作都,基于在此选项卡内工作
	objTab.Screen.Synchronous = True

	objTab.Screen.IgnoreEscape = True
	sendCmd = "1"
	objTab.Screen.Send(sendCmd + "\r\n")  #发送一个命令到shell, 注意要加换行符,才可以真正发出去

	objTab.Screen.WaitForString(sendCmd + "\r\n")  #这个命令的作用是,如果下面要截取ack的文本则不包含send部分,如果注掉,则截取的text包含send部分

	szResult = objTab.Screen.ReadString(szPrompt) #截取到提示符的所有文本
	
	if '1' not in szResult:
		crt.Dialog.MessageBox('not!')
	else:
		crt.Dialog.MessageBox('yes!')
		
	# 弹出消息显示读到的信息,只适合作简单的判断,不适合做全自动脚本,因为提示框只有按下yes,才可以继续

Main()

5. 发送一串命令

#$language = "python"
#$interface = "1.0"

import os
import subprocess

LOG_DIRECTORY = os.path.join(
	os.path.expanduser('~'), 'LogOutputOfSpecificCommand')

LOG_FILE_TEMPLATE = os.path.join(
	LOG_DIRECTORY, "Command_%(NUM)s_Results.txt")

SCRIPT_TAB = crt.GetScriptTab()

COMMANDS = [
	"1",
	"2",
	"3",
	"4",
#	"sh run",
#	"",
#	"",
	]

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def main():

	if not os.path.exists(LOG_DIRECTORY):
		os.mkdir(LOG_DIRECTORY)

	if not os.path.isdir(LOG_DIRECTORY):
		crt.Dialog.MessageBox(
			"Log output directory %r is not a directory" % LOG_DIRECTORY)
		return

	if not SCRIPT_TAB.Session.Connected:
		crt.Dialog.MessageBox(
			"Not Connected.  Please connect before running this script.")
		return

	SCRIPT_TAB.Screen.IgnoreEscape = True
	SCRIPT_TAB.Screen.Synchronous = True

	while True:
		if not SCRIPT_TAB.Screen.WaitForCursor(1):
			break
	
	rowIndex = SCRIPT_TAB.Screen.CurrentRow
	colIndex = SCRIPT_TAB.Screen.CurrentColumn - 1

	prompt = SCRIPT_TAB.Screen.Get(rowIndex, 0, rowIndex, colIndex)
	prompt = prompt.strip()

	for (index, command) in enumerate(COMMANDS):
		command = command.strip()

		# Set up the log file for this specific command
		logFileName = LOG_FILE_TEMPLATE % {"NUM" : NN(index + 1, 2)}
		
		# Send the command text to the remote
		SCRIPT_TAB.Screen.Send(command + '\r')

		# Wait for the command to be echo'd back to us.
		SCRIPT_TAB.Screen.WaitForString('\r', 1)
		SCRIPT_TAB.Screen.WaitForString('\n', 1)

		result = SCRIPT_TAB.Screen.ReadString(prompt)
		result = result.strip()
		
		filep = open(logFileName, 'wb+')

		filep.write("Results of command: " + command + os.linesep)

		# Write out the results of the command to our log file
		filep.write(result + os.linesep)
		
		# Close the log file
		filep.close()

	LaunchViewer(LOG_DIRECTORY)


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def LaunchViewer(filename):
	try:
		os.startfile(filename)
	except AttributeError:
		subprocess.call(['open', filename])


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def NN(number, digitCount):
	# Normalizes a single digit number to have digitCount 0s in front of it
	format = "%0" + str(digitCount) + "d"
	return format % number 


main()

6.发送命令,读取反馈值

# $language = "python"
# $interface = "1.0"

def Main():
	szPrompt = ">"

	objTab = crt.GetScriptTab()    #生成一个当前选项卡对象,以后所有的操作都,基于在此选项卡内工作
	objTab.Screen.Synchronous = True

	objTab.Screen.IgnoreEscape = True
	sendCmd = "1"
	objTab.Screen.Send(sendCmd + "\r\n")  #发送一个命令到shell, 注意要加换行符,才可以真正发出去

	objTab.Screen.WaitForString(sendCmd + "\r\n")  #这个命令的作用是,如果下面要截取ack的文本则不包含send部分,如果注掉,则截取的text包含send部分

	szResult = objTab.Screen.ReadString(szPrompt) #截取到提示符的所有文本
	
	if '1' not in szResult:
		crt.Dialog.MessageBox('not!')
	else:
		crt.Dialog.MessageBox('yes!')
		
	# 弹出消息显示读到的信息,只适合作简单的判断,不适合做全自动脚本,因为提示框只有按下yes,才可以继续

Main()


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值