自动重置密码

news2024/11/25 1:01:04

在运维工作中为用户重置密码是常见的操作,虽然手工运行 passwd 命令就可以很方便地设置,但在用户忘记密码后还需要管理员操作。在用户数量很大时也是不小的工作量。因此为用户提供工具来自动重置密码就很有必要。

技术方案

技术方案比较简单,用户在网页上选择重置密码,应用服务即向帐号服务器发出为用户重置密码的请求,然后将新密码通过邮件或其它安全方式发送给用户。

但是帐号服务器重置的密码通常为一次性密码,没有其它选择,导致使用很不方便。但别是对芯片等行业,用户需要先登录ETX/VDI才能使用系统。因此应用服务需要自动为用户通过passwd命令重置密码。

passwd 命令为交互式命令,因此需要借助 expect 来自动化重置密码。在 Python 中已经有 pexpect 模块来简化我们的工作了。

示例代码如下:

import os
import secrets
import string
import traceback
import pexpect

def genPasswd(length=10,numDigit=3,numSchar=1,sChar='@#*_='):
    alphabet = string.ascii_letters + string.digits + sChar
    password = ''
    while True:
        password = ''.join(secrets.choice(alphabet) for i in range(length))
        if (any(c.islower() for c in password) and
            any(c.isupper() for c in password) and
            sum(not c.isalnum() for c in password) == numSchar and
            sum(c.isdigit() for c in password) >= numDigit):
            break
    return password

class userHandler():
    def __init__(self, request):
        ...
        pass

    def changePassword(self):
        EMSG = ''
        try:
            opass = self._tmpPass     # 一次性密码
            npass = genPasswd()       # 新密码
            self._userPass = npass

            cmd = f"su {self._account} -c passwd"

            prompt_00 = ".*(press RETURN).*"
            prompt_01 = "Current Password:"
            prompt_02 = "New password:"
            prompt_03 = "Retype new password:"
            prompt_04 = "passwd: all authentication tokens updated successfully."
            pattern = [prompt_00, prompt_01, prompt_02, prompt_03, prompt_04, pexpect.EOF, pexpect.TIMEOUT]

            logfile = os.path.join(self._config['TMPDIR'], f"{self._account}.log")
            logfd = open(logfile,'wb')

            cpw = pexpect.spawn(cmd)
            cpw.logfile = logfd 

            succeeded = False 
            count = 0
            while count < 6:
                count += 1
                index = cpw.expect(pattern)
                if index == 0:
                    logging.info(f'check {prompt_00} before: {cpw.before} after: {cpw.after}')
                    cpw.sendline('')
                elif index == 1:
                    logging.info(f'check {prompt_01} before: {cpw.before} after: {cpw.after}')
                    cpw.sendline(opass)
                elif index == 2:
                    logging.info(f'check {prompt_02} before: {cpw.before} after: {cpw.after}')
                    cpw.sendline(npass)
                elif index == 3:
                    logging.info(f'check {prompt_03} before: {cpw.before} after: {cpw.after}')
                    cpw.sendline(npass)
                elif index == 4:
                    logging.info(f'check {prompt_04} before: {cpw.before} after: {cpw.after}')
                    cpw.close(force=True)
                    succeeded = True
                    break
                elif index == 5:
                    logging.info(f'EOF before: {cpw.before} after: {cpw.after}')
                    cpw.close(force=True)
                    break
                elif index == 6:
                    logging.info(f'TIMEOUT before: {cpw.before} after: {cpw.after}')
                    cpw.close(force=True)
                    break
        
            if succeeded and os.path.exists(logfile):
                os.unlink(logfile)

            if succeeded:
                logging.info(f"Change pass succeeded for {self._account}")
            else:
                logging.info(f"Change pass failed for {self._account}")
                EMSG = f"Change password failed for {self._account}"

        except Exception as e:
            logging.error(f"Change password failed for {self._account}. Error: {str(e)}, stack: {traceback.format_exc()}")
            EMSG = f"Change password failed for {self._account}"

        return EMSG

