Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在正在运行的进程中刷新paramiko中的标准输出_Python_Sockets_Paramiko - Fatal编程技术网

Python 在正在运行的进程中刷新paramiko中的标准输出

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

我试图在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://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)