news 2026/9/30 10:22:45

麒麟V10中passwd命令报错‘module is unknown’深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
麒麟V10中passwd命令报错‘module is unknown’深度解析

1. 为什么一个看似简单的passwd命令,会让麒麟V10用户反复报错“模块未知”?

在国产操作系统生态里,我见过太多次这样的场景:一位刚从Windows转岗的运维工程师,或者一位正在银河麒麟V10上部署业务的开发同事,信心满满地敲下passwd username,回车后却只看到一行冰冷的报错:

passwd: module is unknown

不是权限不足,不是路径错误,更不是拼写失误——而是整个密码修改流程在底层被“拦腰截断”。这行报错背后,不是命令本身坏了,而是它所依赖的PAM(Pluggable Authentication Modules)认证框架与当前系统发行版的密码策略模块出现了深度不兼容。尤其在麒麟V10这类基于Linux内核但深度定制了安全策略的国产系统中,passwd早已不是教科书里那个“改个密码就完事”的简单工具,而是一个需要与pam_pwquality.so、pam_deny.so、pam_faillock.so等十余个动态模块协同工作的精密认证网关。

这个现象之所以高频出现在“银河麒麟 系统 怎么修改普通用户密码”这类搜索中,根本原因在于:绝大多数用户只记住了passwd这个命令名,却完全忽略了它背后那套看不见的、可插拔的认证流水线。就像你只记得按遥控器上的“开机键”,却不知道电视内部电源管理芯片、固件校验模块、背光驱动电路正在同步完成数十步握手——其中任何一环缺失或版本错配,遥控器就只是块塑料。

我去年在某政务云项目中就遇到过类似问题:客户现场三台麒麟V10服务器,两台能正常改密,一台死活报“module is unknown”。排查三天后发现,出问题的那台是通过旧版ISO镜像重装的,其/etc/pam.d/passwd配置文件里仍引用着已被新内核废弃的pam_cracklib.so模块,而系统实际安装的是pam_pwquality.so。两者API签名不一致,passwd调用时直接触发PAM框架的模块加载失败机制,于是返回那个让人摸不着头脑的“unknown”。

所以,理解passwd,绝不能停留在“输入命令→输入两次密码→提示成功”这个表层交互。它本质是一把钥匙,要打开的是一扇由PAM策略、密码强度规则、历史记录校验、失败锁定阈值共同铸成的复合锁。接下来,我们就一层层拆开这把钥匙的齿形结构,看看它到底怎么咬合每一把锁。

2.passwd命令的真正工作流:从键盘输入到/etc/shadow文件落盘的七步闭环

很多人以为passwd就是直接编辑/etc/shadow文件,这是个危险的误解。真实流程远比这复杂且严谨。下面是我用strace -f -e trace=open,write,read,connect passwd testuser在麒麟V10上捕获的完整调用链,已剔除无关系统调用,仅保留核心认证环节:

2.1 第一步:PAM初始化与策略加载(耗时占比42%)

当passwd进程启动,它做的第一件事不是读取用户输入,而是调用pam_start("passwd", "testuser", &conv, &pamh)。此时,PAM框架会按顺序加载/etc/pam.d/passwd中定义的四类模块:

模块类型典型模块名执行时机关键作用
authpam_faillock.so密码修改前检查该用户是否因多次输错被临时锁定
accountpam_access.so权限校验阶段验证用户是否在/etc/security/access.conf允许的登录时段/终端
passwordpam_pwquality.so新密码生成时强制执行8位以上、大小写字母+数字+特殊字符组合规则
sessionpam_umask.so密码写入后设置新密码文件的umask为0077,确保只有root可读

提示:麒麟V10默认启用pam_faillock.so,若用户连续5次输错旧密码,该模块会自动在/var/run/faillock/testuser创建锁定标记,后续所有passwd操作均被拒绝,直到管理员手动执行faillock --user testuser --reset。这不是bug,而是等保三级要求的强制审计项。

2.2 第二步:旧密码验证(非root用户必经之路)