pexpect 支持将每次匹配的环境保留到日志文件中。在以上示例程序中,如果重置密码成功将删除日志以免占用空间,如果失败则保留日志文件以便分析失败原因。

以上示例脚本假设运行脚本的帐号能切换到用户身份不需要密码,如果以普通帐号运行此脚本,还需要增加一点代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1360866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

和鲸社区数据分析每周挑战【第一百二十一期:电商店铺经营分析】

和鲸社区数据分析每周挑战【第一百二十一期&#xff1a;电商店铺经营分析】 文章目录 和鲸社区数据分析每周挑战【第一百二十一期&#xff1a;电商店铺经营分析】一、数据文档二、探索性数据分析三、品类销售效果评估四、用户参与活动优惠的购物行为分析五、不同订单来源对购买…

Qt实现文本编辑器(二)

上一章节讲述了如何制作文本编辑页面&#xff0c;以及应该有哪些功能需要实现&#xff0c;只是做了展示效果&#xff0c;实际的点击事件并没有处理。今天来具体讲解下是如何实现菜单栏以及工具栏上对应的需求吧~ 功能实现 功能&#xff1a; 1、动作消息触发 2、具体功能&am…

idea设置注释在鼠标当前位置,使其不从顶格位置添加注释

idea设置注释在鼠标当前位置&#xff0c;使其不从顶格位置添加注释 默认情况下&#xff0c;注释都是从改行的顶格开始&#xff0c;看起来不太美观而且不易清除分级 设置让其从代码处开始&#xff0c;步骤&#xff1a;File–>Sttings–>Editor–>Code Style &#xff…

使用 CompletableFuture 分批处理任务

一、无返回值任务函数 // 数据分批 List<List<StatisticsDTO>> batches Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<Void>> futures new ArrayList<>(batches.size());// 数据处理 for (int i 0; i < batches…

C++:类和对象(3)

目录 1.构造函数调用规则 2.深拷贝和浅拷贝 3.初始化列表 4.类对象作为类成员 1.构造函数调用规则 默认情况下&#xff0c;C编译器至少给类添加三个函数&#xff1a; 1.默认构造函数(无参&#xff0c;函数体为空) 2.默认析构函数(无参&#xff0c;函数体为空) 3.默认拷贝构…

GNSS位移监测站对尾矿库坝体表面位移进行自动化监测

表面位移监测&#xff1a;通过GNSS位移监测站对尾矿库坝体表面位移进行自动化监测&#xff0c;掌握尾矿坝整体表面位置的变化及其变化速率&#xff08;包括平面位移和垂直沉降&#xff09;&#xff0c;确定尾矿坝坝体整体位移变形的情况&#xff0c;是确定尾矿库安全性的重要指…

一文讲透SPSS相关性分析结果怎么看?

推荐采用《SPSS统计分析入门与应用精解&#xff08;视频教学版&#xff09;》 杨维忠、张甜 清华大学出版社“5.1 双变量相关分析” 的解答。 本节内容选自《SPSS统计分析入门与应用精解&#xff08;视频教学版&#xff09;》 杨维忠、张甜 清华大学出版社“5.1 双变量相关分析…

Protobuf 编码结构

编码结构 什么是protobuf protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法&#xff0c;可用于数据通信协议和数据存储等&#xff0c;它是 Google 提供的一个具有高效协议数据交换格式工具库&#xff0c;是一种灵活、高效和自动化机制的结构数据序列…

24款奔驰C260L升级C63包围 渣男的外表

今天店里来了一台24款奔驰C260L 一提车就过来升级 我们公司还有包上牌服务 车主说 升级完包围 帮忙安排一下 原车的包围 没有那么霸气 特别是后杠 光溜溜的 升级后 四出尾喉 尾翼 直接牌面就起来了&#xff0c;星骏汇小许Xjh15863

真核微生物基因序列鉴定工具EukRep工具的安装和详细使用方法

