zoukankan      html  css  js  c++  java
  • python3之paramiko模块

    paramiko的SSHClient常用命令介绍

    connect():

    实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。

    常用参数
    hostname 连接的目标主机
    port=SSH_PORT 指定端口
    username=None 验证的用户名
    password=None 验证的用户密码
    pkey=None 私钥方式用于身份验证
    key_filename=None 一个文件名或文件列表,指定私钥文件
    timeout=None 可选的tcp连接超时时间
    allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
    look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
    compress=False, 是否打开压缩

    set_missing_host_key_policy():

    设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
      
    AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
    WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
    RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项

    exec_command():在远程服务器执行Linux命令的方法

    open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象

    # 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
      
    sftp = client.open_sftp()
    sftp.put('test.txt','text.txt')

    paramiko模块介绍

    paramiko模块提供了基于ssh连接,进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装

    paramiko的使用方法

    以kali为实验对象,ip:192.168.41.147

    1)基于用户名和密码的sshclient方式登陆

    #!/usr/bin/env python
    #coding:utf8
    
    import paramiko
    #创建sshclient对象
    ssh = paramiko.SSHClient()
    #允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #调用connect方法连接服务器
    ssh.connect(hostname='192.168.41.147',port=22,username='root',password='toor')
    while True:
        input_command = input('>>>:')
        if input_command == 'quit':
            break
        #执行命令,输出结果在stdout中,如果是错误则放在stderr中
        stdin,stdout,stderr = ssh.exec_command(input_command)
        result = stdout.read() #read方法读取输出结果
        if len(result) == 0:  #判断如果输出结果长度等于0表示为错误输出
            print(stderr.read())
        else:
            print(str(result,'utf-8'))
    ssh.close()

     

    ConfigParser简介

    ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。

    [db]
    db_host = 127.0.0.1
    db_port = 69
    db_user = root
    db_pass = root
    host_port = 69
    
    [concurrent]
    thread = 10
    processor = 20

    括号“[ ]”内包含的为section。紧接着section 为类似于key-value 的options 的配置内容

    二、ConfigParser 初始化对象

    使用ConfigParser 首选需要初始化实例,并读取配置文件:

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")

    三、ConfigParser 常用方法

    1、获取所用的section节点

    # 获取所用的section节点
    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    print(config.sections())
    #运行结果
    # ['db', 'concurrent']

    2、获取指定section 的options。即将配置文件某个section 内key 读取到列表中:

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    r = config.options("db")
    print(r)
    #运行结果
    # ['db_host', 'db_port', 'db_user', 'db_pass', 'host_port']

    3、获取指点section下指点option的值

    import configparser
    config = configparser.ConfigParser()
    config.read("ini", encoding="utf-8")
    r = config.get("db", "db_host")
    # r1 = config.getint("db", "k1") #将获取到值转换为int型
    # r2 = config.getboolean("db", "k2" ) #将获取到值转换为bool型
    # r3 = config.getfloat("db", "k3" ) #将获取到值转换为浮点型
    print(r)
    #运行结果
    # 127.0.0.1

    更多的知识点https://www.cnblogs.com/ming5218/p/7965973.html

    封装方法,隐藏属性:

    #config.ini文件
    [ssh]
    host=192.168.41.147
    port=22
    user=root
    pwd=toor
    timeout=1.1
    #封装ssh类
    #!/usr/bin/env python
    #coding:utf8
    import configparser,paramiko
    class parmikoclient(object):
        def __init__(self,ini_file):
            self.config=configparser.ConfigParser()
            self.config.read(ini_file)
            self.host = self.config.get('ssh','host')
            self.port = self.config.get('ssh', 'port')
            self.user = self.config.get('ssh', 'user')
            self.pwd = self.config.get('ssh', 'pwd')
            self.timeout = self.config.get('ssh', 'timeout')
            self.client=paramiko.SSHClient()
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.client.connect(hostname=self.host,port=self.port,username=self.user,password=self.pwd)
        def run_ssh(self,cmd_command):
            # 执行命令,输出结果在stdout中,如果是错误则放在stderr中
            stdin,stdout,stderr = self.client.exec_command(cmd_command)
            result = stdout.read()  # read方法读取输出结果
            if len(result) == 0:  # 判断如果输出结果长度等于0表示为错误输出
                print(stderr.read().decode())
            else:
                print(str(result, 'utf-8'))
        def close(self):
            self.client.close()
    if __name__ == '__main__':
        client_cmd = parmikoclient('config.ini')
        while True:
            cmd_input=input('>>>:')
            if cmd_input == 'quit':      //修改成这样的顺序,就不会出现错误,或者未找到命令
                client_cmd.close()
                break
            client_cmd.run_ssh(cmd_input)

     AWD中默认ssh密码批量修改

    我自己收集到的py2批量改脚本,没有用到队列,可能会出现资源争抢导致的混乱

    #-*- coding: utf-8 -*-
    #!/usr/bin/python 
    import paramiko
    import threading
    
    def ssh_brute(hostname,username,passwd,cmd):
        try:
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(hostname,22,username,passwd,timeout=5)
            for m in cmd:
                stdin, stdout, stderr = ssh.exec_command(m)
    #           stdin.write("Y")   #简单交互,输入 ‘Y’ 
                out = stdout.readlines()
                #屏幕输出
                for o in out:
                    print (o)
            print('%s	OK
    '%(ip))
            ssh.close()
        except :
            print('%s	Error
    '%(ip))
    
    
    if __name__=='__main__':
        cmd = ['touch a.txt']#你要执行的命令列表
        username = "root"  #用户名
        passwd = "helloworld"    #密码
        threads = [10]   #多线程
        print("Begin......")
        for i in range(1,254):
            ip = '192.168.41.'+str(i)
            a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))    
            a.start() 

    利用--stdin,不交互实现修改passwd。这个选项用于从标准输入 管道读入新的密码

     

  • 相关阅读:
    Kafka基础
    操作系统实验(一)-Shell编程
    计算机组成原理05-系统总线(下)
    计算机组成原理04-系统总线
    计算机组成原理03-概论思考
    计算机组成原理02-系统概论(下)
    计算机组成原理01-系统概论
    Python&&Pip
    我的爱情观
    node.js简介
  • 原文地址:https://www.cnblogs.com/BOHB-yunying/p/11621449.html
Copyright © 2011-2022 走看看