Python_paramiko模块

paramiko模块安装:pip3 install paramiko

paramiko模块(模拟SSH),是基于SSH(网络安全协议)用于连接远程服务器并执行相关操作。

ssh:

  • 基于口令的安全验证
  • 基于密匙的安全验证(非对称加密)

paramiko常用类:

  • SSHClient类
  • SFTPClient类

一、SSHClient类


封装了传输、通道以及SFTPClient的校验、建立方法,通常用于执行命令

1.connect()方法

     connect(hostname, port=22, username=None,password=None,pkey=None, key_filename=None,timeout=None,allow_agent=True, look_for_keys=True, compress=False)

参数说明:

hostname 连接目标主机或主机地址
port 连接目录的端口,默认为22
username 用户名
password 密码
pkey 私钥方式用户验证
key_filename 私钥文件名
timeout 连接超时时间
allow_agent 是否允许使用ssh代理
look_for_keys 是否允许搜索私钥文件
compress 打开时是否压缩                                         

2.exec_command()方法

    exec_command(command,bufsize = -1)

参数说明:

command 执行的指令
bufsize 文件缓冲区大小,-1为不限制                       

3.load_system_host_keys()方法

    load_system_host_keys(filename = None)

参数说明:

  •  filename:指定远程主机的公钥文件,默认为.ssh目录下的know_hosts文件

4.set_missing_host_key_policy()方法
     set_missing_host_key_policy(paramiko.AutAddPolicy())

参数说明:

AutoAddPolicy 自动添加主机名及密钥到本地并保存,不依赖于load_system_host_keys配置,即known_host里没有远程主机的公钥时(连接的新的主机),自动添加为yes
RejectPolicy 自动拒绝未知主机名和密钥,依赖于load_system_host_keys()
WarnningPolicy 功能与AutoAddPolicy相同,不过如果是未知主机会提示yes/no

5.close() :关闭连接

例:利用paramiko模拟ssh执行命令(Linux系统运行)

例一、

#!/usr/bin/python3
# -*- coding:utf-8 -*- 
import paramiko
import sys

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   # 允许连接没连过的主机
ssh.connect(hostname='localhost',port=22,username='root',password ='123456') # 连接服务
while True:
    data = input('>>>')
    if data=='exit':break
    stdin, stdout, stderr = ssh.exec_command(data)    # 执行命令

    result , err = stdout.read().decode(),stderr.read()
    if not err:
        print(result)
    else:
        print(err)
ssh.close()
明文用户密码

例二、

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/路径/id_rsa')  # 指定文件在哪儿
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())   # 允许连接没连过的主机
ssh.connect(hostname='localhost',port=22,username='root',key = private_key) # 连接服务>器
while True:
    data = input('>>>')
    if data == 'exit':break
    stdin, stdout, stderr = ssh.exec_command(data)    # 执行命令

    result , err = stdout.read(),stderr.read()
    if not err:
        print(result)
    else:
        print(err)

ssh.close()
基于公钥

二、SFTPClient类


根据SSH传输协议的sftp会话,实现远程文件上传、下载等操作.

1.Transport()方法

      Transport(hostname,port)

参数说明:

hostname 主机名或主机地址                     
port 端口,默认为22

2.put()方法

      put(localpath, remotepath, callback = None, confirm = True)

参数说明:

localpath 上传源文件的本地路径
remotepath 目标路径
callback 获取接收的总传输字节数
confirm 上传完毕后是否调用start()方法,以便确认大小         

3.get()方法

      get(remotepath, localpath,callback=None)

参数说明:

remotepath 需要下载的远程文件
localpath 本地存储路径
callback 获取接收的总传输字节数             

更多方法:

方法描述
sftp.getcwd() 返回当前工作目录
sftp.chdir(path) 改变工作目录
sftp.chmod(path, mode) 修改权限
sftp.chown(path, uid, gid) 设置属主属组
sftp.close() 关闭sftp
sftp.file(filename, mode=’r’, bufsize=-1) 读取文件
sftp.from_transport(s) 创建SFTP客户端通道
sftp.listdir(path=’.’) 列出目录,返回一个列表
sftp.listdir_attr(path=’.’) 列出目录,返回一个SFTPAttributes列表
sftp.mkdir(path, mode=511) 创建目录
sftp.normalize(path) 返回规范化path
sftp.open(filename, mode=’r’, bufsize=-1) 在远程服务器打开文件
sftp.put(localpath, remotepath, callback=None) localpath文件上传到远程服务器remotepath
sftp.get(remotepath, localpath, callback=None) 从远程服务器remotepath拉文件到本地localpath                   
sftp.readlink(path) 返回一个符号链接目标
sftp.remove(path) 删除文件
sftp.rename(oldpath, newpath) 重命名文件或目录
sftp.rmdir(path) 删除目录
sftp.stat(path) 返回远程服务器文件信息(返回一个对象的属性)
sftp.truncate(path, size) 截取文件大小
sftp.symlink(source, dest) 创建一个软链接(快捷方式)
sftp.unlink(path) 删除软链接

例:用paramiko模块模拟ftp上传和下载

例一、

#!/usr/bin/python3
# -*-coding:utf-8 -*-

import paramiko
transport = paramiko.Transport('127.0.0.0',22)    # 创建实例
transport.connect(username='root',password='123456')   # 创建链接
sftp = paramiko.SFTPClient.from_transport(transport)   # 将创建的实例作为参数传给sftp,>交互进行的地方
sftp.put(r'文件的所处的位置路径/文件名',r'要上传到的地方/文件名')    # 上传
sftp.get(r'要从哪儿下载文件/文件名',r'文件要存到哪儿/文件名')    # 下载

transport.close()
明文用户密码

例二、

#!/usr/bin/python3
# -*-coding:utf-8 -*-

import paramiko
private_key = paramiko.RSAKey.from_private_key_file(r'路径/id_rsa')
transport = paramiko.Transport('127.0.0.0',22)    # 创建实例
transport.connect(username='root',pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)   # 将创建的实例作为参数传给sftp,>交互进行的地方
sftp.put(r'文件的所处的位置路径/文件名',r'要上传到的地方/文件名')    # 上传
sftp.get(r'要从哪儿下载文件/文件名',r'文件要存到哪儿/文件名')    # 下载

transport.close()
基于公钥

paramiko模块是一个比较强大的ssh连接模块,以上的示例只是列出了该模块的一些简单的使用方法,还可以使用threading模块加块程序并发的速度;也可以使用configparser模块处理配置文件,而我们将所有IP、用户信息操作都放入配置文件;使用setproctitle模块为执行的程序加一个容易区分的title等。

参考笔记:http://www.cnblogs.com/breezey/p/6663546.html

                  https://www.e-learn.cn/content/python/271181

                  https://blog.csdn.net/cc297322716/article/details/78608283

原文地址:https://www.cnblogs.com/Vera-y/p/10034192.html