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。这个选项用于从标准输入 管道读入新的密码