2017-09-05 361 views
1

我使用python3 ssh,现在我可以登录远程设备,并执行我的远程C程序,但程序打印信息不能在本地pc上实时显示。如果我的C程序使用setbuf(stdout, NULL);来设置非缓冲,我的电脑可以获得实时信息;我想知道如果C程序不设置非缓冲,我怎样才能获得本地PC上的远程实时信息。为什么paramiko ssh无法实时输出打印信息

这里是我的代码:

def get_ssh_log(hostip, login_name, pw, privaete_key, cmd): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(hostname='%s' % hostip, port=22, username='%s' % login_name, password='%s' % pw,key_filename='%s' % privaete_key) 
    stdin, stdout, stderr = ssh.exec_command("%s" % cmd, bufsize=1) 
    for line in iter(stdout.readline, ""): 
     print(line) 
    ssh.close() 
+1

你知道' “%s的” %cmd'只是'cmd'吧? –

+0

我猜@JohnZwinck的评论也适用于此函数中'%'运算符的所有其他用途。 – BlackJack

+0

@JohnZwinck是的,我知道“%s”%cmd只是cmd; – simon

回答

0

可以包装unbuffer下从expect包运行任何程序。你的情况:

ssh.exec_command("unbuffer %s" % cmd) 

当然这是假设unbuffer安装在目标机器上。

编号:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

+0

远程设备是一个运行openwrt os的嵌入设备,在其上安装任何软件包都不方便。如果在本地PC的python3中有其他方法可以实时获得输出。谢谢。 – simon

+0

@simon:那么你可以自己实现unbuffer程序,也许使用Python,并在执行之前使用SFTP将其复制到目标。这样的程序的源代码在这里:http://man7.org/tlpi/code/online/dist/pty/unbuffer.c.html –