Python 在正在运行的进程中刷新paramiko中的标准输出
我试图在Python脚本中模拟以下行为: 我使用ssh在远程服务器上运行以下命令: gdb附件'pidof程序` 然后我在gdb中看到以下欢迎屏幕:Python 在正在运行的进程中刷新paramiko中的标准输出,python,sockets,paramiko,Python,Sockets,Paramiko,我试图在Python脚本中模拟以下行为: 我使用ssh在远程服务器上运行以下命令: gdb附件'pidof程序` 然后我在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
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)
然后,当我使用netcat通过另一个端口连接到服务器时,我在gdb中获得以下输出:
[New process 22898]
新的流程ID是我所需要的全部,这就是为什么我想要自动化流程
我有以下Python脚本:
sock=socket.socketsocket.AF_INET,socket.sock_流
s=paramiko.SSHClient
s、 设置\u缺少\u主机\u密钥\u策略paramiko.AutoAddPolicy
s、 连接主机名、端口、用户名、密码
stdin,stdout,stderr=s.exec_commandgdb attach`pidof prog`
stdin.writec\n按C键
标准冲洗
inputNow使用NC连接并按Enter键
当没有stdout.channel.exit_状态_就绪时:
时间1
如果stdout.channel.recv_就绪:
rl,wl,xl=选择。选择[stdout.channel],[],0.0
如果lenrl>0:
数据输出=stdout.channel.recv1024
打印数据
问题是,我得到的是相同的输出,但不知何故我没有收到[New process*],即使我以完全相同的方式使用nc进行连接。
此外,只有当我关闭nc连接时,我才能看到输出,但由于进程已死亡,因此为时已晚。
似乎此时需要刷新输出的缓冲区,但它似乎没有这样做我在命令后使用stdin并捕获stdout时遇到了类似的问题,我通过使用get_pty=True选项修复了它
stdin, stdout, stderr = s.exec_command("gdb attach `pidof prog`",get_pty=True)
当使用get_pty=True选项时,会打开一个专用的伪终端,相同的文档建议,如果要使用更多命令/与之交互,则应使用get_pty=True:
获取*参数,**千瓦时:
从服务器请求一个伪终端。这通常是正确使用的
创建客户端通道后,要求服务器提供一些
使用invoke_shell调用的shell的基本终端语义。信息技术
如果要调用此方法,则不需要或不希望调用此方法
使用exec_命令执行单个命令
此外,如果使用get_pty=True,则可以在同一shell上执行更多命令。因此,可以按照的建议执行history | grep[SOME REGEX]。您可以使用s.exec_commandhistory | grep[SOME REGEX]`来获取无法工作的进程ID,因为历史记录不显示以前程序的输出,只有我键入的命令是正确的。。。被牙签打败了…你连接的程序是什么?是你写的吗?解决方法:是否尝试发送呼叫同步1?
stdin, stdout, stderr = s.exec_command("gdb attach `pidof prog`",get_pty=True)