目录
paramiko模块
paramiko模块
功能:通过python代码连接Linux服务器并执行相关操作,并且支持用户名密码连接和公钥私钥连接
paramiko模块是第三方模块,需要提前下载
pip install 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()
公钥私钥
目的:为了避免使用用户名密码的时候信息泄露造成安全性问题
上述的操作都可以通过查看保存的py文件查看到用户名和密码,为了避免这种情况的产生,我们采用远程校验公钥私钥,可以提高文件传输的安全性。
# 简单理解
1.每台计算机都可以拥有自己的公钥和私钥
2.你只需要将公钥交给别人,以后通过比对私钥就可以证明你的身份
# 详细理解
可以参考鲍勃的公钥私钥,如下链接
如何产生公钥私钥?
mac电脑:终端可以直接产生并发送给服务端
windows电脑:只支持产生公钥私钥并不支持发送,需要借助于第三方软件,比如:git软件
git软件
桌面空白区域鼠标右键即可查看是否安装成功,在安装成功后,点击开始界面的更过选择 git bash here打开git软件,其界面就是一个终端界面
- 产生公钥和私钥
ssh-keygen -t rsa 连续按三下回车即可
- 拷贝公钥到远程服务器
ssh-copy-id -i 公钥文件绝对路径 用户名@服务器ip地址
# 公钥和私钥(先将公钥保存到服务器上)
paramiko模块使用公钥私钥
import paramiko
# 读取本地私钥
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='123.206.16.61', 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模块上传下传文件
import 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
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='jason', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
transport.close()
paramiko模块上传下传封装成类
# 以下代码不用死记硬背 知道原理会用即可
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()
# 步骤2:下面的先别拷贝
def close(self):
self.transport.close()
def __enter__(self): # 对象执行with上下文会自动触发
self.open()
return self # 这里发挥上面with语法内的as后面拿到的就是什么
def __exit__(self, exc_type, exc_val, exc_tb): # with执行结束自动触发
self.close()
"""
推到步骤:
1.初次封装
只有init、open、command、upload、close方法
这个时候要想执行和上传下载都支持必须先执行open方法,所有操作完毕之后执行close方法
obj = SSHProxy(...)
obj.open()
obj.command()
obj.upload()
...
obj.close()
2.进阶升华
每次都需要先open最后再close 这种操作跟我们之前python基础问文件操作有点类似
文件操作最后利用with上下玩完成简便写法 但是paramiko模块产生的对象默认是不支持with语法的
obj = SSHProxy(...)
with obj 报错 但是报错信息里面有提示 说对象里面没有__enter__方法 也就是说with会自动触发对象__enter__方法
"""
if __name__ == '__main__':
with SSHProxy("127.0.0.1",22,'root','jason123') as ssh:
# 拿到改对象后就可以无限制的在一个链接内执行命令并上传下载文件
ssh.command('df')
ssh.command('df')
ssh.upload(r'D:\jason\s10\day01\4.基于paramiko操作\xx', '/data/s27/xx')
标签:公钥,私钥,self,transport,及公钥,ssh,paramiko
From: https://www.cnblogs.com/zhanglanhua/p/17070826.html