使用 Python 2.7 打开用户指定的文件以在 Telnet 会话中使用
Opening a user specified file with Python 2.7 to use in a Telnet session
我正在尝试编写一些代码,以建立与 Cisco 交换机的 Telnet 会话,并为命令使用单独的文本文件。 (交换机位于卫星的另一端 link,因此预计会有一些延迟)。
我的代码如下:
import telnetlib
import time
import sys
#Open telnet connection to devices
def open_telnet_conn(ip):
try:
#Define telnet parameters
username = 'admin'
password = 'password'
telnet_port = 23
telnet_timeout = 30
reading_timeout = 30
#Logging into device
connection = telnetlib.Telnet(ip, telnet_port, telnet_timeout)
#Waiting for the username prompt and sending the username
output = connection.read_until("Username:", reading_timeout)
connection.write(username + "\n")
time.sleep(2)
#Waiting for the password prompt and sending the password
output = connection.read_until("Password:", reading_timeout)
connection.write(password + "\n")
time.sleep(2)
#Setting terminal length for entire output - no pagination
connection.write("terminal length 0\n")
time.sleep(2)
#Entering global config mode
connection.write("\n")
connection.write("configure terminal\n")
time.sleep(2)
#Open user selected file for reading
selected_cmd_file = open(raw_input('Please enter command file name with extension: '), 'r')
#Starting from the beginning of the file
selected_cmd_file.seek(0)
#Writing each line in the file to the device
for each_line in selected_cmd_file.readlines():
connection.write(each_line + '\n')
time.sleep(2)
#Closing the file
selected_cmd_file.close()
#Test for reading command output
switch_output = connection.read_very_eager()
print switch_output
#Closing the connection
connection.close()
except IOError:
print "Input parameter error! Please check username, password and file name."
#Calling the Telnet function
open_telnet_conn('192.168.0.10')
raw_input('Press enter to exit')
sys.exit('Goodbye')
输入带扩展名的文件名后,我一直遇到 IOError。
会不会和文本文件的位置有关?目前它与应用程序位于同一文件夹中。
我正在 运行通过命令提示符在 windows 机器上安装它。
---更新 29/12/17---
所以我设法让 python 读取文本文件,(我不得不更改它所在的目录)。但是现在,一旦脚本 运行s 来自文本文档 (show 运行ning-config) 的命令,它似乎并没有按需要收集输出。
这是我从 Python 终端获得的输出:
- 请输入带扩展名的命令文件名:telnetcommands.txt
- SW-SM-01#终端长度0
- SW-SM-01#
- SW-SM-01#配置终端
- 输入配置命令,每行一个。以 CNTL/Z.
结尾
- SW-SM-01(配置)#end
- SW-SM-01#
- SW-SM-01#!
- SW-SM-01#
- SW-SM-01#show 运行
- 按回车键退出
我正在尝试让它打印出 运行ning 配置。
感谢您提供的任何帮助。
乔
你能显示 telnetcommands.txt
文件的内容吗?如果它只包含一个命令 show running-config
,如果您在 telnet 会话中手动输入这些命令,您能否确认它们是否按预期工作?
configure terminal
show running-config
因为某些开关可能不允许 show running-config
在配置模式下。
更新:
看来您只需要使用 expect()
函数即可。
而不是:
for each_line in selected_cmd_file.readlines():
connection.write(each_line + '\n')
time.sleep(2)
尝试使用:
connection.read_very_eager() # discard previous output
for each_line in selected_cmd_file.readlines():
connection.write(each_line.rstrip() + '\n') # rstrip() for consistency
index, match, text = connection.expect(['#'],30)
time.sleep(1) # wait for some extra output just in case
print text + connection.read_very_eager()
在此之后,以下几行应该是不必要的:
switch_output = connection.read_very_eager()
print switch_output
我正在尝试编写一些代码,以建立与 Cisco 交换机的 Telnet 会话,并为命令使用单独的文本文件。 (交换机位于卫星的另一端 link,因此预计会有一些延迟)。
我的代码如下:
import telnetlib
import time
import sys
#Open telnet connection to devices
def open_telnet_conn(ip):
try:
#Define telnet parameters
username = 'admin'
password = 'password'
telnet_port = 23
telnet_timeout = 30
reading_timeout = 30
#Logging into device
connection = telnetlib.Telnet(ip, telnet_port, telnet_timeout)
#Waiting for the username prompt and sending the username
output = connection.read_until("Username:", reading_timeout)
connection.write(username + "\n")
time.sleep(2)
#Waiting for the password prompt and sending the password
output = connection.read_until("Password:", reading_timeout)
connection.write(password + "\n")
time.sleep(2)
#Setting terminal length for entire output - no pagination
connection.write("terminal length 0\n")
time.sleep(2)
#Entering global config mode
connection.write("\n")
connection.write("configure terminal\n")
time.sleep(2)
#Open user selected file for reading
selected_cmd_file = open(raw_input('Please enter command file name with extension: '), 'r')
#Starting from the beginning of the file
selected_cmd_file.seek(0)
#Writing each line in the file to the device
for each_line in selected_cmd_file.readlines():
connection.write(each_line + '\n')
time.sleep(2)
#Closing the file
selected_cmd_file.close()
#Test for reading command output
switch_output = connection.read_very_eager()
print switch_output
#Closing the connection
connection.close()
except IOError:
print "Input parameter error! Please check username, password and file name."
#Calling the Telnet function
open_telnet_conn('192.168.0.10')
raw_input('Press enter to exit')
sys.exit('Goodbye')
输入带扩展名的文件名后,我一直遇到 IOError。
会不会和文本文件的位置有关?目前它与应用程序位于同一文件夹中。
我正在 运行通过命令提示符在 windows 机器上安装它。
---更新 29/12/17---
所以我设法让 python 读取文本文件,(我不得不更改它所在的目录)。但是现在,一旦脚本 运行s 来自文本文档 (show 运行ning-config) 的命令,它似乎并没有按需要收集输出。
这是我从 Python 终端获得的输出:
- 请输入带扩展名的命令文件名:telnetcommands.txt
- SW-SM-01#终端长度0
- SW-SM-01#
- SW-SM-01#配置终端
- 输入配置命令,每行一个。以 CNTL/Z. 结尾
- SW-SM-01(配置)#end
- SW-SM-01#
- SW-SM-01#!
- SW-SM-01#
- SW-SM-01#show 运行
- 按回车键退出
我正在尝试让它打印出 运行ning 配置。
感谢您提供的任何帮助。
乔
你能显示 telnetcommands.txt
文件的内容吗?如果它只包含一个命令 show running-config
,如果您在 telnet 会话中手动输入这些命令,您能否确认它们是否按预期工作?
configure terminal
show running-config
因为某些开关可能不允许 show running-config
在配置模式下。
更新:
看来您只需要使用 expect()
函数即可。
而不是:
for each_line in selected_cmd_file.readlines():
connection.write(each_line + '\n')
time.sleep(2)
尝试使用:
connection.read_very_eager() # discard previous output
for each_line in selected_cmd_file.readlines():
connection.write(each_line.rstrip() + '\n') # rstrip() for consistency
index, match, text = connection.expect(['#'],30)
time.sleep(1) # wait for some extra output just in case
print text + connection.read_very_eager()
在此之后,以下几行应该是不必要的:
switch_output = connection.read_very_eager()
print switch_output