对普通用户而言,passwd必须先验证旧密码。此时它不会直接读取/etc/shadow中的哈希值,而是调用crypt()函数对用户输入的明文密码进行加盐哈希(salt取自/etc/shadow第2字段),再与存储的哈希值比对。关键点在于:麒麟V10默认使用yescrypt算法(标识符$y$),而非传统SHA-512($6$)。如果你用openssl passwd -6生成的密码,passwd会因算法不匹配而始终验证失败。

实测对比(在麒麟V10 SP1上):

# 错误做法:用旧工具生成SHA-512密码 $ openssl passwd -6 "OldPass123" $6$abc123$xyz... # 返回$6$开头的哈希 # 正确做法:用系统原生工具生成yescrypt $ python3 -c "import crypt; print(crypt.crypt('OldPass123', crypt.mksalt(crypt.METHOD_YESCRYPT)))" $y$j9T$abc123$xyz... # 返回$y$开头的哈希

2.3 第三步:新密码强度校验(pam_pwquality.so的核心逻辑)

当用户输入新密码后,pam_pwquality.so会启动一套多维度评分系统。它不是简单判断“是否含数字”,而是计算一个综合分值,低于阈值则拒绝。其核心参数在/etc/security/pwquality.conf中定义:

# /etc/security/pwquality.conf 关键参数解析 minlen = 12 # 最小长度12位(注意:不是8位!) dcredit = -1 # 至少含1个数字(负数表示“至少”) ucredit = -1 # 至少含1个大写字母 lcredit = -1 # 至少含1个小写字母 ocredit = -1 # 至少含1个特殊字符 maxrepeat = 3 # 同一字符最多连续出现3次(防"aaaa123!") difok = 5 # 新密码与旧密码至少5个字符不同

我曾帮某银行客户调试过一个典型case:用户设置密码Bank2024!,系统报“Password does not meet complexity requirements”。用pwscore工具分析:

$ echo "Bank2024!" | pwscore 22 # 得分22,低于阈值25(由minlen*2 + 其他项加权得出)

原因在于Bank2024!中2024是连续数字,触发maxrepeat惩罚;同时Bank与旧密码Bank2023!有4个字符相同,未达difok=5要求。最终解决方案是改为B@nk2024!Sec,得分升至31。

2.4 第四步:密码历史校验(pam_pwhistory.so的静默守护)

即使新密码通过强度校验,pam_pwhistory.so还会检查它是否在历史记录中。该模块将用户最近10次密码的哈希值存于/etc/security/opasswd,格式为:

testuser:10:1234567890abcdef...

其中10表示保存10条历史记录。若新密码哈希与任一历史哈希匹配,则拒绝修改。这个机制在政务系统中尤为重要——它能有效阻止用户用“Password1”、“Password2”这种递增式密码绕过强度策略。

注意:pam_pwhistory.so默认不启用,需在/etc/pam.d/passwd中显式添加:

password [success=1 default=ignore] pam_pwhistory.so use_authtok remember=10

2.5 第五步:shadow文件原子化更新(避免系统崩溃时密码丢失)

当所有校验通过,passwd并不会直接fwrite()到/etc/shadow。它采用经典的“写临时文件+原子重命名”策略:

  1. 创建临时文件/etc/shadow.XXXXXX(mkstemp()生成唯一名)
  2. 将新密码哈希写入该临时文件对应用户的行
  3. 调用rename("/etc/shadow.XXXXXX", "/etc/shadow")

这个rename()是原子操作,即使在写入过程中系统突然断电,/etc/shadow也只会保持旧状态或新状态,绝不会出现半截损坏的文件。我在某次模拟断电测试中验证过:在rename()执行前强制关机,重启后/etc/shadow完好无损;在rename()执行瞬间断电,则新密码立即生效——这正是Linux文件系统设计的精妙之处。

2.6 第六步:SELinux上下文重置(国产系统特有环节)

在启用了SELinux的麒麟V10中,/etc/shadow文件有严格的shadow_t类型标签。当passwd修改文件后,它会自动调用setfilecon()将新文件的SELinux上下文重置为正确值。如果这一步失败(如SELinux处于permissive模式但策略未加载),passwd会记录AVC denied日志到/var/log/audit/audit.log,但不影响密码修改成功。这是很多用户困惑的根源:“明明改密成功了,为啥audit日志里全是denied?”——因为passwd把SELinux校验设为了optional,失败时仅告警不中断。

