繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM