2012-11-20 10 views
5

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

''' 
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# 

答えて

0

、私が発見したものです... * setechoだけで、pexpect.before出力に(pexpectを動作するようには思えません.sendlineテキストは存在します)。唯一の解決策は、ストリングストリッピングを行うことです。何かのsudoのようなコード= pexpect.before.strip(pexpect.sendline) *また、ログ中に、logfile_readにはエコーは含まれていませんが、ログファイルには(setechoの値に関係なく)含まれています

0

私は同じエコーが鳴っていなくても、エコーの問題。

しかし、私は解決策を見つけたかもしれない:

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

だから、基本的に、あなたは「bash -c」を使用して、シェルのコマンドを実行して、bashでechoの変わり目。

8

これは非常に古い質問ですが、ネットワークデバイス(* nix端末ではない)とやりとりしているときに同じ問題が発生していて、助けになったウェブ上で何かを見つけることができなかったので私は応答しています。詳細な回答がないので、他の人のために後に残したいと思っていました。

Pexpectには3つのログ記録方法(1. logfile_send(),2.,)があります。ここで、上記のオリジナルポスターからの出力例を使用して

は、出力は各ログ記録方法について次のようになります。

1)p.logfile()ネットワークデバイスのecho'd出力をログに記録し、それが送信されたテキストを記録します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()は、ネットワークデバイスのecho'd出力を記録します。ログには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)については、「docs」ごとに「端末エコーモードをオンまたはオフ」に設定します。その機能は、人々が望んでいた(自分自身を含む)ように、sendline()の出力を抑圧するためのものではありません。私はネットワークデバイス(cisco、juniper、mrvなど)を扱っていたので、ttyエコーをオフにしようとすると便利ではありませんでした。

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

+1

ご理解いただいたようです。あなたは例を挙げることができますか?明示的に 'logfile_read()'を呼び出しますか?あるいは、関数を何かにセットするだけで、 'pexpect'がそのメソッドを呼び出すでしょうか? – Johnston