Python模块paramiko

日常开发连接 Linux 服务器,都会用到 ssh 客户端的软件 其实 python 有一个模块,可以简单模拟一个 ssh 客户端/服务端 编写一些自动化的的任务时,会经常和它打交道 简单记录一下 paramiko 的基本使用

安装 paramiko

paramiko 不是标准库,需要自行安装 要求 py2.7,3.4 版本以上1

pip install paramiko

实例化 ssh 客户端

import paramiko
ssh_client = paramiko.SSHClient()

与服务器建立连接

在得到一个 ssh_client 客户端连接对象后

第一次和服务器建立连接,需要选择是否自动将服务器的 host_key 公钥,记录在本地

Host-key: 主机密钥,是用于在SSH协议中对计算机进行身份验证的加密密钥。

主机键是钥匙对,通常使用RSA,DSA或ECDSA算法。公共主机密钥存储在和/或分发给SSH客户端,私钥存储在SSH服务器上。2

因为,在计算机的世界里,没有永久的朋友– IP 短时间里不会刷新,但是系统可能随时被重置

ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 添加未知主机的 ssh 公钥
ssh_client.connect(hostname='10.10.10.10', port=22, username='root', password='root')

否则会报错提示:

paramiko.ssh_exception.SSHException: Server '10.10.10.10' not found in known_hosts

可以加入 logging 模块,查看详细的通讯过程

import logging
logging.basciConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")

发送命令

使用三个变量,获取返回的信息对象

  • stdin:发送指令
  • stdout:执行结果
  • stderr:报错信息
stdin, stdout, stderr = ssh_client.exec_command("pwd")

解析命令执行结果

读取命令的执行结果

res, err = stdout.read(), stderr.read()
return_msg = res if res else err
result = result.decode(encoding="utf-8")
print(result)
# 结果
>>> '/root'

完整代码

import paramiko
import logging

logging.basciConfig(level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s")

ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 添加未知主机的 ssh 公钥
ssh_client.connect(hostname='10.10.10.10', port=22, username='root', password='root')

stdin, stdout, stderr = ssh_client.exec_command("pwd")
res, err = stdout.read(), stderr.read()
return_msg = res if res else err
result = result.decode(encoding="utf-8")
print(result)