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