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软件:
下载了安装包后,点开基本无脑下一步就可以用了(用默认配置即可),win11最好搞一个桌面快捷方式会比较方便(因为win11‘优化’了右击菜单栏,让我们看远离各种额外选项的纷扰)
在安装成功后,我们点击更多选项中的Git Bash Here即可打开软件,其界面就是一个终端界面。
我们可以通过指令来产生公钥私钥:
ssh-keygen -t rsa
然后,指令会询问存放位置和文件设置密码(因为文件很重要,所以我们一般要多做一层保险)
当我们产生了这个公钥私钥后,先发送公钥和自己的身份给服务端:
ssh-copy-id -i 公钥文件绝对路径 用户名@服务器ip地址
在这条指令中,我们发送了一个身份,服务器会对身份做确认,即要求输入密码,输入后,我们以后就可以通过私钥而不需要用户密码来访问服务器了。
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官方文档
标签:文件,私钥,self,transport,及公钥,ssh,paramiko From: https://www.cnblogs.com/Leethon-lizhilog/p/17047309.html