2017-09-05 8 views
1

私はpython3 sshを使用しています。リモートデバイスにログインしてリモートCプログラムを実行できますが、プログラム印刷情報はローカルPCにリアルタイムで表示できません。 Cプログラムでsetbuf(stdout, NULL);を使用して非バッファリングを設定すると、私のPCはリアルタイム情報を得ることができます。 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

あなたはexpectパッケージからラッパーunbufferの下で任意のプログラムを実行することができます。

は、ここに私のコードです。あなたのケースでは:もちろん

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

これは、ターゲットマシンにインストールされているunbufferを前提としています。

参考:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

+0

リモートデバイスはopenwrt osを実行する埋め込みデバイスです。パッケージをインストールするのは便利ではありません。ローカルPC上でpython3に他の方法がある場合、リアルタイムで出力を得ることができます.Thanks。 – simon

+0

@imon:あなたはおそらくPythonでunbufferプログラムを実装し、実行前にSFTPを使ってそれをターゲットにコピーすることができます。そのようなプログラムのソースコードは次のとおりです。http://man7.org/tlpi/code/online/dist/pty/unbuffer.c.html –

関連する問題