Tôi đang cố bắt chước hành vi sau trong tập lệnh Python: Tôi đang chạy lệnh sau trên máy chủ từ xa bằng SSH:
Me running the following command on a remote server using ssh:
GDB đính kèm `pidof prog`
Sau đó, tôi nhận được màn hình "Chào mừng" sau đây trong GDB:
Excess command line arguments ignored. [22870]
GNU gdb [GDB] 7.0.1-debian
Copyright [C] 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
...
0xb7f53c1e in __read_nocancel [] at ../sysdeps/unix/syscall-template.S:82
82 ../sysdeps/unix/syscall-template.S: No such file or directory.
in ../sysdeps/unix/syscall-template.S
[gdb]
Nhấn "C" cho đầu ra sau:
[gdb] c
Continuing.
Sau đó, khi tôi kết nối bằng NetCat với máy chủ bằng một cổng khác, tôi nhận được đầu ra sau trong GDB:
[New process 22898]
ID quy trình mới là tất cả những gì tôi cần, đó là lý do tại sao tôi muốn tự động hóa quá trình.
Tôi có kịch bản Python sau:
sock = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
s = paramiko.SSHClient[]
s.set_missing_host_key_policy[paramiko.AutoAddPolicy[]]
s.connect[hostname, port, username, password]
stdin, stdout, stderr = s.exec_command["gdb attach `pidof prog`"]
stdin.write["c\n"] # Pressing C
stdin.flush[]
input["Now connect using NC and press Enter"]
while not stdout.channel.exit_status_ready[]:
time.sleep[1]
if stdout.channel.recv_ready[]:
rl, wl, xl = select.select[[stdout.channel], [], [], 0.0]
if len[rl] > 0:
data_out = stdout.channel.recv[1024]
print data_out
Vấn đề là, tôi đang nhận được cùng một đầu ra nhưng bằng cách nào đó tôi không nhận được "[quá trình mới *]", ngay cả khi tôi kết nối sử dụng NC theo cùng một cách chính xác. Hơn nữa, chỉ khi tôi đóng kết nối NC, tôi thấy đầu ra, nhưng sau đó đã quá muộn vì quá trình đã chết. Có vẻ như bộ đệm của đầu ra cần được làm mới vào thời điểm đó, điều mà nó dường như không làm
Moreover, Only when I close the nc connection I see the output, but then it is too late because the process has died.
It seems like the output's buffer needs to be refreshed at that point, which it doesn't seem to be doing
Có phương pháp nào để xả bộ đệm gửi không? Tôi thấy recv [] nhận được lệnh được gửi trước đó là echo bởi ký tự từ xa theo ký tự chứ không phải là một slurp. Tò mò làm thế nào mà có thể tránh được. Thêm một độ trễ nhỏ trước khi recv [] sửa chữa điều này, nhưng điều đó rõ ràng là không tối ưu.
Tôi đang tìm kiếm một số phương pháp tuôn ra, nhưng tôi không tìm thấy một phương pháp.
Cảm ơn
Bởi 'Gửi bộ đệm', bạn có nghĩa là ChannelFile
, một stdin? Nếu vậy, nó có một phương pháp flush[]
, nhưng tôi nghi ngờ nó sẽ giúp ích trong trường hợp của bạn.
Bạn có thể thử stty -echo
để chuyển từ xa gửi lại các ký tự đã gửi [như thể chúng đang được gõ, đó là hành vi PTY mặc định] hoặc thử sử dụng exec_command[]
thay vì send[]
nếu cuối từ xa hỗ trợ nó.
Cảm ơn phản hồi, vì trường hợp sử dụng cụ thể là các thiết bị mạng, tôi không chắc có cách dừng tiếng vang của các lệnh được đánh máy. Thật tốt cho chúng tôi khi thấy sự tương tác "đầy đủ" từ các thiết bị cũng như thể nó có thể được sàng lọc clis.
FYI, phương thức Flush [] dường như không có tác động. Tôi đang cố gắng hiểu nơi bộ đệm thực sự xảy ra. Một thời gian đơn giản
Lớp ________ 9 ________ 10¶
Lớp cơ sở có thể tái sử dụng để triển khai bộ đệm tệp kiểu Python xung quanh một luồng đơn giản hơn.
________ 11 [][]¶Trả về một trình lặp có thể được sử dụng để lặp lại các dòng trong tệp này. Trình lặp này xảy ra để tự trả lại tệp, vì một tệp là trình lặp riêng của nó.
2 - Nếu tệp được đóng. |
Trả về dòng tiếp theo từ đầu vào hoặc tăng
[gdb] c
Continuing.
4 khi EOF bị tấn công. Không giống như các đối tượng tệp Python, nó có thể trộn các cuộc gọi vào [gdb] c
Continuing.
5 và [gdb] c
Continuing.
6.
4 - Khi đạt được kết thúc của tệp. |
Một dòng [ 8] đọc từ tệp. |
Đóng tệp. Các hoạt động đọc và viết trong tương lai sẽ thất bại.
________ 20 [][]¶Viết ra bất kỳ dữ liệu trong bộ đệm ghi. Điều này có thể không làm gì nếu bộ đệm ghi không được bật.
________ 21 [size = none] ¶[size=None]¶Đọc nhiều nhất
[New process 22898]
2 byte từ tệp [ít hơn nếu chúng tôi nhấn vào cuối tệp trước]. Nếu đối số [New process 22898]
2 là âm hoặc bị bỏ qua, hãy đọc tất cả các dữ liệu còn lại trong tệp.Ghi chú
Cờ chế độ
[New process 22898]
4 bị bỏ qua [[New process 22898]
5 trong [New process 22898]
6], bởi vì SSH coi tất cả các tệp là nhị phân, vì chúng tôi không biết mã hóa tệp là gì hoặc ngay cả khi tệp là dữ liệu văn bản.
Kích thước [int] - Số byte tối đa để đọc [int] – maximum number of bytes to read |
Dữ liệu được đọc từ tệp [như byte] hoặc chuỗi trống nếu gặp EOF ngay lập tức |
Kiểm tra xem tệp có thể được đọc từ.
8 nếu tệp có thể được đọc từ. Nếu 9, 0 sẽ tăng một ngoại lệ. |
Đọc tối đa
sock = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
s = paramiko.SSHClient[]
s.set_missing_host_key_policy[paramiko.AutoAddPolicy[]]
s.connect[hostname, port, username, password]
stdin, stdout, stderr = s.exec_command["gdb attach `pidof prog`"]
stdin.write["c\n"] # Pressing C
stdin.flush[]
input["Now connect using NC and press Enter"]
while not stdout.channel.exit_status_ready[]:
time.sleep[1]
if stdout.channel.recv_ready[]:
rl, wl, xl = select.select[[stdout.channel], [], [], 0.0]
if len[rl] > 0:
data_out = stdout.channel.recv[1024]
print data_out
2 byte thành sock = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
s = paramiko.SSHClient[]
s.set_missing_host_key_policy[paramiko.AutoAddPolicy[]]
s.connect[hostname, port, username, password]
stdin, stdout, stderr = s.exec_command["gdb attach `pidof prog`"]
stdin.write["c\n"] # Pressing C
stdin.flush[]
input["Now connect using NC and press Enter"]
while not stdout.channel.exit_status_ready[]:
time.sleep[1]
if stdout.channel.recv_ready[]:
rl, wl, xl = select.select[[stdout.channel], [], [], 0.0]
if len[rl] > 0:
data_out = stdout.channel.recv[1024]
print data_out
3 buff và trả lại số byte đọc.
Số lượng byte đọc. |
Đọc toàn bộ dòng từ tệp. Một ký tự dòng mới được giữ trong chuỗi [nhưng có thể vắng mặt khi một tệp kết thúc bằng một dòng không hoàn chỉnh]. Nếu đối số kích thước có mặt và không âm, thì đó là số byte tối đa [bao gồm cả dòng mới] và một dòng không hoàn chỉnh có thể được trả về. Một chuỗi trống chỉ được trả về khi EOF gặp phải ngay lập tức.
Ghi chú
Cờ chế độ
[New process 22898]
4 bị bỏ qua [[New process 22898]
5 trong [New process 22898]
6], bởi vì SSH coi tất cả các tệp là nhị phân, vì chúng tôi không biết mã hóa tệp là gì hoặc ngay cả khi tệp là dữ liệu văn bản.
Kích thước [int] - Số byte tối đa để đọc [int] – maximum length of returned string. |
Dữ liệu được đọc từ tệp [như byte] hoặc chuỗi trống nếu gặp EOF ngay lập tức ________ 27 [] |
[New process 22898]
8 nếu tệp có thể được đọc từ. Nếu [New process 22898]
9, sock = socket.socket[socket.AF_INET, socket.SOCK_STREAM]
s = paramiko.SSHClient[]
s.set_missing_host_key_policy[paramiko.AutoAddPolicy[]]
s.connect[hostname, port, username, password]
stdin, stdout, stderr = s.exec_command["gdb attach `pidof prog`"]
stdin.write["c\n"] # Pressing C
stdin.flush[]
input["Now connect using NC and press Enter"]
while not stdout.channel.exit_status_ready[]:
time.sleep[1]
if stdout.channel.recv_ready[]:
rl, wl, xl = select.select[[stdout.channel], [], [], 0.0]
if len[rl] > 0:
data_out = stdout.channel.recv[1024]
print data_out
0 sẽ tăng một ngoại lệ.
________ 31 [buff] ¶ [int] – desired maximum number of bytes to read. |
Đọc tối đa 2 byte thành 3 buff và trả lại số byte đọc. |
________ 34 [size = none] ¶
Ghi chú
Cờ chế độ
[New process 22898]
4 bị bỏ qua [[New process 22898]
5 trong [New process 22898]
6], bởi vì SSH coi tất cả các tệp là nhị phân, vì chúng tôi không biết mã hóa tệp là gì hoặc ngay cả khi tệp là dữ liệu văn bản.
|
|
Kiểm tra xem tệp có hỗ trợ truy cập ngẫu nhiên không.
8 Nếu tệp hỗ trợ truy cập ngẫu nhiên. Nếu 9, flush[] 1 sẽ tăng một ngoại lệ. |
Trả về vị trí hiện tại của tập tin. Điều này có thể không chính xác hoặc hữu ích nếu tệp cơ bản không hỗ trợ truy cập ngẫu nhiên hoặc được mở ở chế độ phụ lục.
Vị trí tệp [flush[] 3 của byte]. |
Kiểm tra xem tệp có thể được ghi vào.
8 Nếu tệp có thể được ghi vào. Nếu 9, flush[] 7 sẽ tăng một ngoại lệ. |
Viết dữ liệu vào tệp. Nếu bộ đệm ghi được bật [flush[]
9 được chỉ định và khác không], một số hoặc tất cả dữ liệu có thể chưa thực sự được viết. [Sử dụng stty -echo
0 hoặc stty -echo
1 để buộc dữ liệu được ghi lại.]
Dữ liệu - ________ 18/________ 63 Dữ liệu để ghi – 8/stty -echo 3 data to write
|
Viết một chuỗi các chuỗi vào tệp. Trình tự có thể là bất kỳ đối tượng nào có thể tạo ra các chuỗi, thường là một danh sách các chuỗi. [Tên được dự định để khớp stty -echo
5; stty -echo
6 không thêm dấu phân cách dòng.]
Trình tự - một chuỗi có thể lặp lại. – an iterable sequence of strings. |
Giống hệt với stty -echo
8. Đây là một giao diện tệp không dùng nữa có trước hỗ trợ Python Iterator.