2.7 第七步:审计日志写入(满足等保合规要求)

最后,passwd会向/var/log/secure写入两条关键日志:

# 认证成功日志 May 20 14:22:33 kylin passwd[12345]: pam_unix(passwd:chauthtok): password changed for testuser # 审计事件(由auditd捕获) type=USER_AUTH msg=audit(1716214953.123:45678): pid=12345 uid=1001 auid=1001 ses=3 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=password-change acct="testuser" exe="/usr/bin/passwd" hostname=? addr=? terminal=tty1 res=success'

这两条日志是等保测评中“身份鉴别审计”的硬性要求。如果/var/log/secure磁盘满,passwd会降级写入/dev/console,确保审计不丢失。

3. 麒麟V10专属排错手册:从“module is unknown”到“Authentication token manipulation error”的全链路诊断

当passwd报错时,90%的用户会立刻去搜错误字符串,但真正高效的排错者,会先建立一个三层诊断漏斗:先看PAM配置是否语法正确,再查模块文件是否存在且可加载,最后验证策略参数是否冲突。下面是我整理的麒麟V10高频报错对照表,每一条都附带可立即执行的验证命令和修复方案。

3.1 报错1:“passwd: module is unknown”

这是麒麟V10用户最常遇到的“拦路虎”。表面看是模块找不到,实则是PAM配置文件中指定了一个系统没有安装的模块。诊断步骤如下:

第一步:定位问题配置文件

# 查看passwd命令实际加载的PAM配置 $ strace -e trace=openat,open passwd testuser 2>&1 | grep "pam.d" openat(AT_FDCWD, "/etc/pam.d/passwd", O_RDONLY) = 3

确认它读取的是/etc/pam.d/passwd,而非其他文件。

第二步:检查配置文件语法

# 使用pam-config工具验证语法(麒麟V10自带) $ sudo pam-config --test --service=passwd # 若输出"Syntax OK",说明配置文件无语法错误 # 若报错如"line 5: unknown module 'pam_cracklib.so'",则定位到第5行

第三步:验证模块文件存在性

# 查看报错模块是否在系统中 $ find /lib/security/ /usr/lib/security/ -name "pam_cracklib.so" 2>/dev/null # 在麒麟V10 SP1中,该文件不存在,应替换为pam_pwquality.so # 查看系统实际安装的密码模块 $ ls /lib/security/pam_*quality* /lib/security/pam_pwquality.so

第四步:修复配置(以麒麟V10 SP1为例)编辑/etc/pam.d/passwd,将原:

password requisite pam_cracklib.so retry=3 minlen=8 difok=3

替换为:

password requisite pam_pwquality.so retry=3 minlen=12 difok=5

关键经验:麒麟V10的pam_pwquality.so参数名与旧版pam_cracklib.so不完全兼容。例如minlen含义相同,但difok在pwquality中默认值为5(更严格),必须显式声明。

3.2 报错2:“Authentication token manipulation error”

这个错误通常出现在root用户修改他人密码时,根源是/etc/shadow文件权限异常。标准权限应为600(仅root可读写),但某些自动化脚本可能误将其改为644。验证与修复:

# 检查shadow文件权限 $ ls -l /etc/shadow -rw------- 1 root root 1234 May 20 10:00 /etc/shadow # 正确 -rw-r--r-- 1 root root 1234 May 20 10:00 /etc/shadow # 错误,会导致此报错 # 一键修复(需root权限) $ sudo chmod 600 /etc/shadow $ sudo chown root:root /etc/shadow

更隐蔽的情况是/etc/shadow的SELinux上下文被破坏:

# 检查SELinux上下文 $ ls -Z /etc/shadow -rw-------. root root system_u:object_r:shadow_t:s0 /etc/shadow # 正确 -rw-------. root root unconfined_u:object_r:etc_t:s0 /etc/shadow # 错误,上下文应为shadow_t # 修复SELinux上下文 $ sudo restorecon -v /etc/shadow

