2016-03-30 7 views
0

Я пишу скрипт на Python, и я использую pxssh и pexpect для выполнения этой работы, проблема в том, что я не могу успешно отправлять какие-либо команды и Я считаю, что это связано с баннером MOTD. Ниже то, что у меня есть для кода до сих пор и ниже, что баннер выглядит следующим образом:Python (pexpect и pxssh) SSH для брандмауэра Cisco ASA с MOTD Banner

import pexpect 
import getpass 
import pxssh 
import sys 

try: 

    s = pxssh.pxssh() 

    #this is for input file/lists - host, username, and password 
    hostname = ('fw1.aff.tempe') 
    username = ('tmarciniak') 
    password = ('<password>') 
    s.login(hostname, username, password, auto_prompt_reset=False) 

    s.logfile = sys.stdout 

    #s.expect('***.*') #matching the first characters of the MOTD banner for sending command 
    s.sendline('enable') # run a command  
    s.prompt() # match the prompt           
    print(s.before) 

    #s.prompt() # match the prompt 
    # s.sendline('enable') # run a command 
    #s.prompt() # match the prompt 
    print(s.before) # print everything before the prompt 
    s.logout() 
except pxssh.ExceptionPxssh as e: 
    print("pxssh failed on login.") 
    print(e) 

MOTD Баннер и выход после успешного подключения SSH:

*********************************************** 
*            * 
* This Device is owned by Telesphere Networks * 
*            * 
* Unauthorized Access is Strictly Prohibited * 
*            * 
*  Telesphere NOC: (800) 680-2203  * 
*            * 
*********************************************** 
************************************************************************ 
* 
* Name: Amerifirst Financial - Tempe (36714) 
* 
* Hostname: fw1.aff.tempe 
* 
* Location: 2151 E Broadway Rd 
*   Tempe, AZ 85282 
* 
* Notes: 
* 
************************************************************************ 
Type help or '?' for a list of available commands. 
fw1-aff-tempe> 

ответ

0

Оказывается, что pxssh получает вас мимо баннер, и вам просто нужно беспокоиться о подсказке. Для тех, интересно, я сделал следующее:

def ssh(hostname, username, password, enable_password): 
ssh_session = pxssh.pxssh(maxread=32768, searchwindowsize=1024) 

original_prompt = '%s>' % (hostname.replace('.', '-'),) #matching the first line with the prompt as exact as possible 
enable_prompt = '%s#' % (hostname.replace('.', '-'),) 
ssh_session.login(hostname, username, password, original_prompt=original_prompt, auto_prompt_reset=False) 

ssh_session.sendline('enable') # run a command 
ssh_session.expect_exact('Password:') #match the response as exact as possible 
ssh_session.sendline(enable_password) 

#print('%s#' % (hostname.replace('.','-'),)) #not sure what this part does 
ssh_session.expect_exact(enable_prompt) 

ssh_session.sendline('terminal pager 0') 
ssh_session.expect_exact(enable_prompt) 

Я входе в Cisco ASA брандмауэры, которые не принимают «» символ как разделитель в имени хоста. Я определил переменную, которая заменит «.». с «-», а затем использовал это как «expact_exact» для ожидания после отправки.

В отношении связанного примечания (к устройствам Cisco) «терминал-пейджер 0» предназначен для изменения буфера пейджера для этого конкретного сеанса до 0; который заставляет сразу выводить любой вывод.