7

Ciscoルータにtelnetで接続し、pexpectを使用してコマンドを実行しようとしています。動作しますが、sendline()が出力で繰り返されます。setechoをFalseに使用した後でも。コードは次のとおりです。

'''
Created on Nov 19, 2012

@author: Amit Barik
'''

import pexpect

hostname = 'hostname'
login_cmd = 'telnet ' + hostname + '.net'
username = 'username'
password = 'pwd'
prompt = hostname + '#'

p = pexpect.spawn(login_cmd)
p.setecho(False)
p.logfile = open('Log.log', 'w+')

p.expect('Username:')
print '1',repr(p.before)

p.sendline(username)
p.expect('Password:')
print '2',repr(p.before)

p.sendline(password)
p.expect(prompt)
print '3',repr(p.before)

cmd = 'show clock'
p.sendline(cmd)
p.expect(prompt)
print 'Output for {0}'.format(cmd), repr(p.before)

出力は次のとおりです。

# On Python Console
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n'

# On Log File
Username: username
username
Password: pwd

My Cisco Banner

hostname#show clock
show clock
00:16:40.692 UTC Tue Nov 20 2012
hostname#
4

3 に答える 3

11

ネットワークデバイス(* nix端末ではない)と対話するときに同じ問題が発生しました。

Pexpectには、3つのロギングメソッド(1。logfile_send()、2。3 logfile_read(). logfile())があります。

上記の元のポスターからの出力例を使用すると、各ロギングメソッドの出力は次のようになります。

1.)p.logfile()ネットワークデバイスのエコー出力をログに記録し、send()&を使用して送信されたテキストをログに記録しますsendline()。これは、元のポスターが起こりたくなかったことです。

スクリプト内:

p.logfile = open('Log.log', 'w+')

出力:

# On Python Console
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n'

# On Log File
Username: username   #This is the `sendline()` output
username             #This is echo from the network device
Password: pwd        #This is `sendline()` output
                     #Notice, pwd only echo's once.  There is no echo from the network device since it doesn't echo passwords

My Cisco Banner

hostname#show clock  #This is the `sendline()` output
show clock           #This is echo from the network device
00:16:40.692 UTC Tue Nov 20 2012
hostname#

2.)p.logfile_read()ネットワークデバイスのエコー出力のみをログに記録します。p.sendline()文字は記録されません。これは、元のポスターが探していた望ましい結果です。

スクリプト内:

p.logfile_read = open('Log.log', 'w+')

出力:

# On Python Console
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n'

# On Log File
Username: username   #This is echo from the network device
Password:            #There is no echo from the network device since it doesn't echo passwords

My Cisco Banner

hostname#show clock  #This is echo from the network device
00:16:40.692 UTC Tue Nov 20 2012
hostname#

3.)文字をログにp.logfile_send送信するだけp.sendline()ですが、これはほとんどの場合あまり役に立ちません。おそらく今では誰もがその考えを持っているので、例をスキップします。

したがって、を使用logfile_read()すると、ネットワークデバイスと対話するときにログ出力に表示されるパスワードの問題が修正されます。これにより、ログ出力にダブルエコーが表示されるpexpectの問題も修正されます。これは、オンラインについても質問する人が何人かいるのを見たことがあります。

に関してsetecho(False)は、pexpect docsに従って、これは「ターミナルエコーモードをオンまたはオフ」に設定します。その機能は、人々が(私を含めて)望んでいたように出力を抑制することを意図したものではありませんsendline()。また、ネットワークデバイス(cisco、juniper、mrvなど)を扱っていたため、ttyエコーをオフにしようとしても役に立ちませんでした。

これが将来誰かを助けることを願っています。

于 2014-11-25T00:12:40.777 に答える
0

以前は、エコーがオフになっている場合でも、エコーに関して同じ問題が発生していました。

しかし、私は解決策を見つけたかもしれません:

commandToRun = 'bash -c "less /readfile | tail -4"'
yourConnection.sendLine("stty -echo")
commandResult = yourConnection.sendLine(commandToRun)
self.sendLine("stty echo")

したがって、基本的には、''を使用してシェルでコマンドを実行してから、bashbash -cをオンにします。echo

于 2012-11-30T10:10:10.167 に答える
0

だから、私が見つけたのは...

  • setechoが機能していないようです(pexpect.before出力には、pexpect.sendlineテキストがあります)。唯一の解決策は、ストリングストリッピングを行うことです。擬似コードのようなものpexpect.before.strip(pexpect.sendline)
  • また、ログ記録中、logfile_readにはエコーは含まれませんが、logfileには(setecho値に関係なく)含まれます。
于 2012-11-25T05:08:20.633 に答える