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\tOK\n'%(ip))
        ssh.close()
    except :
        print('%s\tError\n'%(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。这个选项用于从标准输入 管道读入新的密码

 

 

posted @ 2019-10-04 09:53  yunying  阅读(442)  评论(0编辑  收藏  举报