首页 > 解决方案 > Paramiko ssh linux命令执行没有结果

问题描述

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

以下代码(即我正在执行的整个代码)尝试从主 raspberrypi 连接到从属 raspberrypi,并发出“echo 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-假设登录成功,为什么我看不到命令​​的输出?

标签: pythonlinuxraspberry-piparamiko

解决方案


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

  2. 您的循环将永远运行一遍又一遍地执行连接,您不希望这样,而是只运行一次,在您知道它正在工作之后对脚本做一些更有用的事情

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

  4. 您不会在 RPi 的连接显示器上看到任何输出,这是因为 ssh 创建了一个独立的会话,如果您想在连接的显示器中看到输出,请尝试使用walllinux 命令,或者只需运行一个将一些文本输出到 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() 

推荐阅读