介绍 EukRep是一种用于鉴定并分析环境中的真核微生物的工具。它基于16S rRNA基因序列&#xff0c;可以帮助研究人员确定和分类环境样品中存在的真核微生物群落。 EukRep 从宏基因组数据集中分类真核和原核序列 安装 要求Python3 推荐使用conda安装&#xff1a; $ conda cre…

HUAWEI华为荣耀MagicBook X 15酷睿i5-10210U处理器集显(BBR-WAH9)笔记本电脑原装出厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1YVcnOP5YKfFOoLt0z706rg?pwdfwp0 提取码&#xff1a;fwp0 MagicBook荣耀原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为/荣耀电脑管家等预装程序 文件格式&#xff1a;esd/wim/swm 安装…

【项目实战】分布式计算和通信框架(AKKA)入门介绍

一、AKKA是什么&#xff1f; Akka是一个用于构建高并发、分布式、可容错、事件驱动的应用程序的工具包和运行时。它基于Actor模型&#xff0c;提供了一种高效的并发编程模型&#xff0c;可以轻松地编写出高并发、分布式、可容错的应用程序。Akka还提供了一些常用的组件&#xf…

DMX512输出协议详解

目录 ​编辑 1、DMX512协议简介 2、DMX512协议分析 DMX512指令帧介绍 DMX512信息包 3、DMX512接口电路 4、参考代码 1、DMX512协议简介 DMX512是一种用于舞台灯光控制的数字传输协议。它是由美国舞台灯光协会&#xff08;USITT&#xff09;于1990年发布的工业标准&…

利用小红书笔记详情API:为内容运营提供强大的支持

利用小红书笔记详情API&#xff0c;内容运营者可以获得对小红书平台上的笔记内容的深入洞察&#xff0c;从而为其运营工作提供强大的支持。以下是该API如何支持内容运营的几个关键方面&#xff1a; 获取笔记内容与数据&#xff1a; API允许内容运营者直接获取小红书平台上的笔记…

Python轴承故障诊断 (九)基于VMD+CNN-BiLSTM的故障分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

57.6K star!一个免费开源的 API 开发生态系统

&#xff01;&#xff01;&#xff01;文末有链接&#xff01;&#xff01;&#xff01; 小伙伴们&#xff0c;你们有没有遇到这样的问题呢&#xff1f;当你作为前端开发者和后端开发者一起协同工作时&#xff0c;联调接口成了必须要做的工作。 而为了验证接口的稳定性和安全…

Python武器库开发-武器库篇之子域名扫描器开发(四十一)

Python武器库开发-武器库篇之子域名扫描器开发(四十一) 在我们做红队攻防或者渗透测试的过程中&#xff0c;信息收集往往都是第一步的&#xff0c;有人说&#xff1a;渗透的本质就是信息收集&#xff0c;前期好的信息收集很大程度上决定了渗透的质量和攻击面&#xff0c;本文将…

LabVIEW在高级结构监测中的创新应用

LabVIEW在高级结构监测中的创新应用 LabVIEW作为一个强大的系统设计平台&#xff0c;其在基于BOTDA&#xff08;光时域反射分析&#xff09;技术的结构监测中发挥着核心作用。利用LabVIEW的高效数据处理能力和友好的用户界面&#xff0c;开发了一个先进的监测系统。该系统专门…

ThreadPoolExecutor中的keepAliveTime详解

一.keepAliveTime的概念&#xff1a; keepAliveTime的单位是纳秒&#xff0c;即1s1000000000ns&#xff0c;1秒等于10亿纳秒。 keepAliveTime是线程池中空闲线程等待工作的超时时间。 当线程池中线程数量大于corePoolSize&#xff08;核心线程数量&#xff09;或设置了allowCor…

反诈宣传进社区 安全防护零距离

反诈宣传进社区 安全防护零距离 广州党建引领城中村治理志愿服务项目之“我爱我家”助建幸福网格项目&#xff0c;由中共广州市委政法委员会、广州市精神文明建设委员会办公室、广州市民政局广州市文化电旅游局、广州市来穗人员服务管理局、广州市消防救援支队、共青团广州市委…