Paramiko Expect(华为网络)
Paramiko Expect (Huawei networks)
我在 Huawei 设备上遇到了 paramiko expect 的问题,这在 cisco 上完美运行,只是为了画图.. .
我正在创建一个简单的 SSH 脚本,我希望在给出的每个命令结束时都有提示,同样,这在 cisco 上运行得很好,提示以#
,例如switch(config)#
,但是huawei设备上的提示被包裹在括号中,如[switch]
在huawei用户模式下,提示是<switch>
并且paramiko expect工作正常但是在带括号[]
的配置模式下它只是挂起并超时, 这可能是因为方括号吗? python 认为这可能是一个列表?
import paramiko
from paramiko_expect import SSHClientInteraction
from os import system
system('cls')
IP = '192.168.5.2'
UN = 'username'
PW = 'password'
baseprompt = '<RICH_USG>'
sysprompt = str('[RICH_USG]')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=IP, username=UN, password=PW)
session = SSHClientInteraction(ssh, timeout=5, display=True)
print('interactive SSH session established!')
session.expect(baseprompt)
print('DEBUG ------- Baseprompt found')
session.send('screen-length 0 temporary')
session.expect(baseprompt)
session.send('sys')
session.expect(sysprompt) # This is where the script fails and times out
output = session.current_output_clean
ssh.close()
print(output)
如有任何建议,我们将不胜感激
字符串 '[RICH_USG]'
的问题在于 expect()
会将其用作正则表达式来匹配输入,而 [...]
是一种特殊语法,仅匹配单个给定的字符,例如 R
或 I
,等等。
您需要通过使用 \
转义来删除 [
的任何特殊含义。你不需要转义 ]
,但你可以为了对称而这样做。所以你的字符串应该是'\[RICH_USG]'
。为避免意外后果,通常通过前缀 r
、r'\[RICH_USG]'
使其成为原始字符串。请注意,expect()
默认情况下会将其扩展为 r'.*\n\[RICH_USG]$'
,因此您的提示必须位于一行的开头,并且包括所有行。
使用 encoding=latin-1 问题已解决,但是
我无法使用 paramiko 验证预期值。所以我使用了ROBOT框架的SSHlibrary。
这对我来说很好
我在 Huawei 设备上遇到了 paramiko expect 的问题,这在 cisco 上完美运行,只是为了画图.. .
我正在创建一个简单的 SSH 脚本,我希望在给出的每个命令结束时都有提示,同样,这在 cisco 上运行得很好,提示以#
,例如switch(config)#
,但是huawei设备上的提示被包裹在括号中,如[switch]
在huawei用户模式下,提示是<switch>
并且paramiko expect工作正常但是在带括号[]
的配置模式下它只是挂起并超时, 这可能是因为方括号吗? python 认为这可能是一个列表?
import paramiko
from paramiko_expect import SSHClientInteraction
from os import system
system('cls')
IP = '192.168.5.2'
UN = 'username'
PW = 'password'
baseprompt = '<RICH_USG>'
sysprompt = str('[RICH_USG]')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=IP, username=UN, password=PW)
session = SSHClientInteraction(ssh, timeout=5, display=True)
print('interactive SSH session established!')
session.expect(baseprompt)
print('DEBUG ------- Baseprompt found')
session.send('screen-length 0 temporary')
session.expect(baseprompt)
session.send('sys')
session.expect(sysprompt) # This is where the script fails and times out
output = session.current_output_clean
ssh.close()
print(output)
如有任何建议,我们将不胜感激
字符串 '[RICH_USG]'
的问题在于 expect()
会将其用作正则表达式来匹配输入,而 [...]
是一种特殊语法,仅匹配单个给定的字符,例如 R
或 I
,等等。
您需要通过使用 \
转义来删除 [
的任何特殊含义。你不需要转义 ]
,但你可以为了对称而这样做。所以你的字符串应该是'\[RICH_USG]'
。为避免意外后果,通常通过前缀 r
、r'\[RICH_USG]'
使其成为原始字符串。请注意,expect()
默认情况下会将其扩展为 r'.*\n\[RICH_USG]$'
,因此您的提示必须位于一行的开头,并且包括所有行。
使用 encoding=latin-1 问题已解决,但是 我无法使用 paramiko 验证预期值。所以我使用了ROBOT框架的SSHlibrary。 这对我来说很好