2012-11-20 19 views
5

Tôi đang cố gắng telnet tới Cisco Router và cung cấp các lệnh bằng cách sử dụng pexpect. Làm việc của nó, nhưng sendline() lặp lại trong đầu ra. ngay cả sau khi sử dụng setecho để Sai. Mã là:pexpect setecho không hoạt động

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

Output là:

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

Trả lời

0

Vì vậy, những gì tôi đã tìm thấy được ... * setecho chỉ dường như không làm việc (trong đầu ra pexpect.before, các Pexpect .sendline văn bản là hiện tại). Chỉ có giải pháp là làm tước chuỗi. Một cái gì đó giống như mã sudo = pexpect.before.strip (pexpect.sendline) * Ngoài ra, trong khi ghi nhật ký, logfile_read không chứa các bản ghi âm, nhưng tệp nhật ký chứa (không phân biệt giá trị setecho)

0

Tôi đã từng có vấn đề với tiếng vang, ngay cả khi tiếng vọng bị tắt.

Nhưng tôi có thể đã tìm thấy một giải pháp:

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

Vì vậy, về cơ bản, chạy bạn chỉ huy trong một vỏ sử dụng 'bash -c' và sau đó bật của echo trong bash.

8

Tôi biết đây là câu hỏi cũ, nhưng tôi đang trả lời vì tôi gặp sự cố tương tự khi tương tác với thiết bị mạng (không phải thiết bị đầu cuối * nix) và tôi không thể tìm thấy bất kỳ thứ gì trên web đã giúp. Vì không có bất kỳ câu trả lời chi tiết nào, tôi muốn để lại một câu trả lời cho những người khác.

Pexpect có 3 phương thức ghi nhật ký (1. logfile_send(), 2. logfile_read() 3. logfile()).

Sử dụng ví dụ đầu ra từ các poster ban đầu ở trên, đây là những gì đầu ra trông giống như cho mỗi phương pháp khai thác gỗ:

1.) p.logfile() sẽ đăng nhập đầu ra echo'd các thiết bị mạng và nó sẽ đăng nhập văn bản gửi sử dụng send() & sendline(). Đây là những gì mà poster ban đầu KHÔNG muốn xảy ra.

Trong kịch bản:

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

Output:

# 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() CHỈ sẽ đăng nhập đầu ra echo'd thiết bị mạng. Nó sẽ không đăng nhập p.sendline() ký tự. Đây là kết quả mong muốn mà áp phích gốc đang tìm kiếm.

Trong kịch bản:

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

Output:

# 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 sẽ chỉ gửi p.sendline() ký tự vào nhật ký, mà có lẽ không phải là rất hữu ích trong nhiều trường hợp. Tôi sẽ bỏ qua ví dụ, vì bây giờ mọi người đều có ý tưởng.

Vì vậy, việc sử dụng logfile_read() sẽ khắc phục vấn đề với mật khẩu hiển thị trong đầu ra nhật ký khi tương tác với thiết bị mạng.Điều này cũng sẽ khắc phục vấn đề của pexpect cho thấy đôi của echo trong đầu ra đăng nhập, mà tôi đã nhìn thấy một vài người đặt câu hỏi về trực tuyến là tốt.

Liên quan đến setecho(False), mỗi pexpect docs, điều này đặt chế độ "bật hoặc tắt tiếng vang". Chức năng đó không có nghĩa là để surpress sendline() đầu ra như mọi người đã hy vọng (bao gồm cả bản thân mình). Và kể từ khi tôi đã được giao dịch với một thiết bị mạng (cisco, juniper, mrv, vv), cố gắng để tắt tty echo không hữu ích.

Hy vọng điều này sẽ giúp ai đó trong tương lai.

+1

Dường như bạn hiểu. bạn có thể cung cấp một ví dụ? Bạn có gọi một cách rõ ràng 'logfile_read()'? Hay bạn chỉ cần đặt chức năng cho một cái gì đó và 'pexpect' sẽ gọi phương thức đó là của riêng nó? – Johnston