Hướng dẫn stdin.flush() python paramiko - stdin.flush () python paramiko

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

Hướng dẫn stdin.flush() python paramiko - stdin.flush () python paramiko

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

Raises:
(gdb) c
Continuing.
2 - Nếu tệp được đóng.
________ 13 ()()

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.

Raises:
(gdb) c
Continuing.
4 - Khi đạt được kết thúc của tệp.
Returns:Một dòng (
(gdb) c
Continuing.
8) đọc từ tệp.
________ 19 ()()

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

Parameters:Kích thước (int) - Số byte tối đa để đọc (int) – maximum number of bytes to read
Returns: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 ()()

Kiểm tra xem tệp có thể được đọc từ.

Returns:
[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) ¶(buff)

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

Returns:Số lượng byte đọc.
________ 34 (size = none) ¶(size=None)

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

Parameters:Kích thước (int) - Số byte tối đa để đọc (int) – maximum length of returned string.
Returns: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 ()

Kiểm tra xem tệp có thể được đọc từ.(sizehint=None)

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

Parameters: ________ 31 (buff) ¶ (int) – desired maximum number of bytes to read.
Returns:Đọ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.(offset, whence=0)

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

Parameters:
  • Offset (int) - Vị trí để di chuyển đến trong tệp, so với ChannelFile6. (int) – position to move to within the file, relative to ChannelFile6.
  • whence (int) - loại chuyển động: 0 = tuyệt đối; 1 = liên quan đến vị trí hiện tại; 2 = liên quan đến cuối tệp. (int) – type of movement: 0 = absolute; 1 = relative to the current position; 2 = relative to the end of the file.
Raises:

ChannelFile7 - Nếu tệp không hỗ trợ truy cập ngẫu nhiên.

________ 48 ()()

Kiểm tra xem tệp có hỗ trợ truy cập ngẫu nhiên không.

Returns:
[New process 22898]
8 Nếu tệp hỗ trợ truy cập ngẫu nhiên. Nếu
[New process 22898]
9, flush()1 sẽ tăng một ngoại lệ.
________ 52 ()()

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.

Returns:Vị trí tệp (flush()3 của byte).
________ 54 ()()

Kiểm tra xem tệp có thể được ghi vào.

Returns:
[New process 22898]
8 Nếu tệp có thể được ghi vào. Nếu
[New process 22898]
9, flush()7 sẽ tăng một ngoại lệ.
________ 58 (dữ liệu) ¶(data)

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 -echo0 hoặc stty -echo1 để buộc dữ liệu được ghi lại.)

Parameters:Dữ liệu - ________ 18/________ 63 Dữ liệu để ghi
(gdb) c
Continuing.
8/stty -echo3 data to write
________ 64 (trình tự) ¶(sequence)

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 -echo5; stty -echo6 không thêm dấu phân cách dòng.)

Parameters:Trình tự - một chuỗi có thể lặp lại. – an iterable sequence of strings.
________ 67 ()()

Giống hệt với stty -echo8. Đây là một giao diện tệp không dùng nữa có trước hỗ trợ Python Iterator.