3.3 报错3:“Password unchanged”(密码未更改)

用户明明输入了新密码,却提示未更改。这通常由两个原因导致:

原因A:新密码与旧密码完全相同

# 强制查看shadow中该用户的密码哈希(需root) $ sudo awk -F: '/^testuser:/ {print $2}' /etc/shadow $y$j9T$abc123$xyz... # 记录此哈希 # 用python验证新密码是否生成相同哈希 $ python3 -c " import crypt old_hash = '\$y\$j9T\$abc123\$xyz...' new_pass = 'SameOldPass123' if crypt.crypt(new_pass, old_hash) == old_hash: print('新密码哈希与旧密码完全一致') "

原因B:pam_pwhistory.so启用但历史记录满

# 查看用户历史密码条目数 $ sudo awk -F: '/^testuser:/ {print $2}' /etc/security/opasswd testuser:10:hash1:hash2:...:hash10 # 若已有10个hash,且新密码与任一hash匹配,则拒绝 # 临时清空历史记录(生产环境慎用) $ sudo sed -i '/^testuser:/d' /etc/security/opasswd

3.4 报错4:“Permission denied”(权限拒绝)

普通用户执行passwd时遇到此错误,99%是因为/usr/bin/passwd的SUID位丢失。passwd必须以root权限运行才能修改/etc/shadow,它依赖SUID位实现权限提升:

# 检查passwd二进制文件权限 $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 34568 Jan 15 2023 /usr/bin/passwd # 正确,s位表示SUID -rwxr-xr-x 1 root root 34568 Jan 15 2023 /usr/bin/passwd # 错误,缺少s位 # 修复SUID位 $ sudo chmod u+s /usr/bin/passwd

经验技巧:在麒麟V10中,若/usr/bin/passwd被某个安全加固脚本误删SUID位,passwd会静默降级为普通用户权限,导致所有密码修改失败。此时strace会显示大量EPERM错误,但用户界面只显示模糊的“Permission denied”。

3.5 报错5:“System is booting up”(系统启动中)

这个错误在虚拟机或容器环境中高频出现,原因是/run/nologin文件存在。该文件是系统启动时由systemd创建的“维护锁”,只要它存在,所有非root用户的passwd操作都会被拒绝:

# 检查nologin文件 $ ls -l /run/nologin -rw-r--r-- 1 root root 0 May 20 03:00 /run/nologin # 存在即锁定 # 查看创建该文件的服务 $ systemctl status systemd-logind | grep "nologin" # 或直接删除(仅限确认系统已完全启动后) $ sudo rm -f /run/nologin

4. 生产环境安全加固实践:从密码策略到审计追踪的七道防线

在金融、政务等高安全要求场景中,仅让passwd能正常工作远远不够。我们必须构建一个纵深防御体系,确保密码生命周期的每个环节都受控。以下是我在三个省级政务云项目中落地的加固方案,全部基于麒麟V10原生组件,无需第三方工具。

4.1 防线一:强制yescrypt加密算法(杜绝弱哈希)

麒麟V10默认使用yescrypt,但需确保所有用户密码都以此算法存储。旧用户密码可能仍是SHA-512($6$)或MD5($1$),需批量升级:

# 生成yescrypt密码的Python脚本(保存为upgrade_shadow.py) #!/usr/bin/env python3 import crypt import sys if len(sys.argv) != 2: print("Usage: python3 upgrade_shadow.py <username>") sys.exit(1) username = sys.argv[1] # 读取旧密码哈希 with open('/etc/shadow') as f: for line in f: if line.startswith(username + ':'): old_hash = line.split(':')[1] break # 生成新yescrypt哈希(复用旧salt) new_hash = crypt.crypt("temp_pass", old_hash) print(f"New hash for {username}: {new_hash}")

关键操作:不要直接改/etc/shadow!应使用chpasswd命令:

# 生成临时密码文件 echo "testuser:$(python3 upgrade_shadow.py testuser | cut -d' ' -f4)" > /tmp/newpass.txt # 批量更新(自动处理yescrypt) sudo chpasswd -e < /tmp/newpass.txt

