python 采用paramiko 远程执行命令及报错解决

  • Post category:Python

在讲解“python采用paramiko远程执行命令及报错解决”之前,我们先来了解一下paramiko。

Paramiko 是用于 Python 的 SSHv2 协议的实现,支持加密和认证。 它包含两个类库:一个是用于客户端,另一个是用于服务器。 客户端库可以使用 SSH 协议连接到远程服务器和执行命令以及传输文件,而服务器库可以使用 SSH 协议创建并监听服务器的连接。

下面是采用 paramiko 执行远程命令的流程:

  1. 创建 SSHClient 对象
  2. 使用 SSHClient 对象建立到远程主机的连接
  3. 通过 SSHClient 对象的方法执行要在远程主机上执行的命令
  4. 关闭 SSHClient 对象

下面是使用paramiko远程执行命令的用例:

#!/usr/bin/python
import paramiko
remote_server_ip = '192.168.0.1'
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=remote_server_ip, username='root', password='mypassword')
stdin, stdout, stderr = ssh_client.exec_command('ls -l')
print(stdout.readlines())
ssh_client.close()

上面这个脚本,首先根据远程主机的 IP 地址创建一个 SSHClient 对象,然后使用 exec_command 方法向远程主机发出命令,这里命令是 ls -l,即列出当前目录下的文件和目录。执行完命令后,使用 stdout.readlines() 获取执行结果,最后关闭 SSHClient 对象。

解决paramiko报错的方法:

使用 paramiko 连接远程主机时可能会报错,这里讲述两个可能发生的异常和解决方法。

  1. 报错信息:锁定文件“***”的类型是“普通目录”,不是“OpenSSH私钥文件格式”。
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname='192.168.0.1', port=22,  username='root', password='mypassword',
                  key_filename='/home/user/.ssh/id_rsa')

解决方法:错误信息中已经给出,证明你输入的文件名和路径有误,应该更正路径。

  1. 报错信息:paramiko.ssh_exception.SSHException: No existing session
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.connect(hostname='192.168.0.1', port=22,  username='root', password='mypassword')
stdin, stdout, stderr = ssh_client.exec_command('ls -l')
ssh_client.close()
stdout.readlines()

解决方法:这个报错一般是在 exec_command 之后抛出的,因此你应该在执行完命令之后才关闭连接。更改后的代码:

import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.connect(hostname='192.168.0.1', port=22,  username='root', password='mypassword')
stdin, stdout, stderr = ssh_client.exec_command('ls -l')
result = stdout.readlines()
ssh_client.close()
print(result)

最后的效果是输出远程主机目录中的内容。

希望这些信息能够帮助你使用 paramiko 远程执行命令!