首页 > 其他分享 >paramiko模块

paramiko模块

时间:2022-10-24 17:37:21浏览次数:80  
标签:公钥 私钥 self paramiko 模块 transport ssh

paramiko模块


paramiko模块功能:python代码连接服务器并执行相关操作。连接服务器方式:用户名密码的方式和公钥私钥的方式

下载

pip3 install paramiko

用户名和密码的方式

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('ip a')
stdin, stdout, stderr = ssh.exec_command('ls')
"""
stdin       输入的内容
stdout      输出的内容
stderr      错误的内容
"""
# 获取结果
res = stdout.read().decode('utf-8')  # 基于网络传输 该结果是一个bytes类型
print(res)
# 断开链接
ssh.close()

公钥私钥

1、公钥与私钥的作用是:

用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密。

公钥与私钥是用来验证服务端与客户端之间发送的报文信息是否被篡改了。

2.公钥与私钥原理(简单的案例)

1)鲍勃有两把钥匙,一把是公钥,另一把是私钥

2)鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

3)苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

4)鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

完整的解释:https://blog.csdn.net/qq_34771403/article/details/73481172

如何获取公钥私钥?下载git打开端口输入ssh-keygen -t rsa,连续按enter即可,然后就在电脑上生成公钥和私钥了。然后就需要把公钥传到服务器上,使用‘ssh-copy-id -i 公钥文件路径 usrname@hostname’。

import paramiko
# 读取本地私钥
private_key = paramiko.RSAKey.from_private_key_file(r'C:\Users\oldboy\.ssh\id_rsa')
# 创建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', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls /')
# 获取命令结果
result = stdout.read().decode('utf-8')
print(result)
# 关闭连接
ssh.close()

数据传输及代码封装


# 用户名密码方式
import paramiko
# 用户名和密码
transport = paramiko.Transport(('10.0.0.200', 22), )
transport.connect(username='root', password='123')
sftp = paramiko.SFTPClient.from_transport(transport)
# 上传文件
# sftp.put("a.txt", '/data/tmp.txt')  # 注意上传文件到远程某个文件下 文件必须存在
# 下载文件
sftp.get('/data/tmp.txt', 'hhh.txt')  # 将远程文件下载到本地并重新命令
transport.close()

# 公钥私钥方式
import paramiko
private_key = paramiko.RSAKey.from_private_key_file(r'C:\Users\oldboy\.ssh\id_rsa')
transport = paramiko.Transport(('10.0.0.200', 22))
transport.connect(username='root', 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()

封装成对象

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 close(self):
        self.transport.close()

    def __enter__(self):
        print('with开始')
        self.open()
        return self  # 该方法返回什么 with ... as 后面就拿到什么

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with结束')
        self.close()

if __name__ == '__main__':
    with SSHProxy(hostname='10.0.0.200',port=22,username='root',password='123') as obj:
        print(obj.command('ip a'))
        obj.upload(r'a.txt','/data/b.txt')

标签:公钥,私钥,self,paramiko,模块,transport,ssh
From: https://www.cnblogs.com/wwjjll/p/16822163.html

相关文章

  • modbus输入模块跟输出模块还有控制模块有什么区别
    模拟量是表示在一定范围内连续变化的任意取值,跟数字量是相对立的一个状态表示。通常模拟量用于采集和表示事物的电压电流或者频率等参数。模拟量输入模块是一款可以采集模拟......
  • 拆解:AFEM-8231和SKY58290-20前端模块 苹果iPhone 14Pro Max
    近期,iFixit对苹果最新iPhone14的拆解终于完成了,认为这次iPhone14最值得点赞的不是更强的处理器,也不是卫星SOS功能和更大的摄像头,而是完全重新设计的内部结构——显示面......
  • 制作arduino蓝牙模块接收app(App inventor的简单使用)
    组件如下:APP界面如下(码了logo):功能概述选择设备进行蓝牙选择接收arduino发送的文本,存储到变量中,显示在温湿度显示的标签中断开连接可以断开蓝牙连接,并让断开......
  • Python 中 logging 模块的使用
    Python中logging模块的使用logging模块简介Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同......
  • Python的venv模块
    20221024python的venv可以在制定文件夹下创建一个虚拟环境,不使用的时候删除该文件夹即可。python3-mvenvmyvenv参考:[1]https://blog.csdn.net/weixin_39862899/a......
  • 嵌入式工业级5.8G无线图传模块
    无线图传领域,2.4G干扰会大,基本靠谱选择就是ISM5.8G,对于图像的传输质量要求很高,尽量保障体验到无延时不卡顿实时传输!大概的主流应用如下:应用场景一:工业级4G路由......
  • dremio kernel 模块之DremioSqlDialect
    参考图实际上是继承自calcite的sql方言类  arp扩展的说明目前官方的arp主要是对于sql数据库类型的高级支持,当然需要依赖社区版的arp公共包dremio-ce-jdbc-pluginar......
  • dremio 社区模块的一些说明
    我以前简单说明过dremio依赖的一些社区版的包(木有开源的)以下做一个简单的总结说明社区版模式的开发模式基于独立包进行扩展扩展使用了配置动态加载或者直接引用模式,比如sch......
  • 在线问题反馈模块实战(十六)​:实现查详情功能
    ......
  • json模块
    目录json模块简介json.dumps()、json.loads()json.dump()、json.load()json模块简介不同的编程语言之间的数据无法直接交互,需要中间有一个翻译官就是json模块。所有......