4.2 防线二:密码失效期强制策略(避免永不过期)

默认情况下,Linux用户密码永不过期,这违反等保2.0“口令定期更换”要求。需通过chage设置:

# 设置所有普通用户密码90天后过期,过期前7天提醒 $ sudo awk -F: '$3 >= 1000 && $3 < 60000 {print $1}' /etc/passwd | \ while read user; do sudo chage -M 90 -W 7 "$user" done # 验证效果 $ sudo chage -l testuser Last password change : May 20, 2024 Password expires : Aug 18, 2024 Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 90 Number of days of warning before password expires : 7

4.3 防线三:失败锁定与解锁审计(防暴力破解)

启用pam_faillock.so并配置自动解锁:

# 编辑 /etc/pam.d/common-auth auth [default=bad success=ok user_unknown=ignore] pam_faillock.so preauth silent deny=5 unlock_time=900 auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 auth sufficient pam_faillock.so authsucc deny=5 unlock_time=900 # 编辑 /etc/pam.d/common-password password [success=ok new_authtok_reqd=ok default=ignore] pam_faillock.so # 设置解锁时间900秒(15分钟),超过5次失败即锁定

实战经验:unlock_time必须设为绝对值(秒),不能设为never。我曾在一个项目中因设为never,导致测试账号被永久锁定,只能重装系统——因为faillock --reset需root权限,而root密码恰好被锁。

4.4 防线四:密码历史深度控制(防循环使用)

将密码历史从默认10次提升至24次,覆盖两年周期:

# 编辑 /etc/pam.d/common-password password [success=ok default=ignore] pam_pwhistory.so use_authtok remember=24 # 创建历史记录目录 $ sudo mkdir -p /etc/security/opasswd.d $ sudo chmod 700 /etc/security/opasswd.d

4.5 防线五:SSH登录密码同步校验(避免双密码)

很多用户为图方便,给sudo和SSH设不同密码,这增加管理风险。强制SSH使用/etc/shadow密码:

# 编辑 /etc/ssh/sshd_config PasswordAuthentication yes # 确保PAM启用 UsePAM yes # 编辑 /etc/pam.d/sshd,注释掉可能冲突的行 # auth [success=done default=ignore] pam_succeed_if.so user ingroup nopasswdlogin

4.6 防线六:审计日志集中化(满足等保日志留存要求)

将/var/log/secure实时同步至SIEM平台:

# 安装rsyslog转发(麒麟V10默认已装) $ sudo vim /etc/rsyslog.d/50-remote.conf *.* @@siem-server-ip:514 # 使用TCP协议,确保不丢日志 # 重启服务 $ sudo systemctl restart rsyslog

4.7 防线七:密码修改操作二次确认(防误操作)

为关键账户(如root、admin)添加修改前短信/邮件确认:

# 创建确认脚本 /usr/local/bin/passwd-confirm.sh #!/bin/bash echo "ALERT: $(date): User $SUDO_USER is attempting to change password for $1" | \ mail -s "Password Change Alert" admin@company.com # 在 /etc/pam.d/passwd 中添加 auth [success=ok default=ignore] pam_exec.so /usr/local/bin/passwd-confirm.sh

这套七道防线已在某省大数据局上线半年,成功拦截37次暴力破解尝试,审计日志100%满足等保三级“日志留存180天”要求。最关键的是,所有加固均未影响业务系统正常运行——因为每一步都基于passwd命令的真实工作流设计,而非粗暴的权限封堵。

5. 进阶技巧:用passwd命令实现自动化密码管理的五个真实场景

在运维自动化中,passwd远不止交互式改密这么简单。结合Shell脚本、PAM模块和系统API,它能成为密码生命周期管理的强大引擎。以下是我在金融行业落地的五个高价值场景,全部经过生产环境验证。

5.1 场景一:批量重置测试环境用户密码(带随机生成)

开发测试环境常需每天重置一批用户密码。手动操作效率低且易出错,用chpasswd配合openssl rand可实现全自动:

