Paramiko ssh linux命令执行没有结果

时间:2018-08-24 00:50:43

标签: python linux raspberry-pi paramiko

我正在尝试建立与通过以太网连接到主raspberrypi的raspberrypi(在代码中称为从属)的连接。从属树莓派也有一个静态IP地址。

以下代码(即我正在执行的全部代码)尝试从主raspberrypi连接到从属raspberrypi,并发出“ echo hello”命令。据我所知,从站已连接到屏幕,据我所知,应在终端上打印“ hello”一词。

import paramiko
import time

slave_ip='169.254.39.236'


def connect():
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    connect(slave_ip, username='pi', password='raspberry')
    ssh_stdin, ssh_stdout, ssh_stderr = ssh_client.exec_command('echo hello') 
    exit_status = ssh_stdout.channel.recv_exit_status()
    print (exit_status)

def main():
    connect()

if __name__ == '__main__':
    while True:
        try:    
            main()
        except:
            pass    

问题:

1-如何确定登录是否成功?我之所以这样问是因为,如果我提供了错误的登录信息或IP,该脚本不会崩溃或返回错误。

2-假设登录成功,为什么我看不到命令​​的输出?

1 个答案:

答案 0 :(得分:0)

  1. 您不会看到错误,因为您正在捕获try语句中的所有内容,这是错误的做法,您应该仅捕获要处理的异常

  2. 您的循环将永远重复执行一次,您不希望这样做,而只知道运行一次就可以运行一次,对脚本执行更多有用的操作

  3. 您没有连接,是因为您递归调用了您定义的connect函数,而是调用了ssh_client.connect()

  4. 您不会在RPi的连接显示中看到任何输出,这是因为ssh创建了一个独立的会话,如果您想在连接显示中看到输出,请尝试使用wall linux命令,或者只需运行将向stdout输出一些文本并从python打印出来的命令

修改后的脚本如下:

import paramiko
import time

slave_ip='169.254.39.236'


def connect():
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(slave_ip, username='pi', password='raspberry')
    ssh_stdin, ssh_stdout, ssh_stderr = ssh_client.exec_command('echo hello') 
    exit_status = ssh_stdout.channel.recv_exit_status()
    print(ssh_stdout)

if __name__ == '__main__':
    connect()