首页 > 其他分享 >paramiko模块及公钥私钥

paramiko模块及公钥私钥

时间:2023-01-12 17:34:06浏览次数:64  
标签:文件 私钥 self transport 及公钥 ssh paramiko

paramiko模块及公钥私钥

paramiko基础使用

paramiko模块提供连接linux服务器的功能,我们可以通过用户密码登录,也可以通过公钥私钥方式登录,连接并登录后,可以通过python代码反射执行linux命令,针对一些常用命令,这个模块也做了一定程度的python代码封装。

paramiko是第三方模块,需要使用pip下载

 pip3.8 install paramiko -i https://pypi.tuna.tsinghua.edu.cn/simple/

基本使用

import paramiko

# 用户名和密码的方式
# 创建SSH对象(固定)
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机(固定)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='10.0.0.200', port=22, username='root', password='123')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
"""
stdin 支持传额外的命令
stdout 命令正确的执行结果
stderr 命令错误的执行结果
"""
# 获取命令结果  还可以利用stdin继续传值 eg:-y确认
result = stdout.read()
print(result.decode('utf8'))
# 关闭连接
ssh.close()

这个模块执行终端命令并得到结果的使用方式可以对比subprocess模块,都用到了一种类似于管道的结构。

公钥私钥

在上述的基本使用方法中,我们将用户密码直接放在了py文件中,如果py文件遭到了查看,也就暴露了服务器的用户密码,这十分的不安全。

我们可以采取公钥私钥的校验策略,避免远程连接过程中,用户名密码被意外偷看的情况。而且还可以提高文件传输过程中的安全性,是一种成熟的安全传输方案,具体校验的过程可以参考下文:

公钥、私钥、签名、数字证书的关系

产生公钥私钥

window电脑可以产生公钥私钥,但并不支持直接发送,需要一些软件的支持,这就要用到git软件:

git官网

git官网下载

下载了安装包后,点开基本无脑下一步就可以用了(用默认配置即可),win11最好搞一个桌面快捷方式会比较方便(因为win11‘优化’了右击菜单栏,让我们看远离各种额外选项的纷扰)

image

在安装成功后,我们点击更多选项中的Git Bash Here即可打开软件,其界面就是一个终端界面。

image

我们可以通过指令来产生公钥私钥:

ssh-keygen -t rsa

然后,指令会询问存放位置和文件设置密码(因为文件很重要,所以我们一般要多做一层保险)

image

当我们产生了这个公钥私钥后,先发送公钥和自己的身份给服务端:

ssh-copy-id -i 公钥文件绝对路径  用户名@服务器ip地址

在这条指令中,我们发送了一个身份,服务器会对身份做确认,即要求输入密码,输入后,我们以后就可以通过私钥而不需要用户密码来访问服务器了。

image

paramiko模块使用公钥私钥

import paramiko

# 通过文件读取本地私钥,可以设置password,我们这里没有设置
private_key = paramiko.RSAKey.from_private_key_file(r"C:\Users\ASUS\.ssh\id_rsa")

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='服务器ip', port=22, username='root', pkey=private_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
print(result.decode('utf-8'))
# 关闭连接
ssh.close()

paramiko模块其他操作

上传下载文件

transport = paramiko.Transport(('123.206.16.61', 22))
transport.connect(username='root', password='123')
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
sftp.put("本地文件路径", '远程服务器路径')  # 注意上传文件到远程某个文件下 文件必须存在

# 下载文件
sftp.get('远程服务器文件路径', '本地文件路径')  # 将远程文件下载到本地并重新命令
transport.close()

将上传下载功能封装成类

import paramiko

class SSHProxy(object):
    def __init__(self, hostname, port, username, password):  # 当然也可以封装成用私钥使用
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.transport = None

    def open(self):  # 与服务器建立链接
        self.transport = paramiko.Transport((self.hostname, self.port))
        self.transport.connect(username=self.username, password=self.password)

    def command(self, cmd):  # 正常执行命令的连接
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport

        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        return result

    def upload(self, local_path, remote_path):  # 上传文件的功能
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()
        
    def download(self, remote_path, local_path):  # 下载文件的功能
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.get(remote_path, local_path) 
		transport.close()
		
    def close(self):   # 关闭链接
        self.transport.close()

    def __enter__(self):  # 对象执行with上下文会自动触发
        self.open()
        return self 

    def __exit__(self, exc_type, exc_val, exc_tb): 
        self.close()
        
        
# 类的使用
with SSHProxy("服务器ip",22,'用户','密码') as ssh:
    # 上下文管理触发开启上传下载链接
    ssh.command('df')  # 可以执行一些命令
    ssh.command('df')
    ssh.upload(r'本地文件', '服务端文件地址')  # 上传文件
    # with子代码结束关闭链接

paramiko官方文档

paramiko官方英文文档

标签:文件,私钥,self,transport,及公钥,ssh,paramiko
From: https://www.cnblogs.com/Leethon-lizhilog/p/17047309.html

相关文章