zoukankan      html  css  js  c++  java
  • python2.0 s12 day8 _ 堡垒机前戏paramiko模块

    堡垒机前戏
    开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作
    paramiko模块是做主机管理的,他模拟了一个ssh.
    有两种形式连接形式,
    一种通过用户名密码: ssh -p 22 root@hostname
    一种是通过密钥的方式: ssh -p 22 -i ~/.ssh/dongjing-shanghai.pem root@kiri_pro01
    再连接的的语法上,有两种:
    一种是直接将连接的主机地址和端口直接传入
    一种是先把主机地址,端口,用户名,密码封装到paramiko.Transport()实例中

    SSHClient
    通过用户名密码连接的实例代码如下:
    直接调用ssh.connect() 方法
     1                     #!/usr/bin/env python3.5
     2                     #__author__:'ted.zhou'
     3                     '''
     4                     使用paramiko模块,实现SSHClient连接远程服务器
     5                     先使用用户名,密码方式
     6                     '''
     7                     import paramiko
     8 
     9                     ssh = paramiko.SSHClient()      # 创建SSH对象
    10 
    11                     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 这句很关键, 允许连接不在know_hosts文件中的主机
    12                     ssh.connect(hostname='127.0.0.1',port=7272,username='root',password='123') # 连接服务器
    13                     stdin,stdout,stderr = ssh.exec_command('df')  # 执行命令
    14                     result = stdout.read()  # 获取命令结果
    15                     ssh.close()  # 关闭连接
    16 
    17                     print(result.decode()) # 打印结果

    通过paramiko.Transport()封装:
     1                     #!/usr/bin/env python3.5
     2                     #__author__:'ted.zhou'
     3                     '''
     4                     paramiko模块SSHClient通过用户名密码连接远程服务器,
     5                     使用语法Transport()封装
     6                     '''
     7 
     8                     import paramiko
     9 
    10                     transport = paramiko.Transport(('127.0.0.1',7272))  # 实例化一个Transport()实例,传入主机的IP或者hostname 和 端口组合的元组,记住一定是元组。
    11                     transport.connect(username='root',password='123')   # 调用connect方法,设置transport的连接方式用户名和密码,
    12 
    13                     ssh  = paramiko.SSHClient()
    14                     ssh._transport = transport
    15 
    16                     stdin,stdout,stderr = ssh.exec_command('df')
    17                     result = stdout.read()
    18 
    19                     print(result.decode())
    20                     transport.close()


    通过sshkey方式连接的实例:
            python2.x写法和python3.x不同
            python2.x 代码如下:
                    直接调用ssh.connect() 方法
                        #!/usr/bin/env python3.5
                        #__author__:'ted.zhou'
                        '''
                        使用paramiko.SSHClient()的sshkey方式连接远程服务器
    
                        '''
                        import paramiko
    
                        # 加载密钥文件
                        private_key = paramiko.RSAKey.from_private_key_file('/Users/tedzhou/.ssh/id_rsa')
                        # print(type(private_key))
                        ssh = paramiko.SSHClient()      # 创建SSH对象
                        #
                        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 允许连接不在know_hosts文件中的主机
    
                        # 开始连接服务器,这里注意再python2.x中是这么写,3.x中报错,应该写成 key_file = '/Users/tedzhou/.ssh/id_rsa'
                        ssh.connect(hostname='127.0.0.1',port=7272,username='root',key=private_key)
    
                        # 获取远程主机执行命令的结果
                        stdin,stdout,stderr = ssh.exec_command('ifconfig')
                        result = stdout.read()
                        print(result.decode())
                        ssh.close()
                    python3.x的写法如下:
     1                     #!/usr/bin/env python3.5
     2                     #__author__:'ted.zhou'
     3                     '''
     4                     使用paramiko.SSHClient()的sshkey方式连接远程服务器
     5 
     6                     '''
     7                     import paramiko
     8 
     9                     # python3.x中就不需要再加载私钥文件了.
    10                     # private_key = paramiko.RSAKey.from_private_key_file('/Users/tedzhou/.ssh/id_rsa')
    11                     ssh = paramiko.SSHClient()      # 创建SSH对象
    12                     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 允许连接不在know_hosts文件中的主机
    13                     # 开始连接服务器
    14                     ssh.connect(hostname='kiri_pro01', port=22, username='root', key_filename='/Users/tedzhou/.ssh/dongjing-shanghai.pem')
    15                     # 获取远程主机执行命令的结果
    16                     stdin,stdout,stderr = ssh.exec_command('ifconfig')
    17                     result = stdout.read()
    18                     print(result.decode())
    19                     ssh.close()
                    通过paramiko.Transport()封装:
    注释:使用Transport方式连接远程服务器,python2.x和python3.x就一样了,具体代码如下:
     1 #!/usr/bin/env python3.5
     2 
     3                     import paramiko
     4                     private_key = paramiko.RSAKey.from_private_key_file('/Users/tedzhou/.ssh/dongjing-shanghai.pem')
     5                     # '/Users/tedzhou/.ssh/dongjing-shanghai.pem'
     6                     #封装transport
     7                     transport = paramiko.Transport(('127.0.0.1',22))  #这里一定是元组
     8                     transport.connect(username='root',pkey=private_key)
     9 
    10                     # 创建SSH连接
    11                     ssh = paramiko.SSHClient()
    12                     ssh._transport = transport
    13 
    14                     # 获取执行命令的结果
    15                     stdin,stdout,stderr = ssh.exec_command('df')
    16 
    17                     result = stdout.read()
    18 
    19                     print(result.decode())
    20 
    21                     transport.close()

    通过上面例子中,发现使用paramiko.Transport()方法封装后,再调用SSHClinet()方法更好些,因为python2.x和python3.x语法一样
    而且下面使用paramiko.SFTPClient()进行文件的上传和下载,使用的语法也是paramiko.Transport()方法
    SFTPClient
    用于连接远程服务器并执行上传下载
    基于用户名密码上传下载
     1                 import paramiko
     2 
     3                 transport = paramiko.Transport(('hostname',22))
     4                 transport.connect(username='wupeiqi',password='123')
     5 
     6                 sftp = paramiko.SFTPClient.from_transport(transport)
     7                 # 将location.py 上传至服务器 /tmp/test.py
     8                 sftp.put('/tmp/location.py', '/tmp/test.py')
     9                 # 将remove_path 下载到本地 local_path
    10                 sftp.get('remove_path', 'local_path')
    11 
    12                 transport.close()

    基于公钥密钥上传下载
     1                 import paramiko
     2 
     3                 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
     4 
     5                 transport = paramiko.Transport(('hostname', 22))
     6                 transport.connect(username='wupeiqi', pkey=private_key )
     7 
     8                 sftp = paramiko.SFTPClient.from_transport(transport)
     9                 # 将location.py 上传至服务器 /tmp/test.py
    10                 sftp.put('/tmp/location.py', '/tmp/test.py')
    11                 # 将remove_path 下载到本地 local_path
    12                 sftp.get('remove_path', 'local_path')
    13 
    14                 transport.close()


  • 相关阅读:
    xmlHttpRequest参数
    蒙哥马利:“沙漠之狐”猎手
    c# as is 类型转换
    值类型和引用类型
    BuuctfmiscN种方法解决
    Buuctfmisc二维码
    Buuctfweb[HCTF 2018]WarmUp
    Buuctfmisc大白
    map用索引作下标之后,再插值时报错.
    c++ stl 的string 的size() legth()区别
  • 原文地址:https://www.cnblogs.com/zhming26/p/5562782.html
Copyright © 2011-2022 走看看