[英]Unable to read stdout and stderr for a long running process in paramiko with channels and exec_command
[英]Refresh stdout in paramiko inside a running process
我正在尝试在 Python 脚本中模仿以下行为:
我使用 ssh 在远程服务器上运行以下命令:
gdb 附加`pidof prog`
然后我在 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 <http://gnu.org/licenses/gpl.html>
...
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)
按“c”给出以下输出:
(gdb) c
Continuing.
然后,当我使用 netcat 连接到使用另一个端口的服务器时,我在 gdb 中得到以下输出:
[New process 22898]
我只需要新的进程 ID,这就是我想要自动化进程的原因。
我有以下 Python 脚本:
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
问题是,我得到了相同的输出,但不知何故我没有收到“[新进程*]”,即使我以完全相同的方式使用 nc 连接。
此外,只有当我关闭 nc 连接时,我才能看到输出,但为时已晚,因为进程已经死亡。
似乎此时需要刷新输出的缓冲区,但它似乎没有这样做
我在命令后使用 stdin 并捕获 stdout 时遇到了类似的问题,我使用选项“get_pty=True”修复了它。
stdin, stdout, stderr = s.exec_command("gdb attach `pidof prog`",get_pty=True)
Paramiko 文档说,当使用 get_pty=True 选项时,会打开一个专用伪终端,并且相同的文档建议如果您打算使用更多命令/与之交互,它应该使用 get_pty=True :
get_pty(*args, **kwds):
从服务器请求一个伪终端。 这通常在创建客户端通道后立即使用,要求服务器为使用 invoke_shell 调用的 shell 提供一些基本的终端语义。 如果您要使用 exec_command 执行单个命令,则没有必要(或不需要)调用此方法。
此外,如果您使用 get_pty=True,您将能够在同一个 shell 上执行更多命令。 因此,可以执行history | grep [SOME REGEX]
history | grep [SOME REGEX]
按照SunPaz 的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.