#!/bin/bash # batch_reset_passwd.sh USERS=("dev1" "dev2" "test1" "test2") for user in "${USERS[@]}"; do # 生成16位随机密码(含大小写字母、数字、特殊字符) PASS=$(openssl rand -base64 12 | tr -d "=+/" | cut -c1-16) # 写入chpasswd格式(用户名:密码) echo "$user:$PASS" >> /tmp/newpass.txt # 记录到审计日志 logger "INFO: Batch reset password for $user at $(date)" done # 批量执行(-e参数表示密码已加密,但此处用明文,chpasswd会自动加密) sudo chpasswd < /tmp/newpass.txt # 清理临时文件 rm /tmp/newpass.txt

关键细节:chpasswd默认将明文密码用crypt()加密后写入/etc/shadow,它会自动检测系统默认算法(麒麟V10为yescrypt),无需手动指定。实测1000个用户批量重置,耗时<3秒。

5.2 场景二:密码过期前自动邮件提醒(免人工巡检)

利用chage -l输出解析,结合cron定时任务:

#!/bin/bash # check_password_expiry.sh THRESHOLD=7 # 提前7天提醒 TODAY=$(date +%s) while IFS=: read -r user _ _ lastchg _ maxday _ _; do # 跳过系统账户(UID<1000) if [[ $(id -u "$user" 2>/dev/null) -lt 1000 ]]; then continue fi # 计算过期时间戳 if [[ -n "$lastchg" && -n "$maxday" ]]; then expire_ts=$(( (lastchg + maxday) * 86400 )) days_left=$(( (expire_ts - TODAY) / 86400 )) if [[ $days_left -le $THRESHOLD && $days_left -gt 0 ]]; then # 发送邮件(使用系统mail命令) echo "Dear $user,\n\nYour password will expire in $days_left days. Please change it via 'passwd' command.\n\nSystem Admin" | \ mail -s "Password Expiry Alert" "$user@company.com" fi fi done < <(sudo chage -l $(cut -d: -f1 /etc/passwd) 2>/dev/null | \ awk -F': ' '/Password expires|Last password change/ {printf "%s ", $2} /^Login/ {print ""}')

部署方式:加入crontab每日执行

# 每天上午9点检查 0 9 * * * /opt/scripts/check_password_expiry.sh

5.3 场景三:容器内用户密码安全注入(Kubernetes Secret集成)

在K8s环境中,避免将密码硬编码在Dockerfile中。通过Init Container注入:

# init-container.yaml apiVersion: v1 kind: Pod metadata: name: app-pod spec: initContainers: - name: passwd-init image: kylinos/kylin-v10:latest command: ['sh', '-c'] args: - | # 从Secret读取密码(base64解码) PASS=$(kubectl get secret myapp-secret -o jsonpath='{.data.password}' | base64 -d) # 为app用户设置密码 echo "appuser:$PASS" | chpasswd # 设置密码永不过期(容器场景合理) chage -M -1 appuser volumeMounts: - name: passwd-dir mountPath: /etc/shadow containers: - name: app image: myapp:latest volumeMounts: - name: passwd-dir mountPath: /etc/shadow volumes: - name: passwd-dir hostPath: path: /etc/shadow

5.4 场景四:LDAP用户本地密码fallback(断网应急)

当LDAP服务器宕机,需允许用户用本地密码登录。通过PAM堆叠实现:

# 编辑 /etc/pam.d/system-auth # LDAP认证失败时,降级到本地shadow auth [success=done default=ignore] pam_ldap.so auth [success=ok default=ignore] pam_unix.so try_first_pass # 密码修改时同步更新LDAP和本地 password [success=ok default=ignore] pam_ldap.so password [success=ok default=ignore] pam_unix.so use_authtok

实战效果:某次LDAP集群故障持续4小时,所有用户仍可通过本地密码登录,业务零中断。故障恢复后,pam_ldap.so自动将本地密码同步回LDAP。

5.5 场景五:密码强度实时校验API(对接Web管理平台)

将pam_pwquality.so能力封装为HTTP服务,供前端调用:

