您当前的位置:首页 > 计算机 > 编程开发 > Python

python --paramiko模块(ssh/sftp)

时间:08-16来源:作者:点击数:

本文介绍了Python的Paramiko模块,它是一个实现SSH2协议的库,用于进行加密和认证的远程服务器连接。示例展示了如何使用Paramiko进行远程密码连接、SFTP文件上传和下载,以及基于公钥的身份验证。此外,还提供了一个SSHUtils类,简化了SSH命令执行和SFTP操作。

paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

paramiko远程密码连接

import paramiko

##1.创建一个ssh对象
client = paramiko.SSHClient()

#2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
##自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#3.连接服务器
client.connect(hostname='172.25.254.31',
               port=22,
               username='root',
               password='westos')

#4.执行操作
stdin,stdout, stderr = client.exec_command('hostname')

#5.获取命令执行的结果
result=stdout.read().decode('utf-8')
print(result)

#6.关闭连接
client.close()

使用sftp上传文件

import paramiko

#获取Transport实例
tran = paramiko.Transport("172.25.254.31",22)

#连接SSH服务端
tran.connect(username = "root", password = "westos")

#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

#设置上传的本地/远程文件路径
localpath="passwd.html"   ##本地文件路径
remotepath="/home/kiosk/Desktop/fish"   ##上传对象保存的文件路径

#执行上传动作
sftp.put(localpath,remotepath)

tran.close()

使用sftp下载文件

import paramiko

#获取SSHClient实例
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端
client.connect("172.25.254.31",username="root",password="westos")
#获取Transport实例
tran = client.get_transport()
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

remotepath='/home/kiosk/Desktop/fish'
localpath='/home/kiosk/Desktop/fish'

sftp.get(remotepath, localpath)

client.close()

paramiko基于公钥密钥连接

import  paramiko

from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException


def connect(cmd, hostname, port=22, user='root'):

    client = paramiko.SSHClient()  

    private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
     ###id_rsa为本地局域网密钥文件

    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(hostname=hostname,
                       port=port,
                       username=user,
                       pkey=private_key
                      )

        stdin, stdout, stderr = client.exec_command(cmd)
    except NoValidConnectionsError as e:
        print("连接失败")
    except AuthenticationException as e:
        print("密码错误")
    else:

        result = stdout.read().decode('utf-8')
        print(result)
    finally:

        client.close()
for count in range(254):
    host = '172.25.254.%s' %(count+1)
    print(host.center(50, '*'))
    connect('uname', host)

基于密钥的上传和下载

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
tran = paramiko.Transport('172.25.254.31',22)
tran.connect(username='root',password='westos')
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
remotepath='/home/kiosk/Desktop/fish8'
localpath='/home/kiosk/Desktop/fish1'
sftp.put(localpath,remotepath)
sftp.get(remotepath, localpath)

实战:

import paramiko
from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException


class SSHUtils(object):
    '''
    ssh连接工具
    Eg:
    ssh = SSHUtils(hostname='192.168.1.60', port=50022, username='root', password=' ')
    print(ssh.cmd_run(cmd='ls'))
    '''

    def __init__(self, hostname, port, username, password):
        """
        :param hostname: ip
        :param port: 端口
        :param username: 账号
        :param password: 密码
        """
        self._hostname = hostname
        self._port = int(port)
        self._username = username
        self._password = password

    def cmd_run(self, *, cmd):
        """
        cmd操作
        :returns 返回cmd操作的返回值
        """
        _client = paramiko.SSHClient()
        _client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            _client.connect(hostname=self._hostname, port=self._port, username=self._username, password=self._password)
            _result = _client.exec_command(str(cmd))
            print(_result)
        except NoValidConnectionsError:
            return '连接失败'
        except AuthenticationException:
            return '账号密码错误'
        return _result[1].read().decode('utf-8')

    def sftp_run(self, location_file_path, obj_file_path, download=False):
        """
        sftp上传文件 或 下载文件
        :param location_file_path: 本地文件路径
        :param obj_file_path: 服务器文件路径
        :param download: 是否下载文件 默认:False
        :return: Null
        """
        tran = paramiko.Transport(self._hostname, self._port)
        tran.connect(username=self._username, password=self._password)
        sftp = paramiko.SFTPClient.from_transport(tran)
        if download:
            sftp.get(obj_file_path, location_file_path)
        else:
            sftp.put(location_file_path, obj_file_path)
        tran.close()
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