Python-Paramiko/Telnet/Serial
一:Paramiko
1 简介
- paramiko是一个基于SSH2协议的纯Python库;
- 提供了客户端和服务器的功能;
- 可以实现SSH2远程安全连接,支持认证和密钥方式;
- 一般用于执行远程命令、传输文件、中间SSH代理等。
paramiko包含两个核心组件,分别是SSHClient和SFTPClient。
2 SSHClient 类
SSHClient类 是对SSH会话的封装,通常用于执行远程命令,该类封装了
- 传输(transport)
是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
- 通道 (channel)
Channel:是一种类Socket,一种安全的SSH传输通道;>
- SFTPClient建立的方法(open_sftp)
方法
connect(self, hostname, port=22, username=None, password=None, pkey=None,
key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False)
参数说明:
- hostname(str类型):连接目标主机IP地址或主机名
- port(int类型):连接目标主机的端口,默认为22
- username(str类型):校验的用户名(默认为当前的本地用户名)
- password(str类型):密码用于身份校验或解锁私钥
- pkey:私钥方式用于身份验证
- key_filename(str or list(str)类型):一个文件名或文件名的列表,用于私钥的身份验证
- timeout(float类型):一个可选的超时时间(以秒为单位)的TCP连接
- allow_agent(bool类型):设置为False时用于禁用连接到SSH代理
- look_for_keys(bool类型):设置为False时用来禁用在~./ssh中搜索秘钥文件
- compress(bool类型):设置为True时打开压缩
- set_missing_host_key_policy(policy) - 设置连接远程主机没有本地主机秘钥或HostKeys对象时的策略,目前支持如下三种方式
- AutoAddPolicy:自动添加主机名及主机秘钥到本地HostKeys对象,并将其保存,不依赖load_system_host_keys,即使~/.ssh/known_hosts不存在也不影响
- RejectPolicy(默认):自动拒绝未知的主机名或秘钥,依赖load_system_host_keys()配置
- WarningPolicy:用于记录一个未知的主机秘钥的Python警告,并接受它,功能上与AutoAddPolicy相似,但未知主机会有告警
- exec_command() - 在远程服务器上执行Linux命令的方法
- open_sftp() - 在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象
- load_system_host_keys() - 加载本地公钥校验文件,默认为~/.ssh/known_hosts,非默认路径需要收工指定
例子
import paramiko
SSH_CONFIG = {
'hostname': 'xx.xx.xx.xx', # ip
'port': 22, # 端口
'username': 'xxx', # 用户名
'password': 'xxxx', # 密码
}
def main():
# 建立ssh连接
ssh_client = paramiko.SSHClient() # 实例化SSHClient对象
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 设置自动添加策略
ssh_client.connect(**SSH_CONFIG) # 连接SSH服务端,以用户名和密码进行认证
# 开启一个Channel并执行命令
# 输入与输出流为标准输入(stdin)、输出(stdout)、错误(stderr)
stdin, stdout, stderr = ssh_client.exec_command('uname -a')
print(stdout.read().decode('utf-8')) # 打印返回的stdout
ssh_client.close() # 关闭SSHClient
if __name__ == '__main__':
main()
3 SFTPClient 类
定义
SFTPClient作为一个SFTP客户端对象,根据SSH传输协议的sftp会话,实现远程文件操作,比如文件上传、下载、权限、状态等操作。
方法:
- from_transport():创建一个已连通的SFTP客户端通道
- put():上传本地文件到远程服务器
- get():从远程服务器下载文件到本地
- mkdir():在远程服务器上创建目录
- remove():删除远程服务器中的文件
- rmdir():删除远程服务器中的目录
- rename():重命名远程服务器中的文件或目录
- stat():获取远程服务器中文件的详细信息
- listdir():列出远程服务器中指定目录下的内容
例子
import paramiko
def main():
tran = paramiko.Transport(('10.10.31.12', 22)) # 获取Transport实例
tran.connect(username="root", password='123456') # 连接SSH服务端
sftp_client = paramiko.SFTPClient.from_transport(tran) # 实例化SFTPClient对象
# 设置上传的本地/远程文件路径
local_path = "D:/doc/a.txt"
remote_path = "/tmp/a.txt"
sftp_client.put(local_path, remote_path) # 上传
print("上传成功")
sftp_client.get(remote_path, local_path) # 下载
print("下载成功")
tran.close() # 关闭
if __name__ == '__main__':
main()
二:Telnet
定义:
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式
是不安全的,通过明文传送数据
函数介绍
import telnetlib
import time
# 配置选项
Host = '192.168.73.176' # Telnet服务器IP
username = 'z' # 登录用户名
password = 'z' # 登录密码
# 连接Telnet服务器
tn = telnetlib.Telnet(Host)
# 输入登录用户名
tn.read_until(b'login:')
tn.write(username.encode('ascii') + b"\n")
# 输入登录密码
tn.read_until(b'Password:')
tn.write(password.encode('ascii') + b"\n")
print('成功登录到设备:'+Host)
# 登录完毕后,执行ls命令
tn.read_until(b':~$ ')
print("执行pwd")
tn.write(b'pwd\n')
time.sleep(1)
output=tn.read_very_eager().decode('ascii')
print(output)
# ls命令执行完毕后,终止Telnet连接(或输入exit退出)
tn.read_until(b':~$ ')
tn.close() # tn.write('exit\n')
- 调用telnetlib的telnet()函数,将它赋值给tn,尝试以telnet方式登录交换机
- tn.read_until(‘Password:’) 的函数来告诉程序:如果在终端信息库读到’‘Password:’‘字样,
- 则使用tn.write(password+’\n’)函数来输入telnet密码并回车
- output=tn.read_very_eager().decode(‘ascii’) 打印终端回显消息
- tn.close()#关闭连接
三:serial
定义
连接比如交换机的哪一个串口通信
工作上 单板/芯片有很多串口 ,在启动单板自动化的时候,需要先去启动串口,和往串口发送命令
例子
# encoding=utf-8
import serial
import time
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
over_time = 30
start_time = time.time()
while True:
end_time = time.time()
if end_time - start_time < over_time:
data = com.read(com.inWaiting())
data = str(data)
if data != '':
print data
链接
https://www.cnblogs.com/rainbow-tan/p/12858379.html