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

四:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ImportError: dlopen(/Users/red/Library/Python/3.9/lib/python/site-packages/_cffi_backend.cpython-39-darwin.so, 0x0002): tried: '/Users/red/Library/Python/3.9/lib/python/site-packages/_cffi_backend.cpython-39-darwin.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/red/Library/Python/3.9/lib/python/site-packages/_cffi_backend.cpython-39-darwin.so' (no such file), '/Users/red/Library/Python/3.9/lib/python/site-packages/_cffi_backend.cpython-39-darwin.so' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64'))thread '<unnamed>' panicked at 'Python API call failed', /Users/runner/.cargo/registry/src/index.crates.io-6f17d22bba15001f/pyo3-0.18.3/src/err/mod.rs:790:5note: run with `RUST_BACKTRACE=1` environment variable to display a backtraceTraceback (most recent call last): File "/usr/local/project/red/python/memory.py", line 3, in <module> import paramiko File "/Users/red/Library/Python/3.9/lib/python/site-packages/paramiko/__init__.py", line 22, in <module> from paramiko.transport import ( File "/Users/red/Library/Python/3.9/lib/python/site-packages/paramiko/transport.py", line 33, in <module> from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes File "/Users/red/Library/Python/3.9/lib/python/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py", line 11, in <module> from cryptography.hazmat.primitives.ciphers.base import ( File "/Users/red/Library/Python/3.9/lib/python/site-packages/cryptography/hazmat/primitives/ciphers/base.py", line 10, in <module> from cryptography.exceptions import ( File "/Users/red/Library/Python/3.9/lib/python/site-packages/cryptography/exceptions.py", line 9, in <module> from cryptography.hazmat.bindings._rust import exceptions as rust_exceptionspyo3_runtime.PanicException: Python API call failed
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值