Python——paramiko模块实现ssh和sftp(scp)

本文介绍Paramiko模块的安装与使用,包括SSH连接、批量SSH连接及文件上传下载等功能,并提供详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

paramiko模块是使用Python编写的一个第三方模块,遵循了SSH2协议,支持加密和认证的方式进行远程连接。利用该模块,可以实现ssh远程连接和sftp协议进行文件传输(就相当于我们的scp)

安装

在本机安装,直接执行命令:pip install paramiko
由于我们是在Pycharm中进行验证和开发,所以我们直接在Pycharm中进行安装(因为Pycharm是基于虚拟python环境的)
进入Pycharm的设置中,进行添加。
在这里插入图片描述
在这里插入图片描述

paramiko实现ssh连接paramiko.SSHClient()

我们通过一个示例来理解如何实现ssh

import paramiko

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

"""
The authenticity of host '172.25.254.254 (172.25.254.254)' can't be established.
ECDSA key fingerprint is 4c:98:51:43:65:46:66:fd:af:5b:ea:cc:d9:97:c0:74.
Are you sure you want to continue connecting (yes/no)?
"""
# 因为可能会出现上面的提示,使用下面的方法可以自动填写yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 建立连接
client.connect(
    hostname='172.25.18.1',
    username='root',
    password='redhat'
)

# 执行操作,获取操作对应的标准输入,标准输出,标准错误
stdin,stdout,stderr = client.exec_command('echo hellomac')

# 获取执行结果,先使用read()读到,再需要解码才能正确显示
print(stdout.read().decode('utf-8'))
# 关闭连接
client.close()

结果:
在这里插入图片描述

paramiko实现批量ssh连接

通常情况下,我们会把远程主机的相关信息写到一个文件里,当我们需要批量远程连接的时候,可以利用with上下文管理进行主机信息文件读取,然后将读取到的信息分别使用paramiko定义的函数进行连接.
首先,我们在/tmp目录下新建一个文件hosts,写入相关信息:
在这里插入图片描述
其中,第一个信息是正确的,第二个ip不存在,第三个密码故意写错.
接下来我们用paramiko模块尝试批量ssh连接.

from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
import paramiko

def multi_connection(cmd,hostname,username,passwd):
    try:
        # 尝试连接
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(
            hostname=hostname,
            username=username,
            password=passwd
        )
    # 各种异常处理
    except NoValidConnectionsError as CE:
        return '主机%s连接失败:%s' %(hostname,CE)
    except AuthenticationException as AE:
        return '主机%s密码错误:%s' %(hostname,AE)
    except Exception as E:
        return '发生未知错误:%s' %E
    else:
        # 未发生异常,说明连接成功
        print('主机%s连接成功' %hostname)
        print("执行操作:%s" %cmd)
        stdin,stdout,stderr = client.exec_command(cmd)
        res = stdout.read().decode()
        return res
    finally:
        # 完成后关闭连接
        client.close()


with open('/tmp/hosts') as f:
    # 逐行遍历文件
    for line in f:
        #   对每行的内容进行去除空格和以:分隔,分别对应ip 用户名 密码
        hostname,username,passwd = line.strip().split(':')
        res = multi_connection('free -m ',hostname,username,passwd)
        print(res)

结果:
在这里插入图片描述

paramiko实现文件上传下载(SFTP)

上传:

from paramiko.ssh_exception import AuthenticationException,NoValidConnectionsError
import paramiko

# 定义上传函数,传入参数分别是远程主机ip,密码,本地文件,远程文件
def put_file(hostname,passwd,localfile,romotefile):
    try:
        transfer = paramiko.Transport((hostname,22))
        transfer.connect(username='root',password=passwd)
        sftp = paramiko.SFTPClient.from_transport(transfer)
    except Exception as E:
        print('出现错误:',E)
    else:
        sftp.put(localfile,romotefile)
        print('上传成功!')
    finally:
        sftp.close()

put_file('172.25.18.1','redhat','/tmp/hosts','/mnt/1519')

下载:

import paramiko

# 定义下载函数,传入参数分别是远程主机ip,密码,本地文件,远程文件
def get_file(hostname,passwd,localfile,romotefile):
    try:
        transfer = paramiko.Transport((hostname,22))
        transfer.connect(username='root',password=passwd)
        sftp = paramiko.SFTPClient.from_transport(transfer)
    except Exception as E:
        print('出现错误:',E)
    else:
        sftp.get(romotefile,localfile)
        print('下载成功!')
    finally:
        sftp.close()

get_file('172.25.18.1','redhat','/tmp/1524','/mnt/1519')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值