# pwquality_api.py from flask import Flask, request, jsonify import subprocess import tempfile import os app = Flask(__name__) @app.route('/check', methods=['POST']) def check_password(): data = request.get_json() password = data.get('password', '') # 创建临时PAM配置文件 with tempfile.NamedTemporaryFile(mode='w', delete=False) as f: f.write(""" password requisite pam_pwquality.so minlen=12 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 """) conf_path = f.name try: # 调用pwscore(需提前安装libpwquality-utils) result = subprocess.run( ['pwscore'], input=password, text=True, capture_output=True ) score = int(result.stdout.strip()) if result.stdout.strip().isdigit() else 0 return jsonify({ 'score': score, 'valid': score >= 25, 'message': 'Strong password' if score >= 25 else 'Weak password' }) finally: os.unlink(conf_path) if __name__ == '__main__': app.run(host='0.0.0.0:5000')

部署后,Web前端在用户输入密码时实时调用POST http://localhost:5000/check,返回强度评分,体验媲美商业产品。

这些场景证明:passwd不是过时的命令,而是Linux密码管理体系的中枢神经。掌握它,你就掌握了系统安全的命脉。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 10:22:22

智能制造AI落地全解析:数据感知、视觉质检与流程预测实践

简介&#xff1a;面向人工智能的智能制造解决方案&#xff0c;是一份面向制造业管理者、技术决策者及AI应用工程师的PPT演示文档。它围绕智能制造的落地路径&#xff0c;系统梳理了全球制造业在价格波动、劳动力短缺、供应链成本等挑战下的转型思路&#xff0c;并结合IBM智能制…

作者头像 李华
网站建设 2026/9/30 10:21:49

基于ResNet的工业异常检测:从特征提取到产线部署实战

简介&#xff1a;这份PDF文档面向从事机器学习、深度学习与数据建模的研究者与工程人员&#xff0c;聚焦异常检测中自编码器易过拟合、误报率偏高的痛点&#xff0c;提出一种基于ResNet深度神经网络的检测模型。资源包共1个文件&#xff0c;为1.59MB的PDF论文&#xff0c;内容涵…

作者头像 李华
网站建设 2026/9/30 10:21:12

DeepSeek本地部署+私有知识库:基于Ollama的RAG全流程实战

折腾了一个周末&#xff0c;终于把 DeepSeek 本地跑起来了&#xff0c;而且不是只跑一个能聊天的模型&#xff0c;是把它和私有知识库串成了一条完整的问答链路。核心工具就是 Ollama 加一套 RAG 流水线&#xff0c;中间踩了三个特别典型的坑&#xff1a;模型服务进程直接崩掉、…

作者头像 李华
网站建设 2026/9/30 10:21:07

Paperxie 使用手记|一位毕业生的毕设全流程工具体验

引子 毕业论文这件事&#xff0c;很多人卡壳并不是卡在实验或者调研本身&#xff0c;而是被大量重复性杂事消耗精力。 整理文献、搭建开题框架、绘制技术路线图、阅读外文文献、构思论文章节、绘制科研图表、送审前自查、调整 Word 格式、制作答辩 PPT…… 一件件琐事堆在一起…

作者头像 李华
网站建设 2026/9/30 10:20:51

WorkBuddy AI工作台实战:Skill机制与models.json配置详解

1. 为什么我要认真聊聊 WorkBuddy 这个 AI 工作台 第一次接触 WorkBuddy 是在一个做企业数字化的朋友推荐下&#xff0c;他当时甩给我一句话&#xff1a;“你把它当成一个能自己动手干活的 AI 同事&#xff0c;而不是一个只会聊天的机器人。”这句话点醒了我。过去两年我用过不…

作者头像 李华
网站建设 2026/9/30 10:20:30

FDE企业项目实战:从模糊需求到生产系统的工程化路径

1. 为什么“模糊需求”到“生产系统”之间总有一条鸿沟做过企业项目交付的人都有一个共同感受&#xff1a;客户嘴里说的需求&#xff0c;和最后真正上线的系统&#xff0c;中间隔着的不是一条线&#xff0c;而是一片沼泽地。尤其是这两年AI能力快速渗透到企业场景里&#xff0c…

作者头像 李华