Linux用户密码永不过期设置:从chage命令到login.defs配置详解
1. 项目概述从一次深夜告警说起那天凌晨两点我被一阵急促的短信提示音吵醒。监控系统显示一台核心业务服务器的某个应用服务账号登录失败。睡眼惺忪地连上跳板机ssh过去一看熟悉的提示跳了出来“Your password has expired”。得又是一个用户密码过期了。这已经不是第一次了尤其是在一些默认开启了密码过期策略的Linux发行版比如某些CentOS、RHEL的默认配置或者一些安全基线要求严格的镜像上新建的用户默认密码有效期可能就是90天。对于个人学习环境、测试服务器或者一些跑着无人值守服务的系统账号来说这种定期强制改密码的策略不仅没必要还可能成为运维的“暗雷”——想象一下一个定时备份脚本因为执行账号密码过期而突然失效或者像开头那样凌晨告警把你叫起来就为了改个密码。所以今天我们就来彻底解决这个问题如何将Linux新用户的默认90天密码过期策略修改为永不过期。这不仅仅是运行一两条命令更重要的是理解Linux背后那套用户密码管理体系是如何运作的。我们会从最直观的命令行操作chage讲起然后深入到配置文件/etc/login.defs和影子文件/etc/shadow最后再聊聊如何一劳永逸地修改默认模板让以后新建的用户都“天生”永不过期。无论你是刚接触Linux的新手还是被这个问题困扰过的运维这篇内容都能给你一个清晰、彻底的解决方案。2. 密码过期策略的底层原理与核心命令在动手修改之前我们得先搞清楚Linux系统是怎么管理用户密码生命周期的。这就像你要调整一个机器的运行规则总得先看懂它的说明书。2.1 密码信息的存储地/etc/shadow文件所有用户密码当然是加密后的及其相关属性都存放在/etc/shadow这个文件里。这个文件普通用户无权查看只有root权限才能读取。我们可以用sudo cat /etc/shadow命令看一眼某个用户的记录它的格式通常长这样username:$6$salt$hashedpassword:18659:0:99999:7:::这一串由冒号分隔的字段每个都有其特定含义其中直接控制密码过期策略的主要是第5、6、7字段字段1: 用户名。字段2: 加密后的密码如果以!或*开头表示账号被锁定。字段3: 上次修改密码的日期从1970年1月1日算起的天数。字段4: 密码最短有效天数0表示随时可改。字段5: 密码最长有效天数也就是多少天后过期99999是很多系统的默认值表示永不过期。字段6: 密码过期前多少天开始警告用户。字段7: 密码过期后账号还能宽限几天不被禁用-1表示永不过期后立即禁用不通常表示无限宽限。字段8: 账号失效的绝对日期从1970年1月1日算起的天数。字段9: 保留字段。我们的核心目标就是修改第5个字段密码最长有效天数。把它改成99999这样的极大值在人类尺度上就相当于永不过期了。2.2 管理密码策略的瑞士军刀chage命令直接编辑/etc/shadow文件虽然高效但容易因格式错误导致用户无法登录风险较高。因此系统提供了更安全的专用工具——chage命令。它的全称是“change age”就是用来修改用户密码和账号“年龄”信息的。chage命令功能强大常用选项有-l: 列出指定用户的所有密码过期信息。-m: 设置密码最短有效天数对应shadow第4字段。-M: 设置密码最长有效天数对应shadow第5字段这是我们最关注的。-I: 设置密码过期后到账号被锁定的宽限天数对应shadow第7字段。-W: 设置密码过期前多少天开始警告对应shadow第6字段。-E: 设置账号失效的绝对日期YYYY-MM-DD格式对应shadow第8字段。-d: 设置上次修改密码的日期0表示下次登录强制修改。注意chage命令需要root权限。对于非root用户可以使用sudo来执行。2.3 查看当前用户的密码状态在修改之前先诊断。使用chage -l命令可以清晰地看到当前用户的密码策略详情。例如查看testuser的状态sudo chage -l testuser输出可能类似于Last password change : Mar 01, 2024 Password expires : May 30, 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这里清楚地显示Maximum number of days...是90天并且给出了具体的过期日期May 30, 2024。我们的任务就是把那个90改成99999。3. 修改现有用户的密码为永不过期现在我们进入实操环节。假设我们已经有一个用户appuser它的密码即将在90天后过期我们需要将其改为永不过期。3.1 方法一使用chage命令推荐这是最标准、最安全的方法。只需一条命令sudo chage -M 99999 appuser这条命令将用户appuser的密码最长有效天数设置为99999天约273年。执行后再次使用chage -l appuser查看会发现Maximum number of days...已经变成了99999并且Password expires一项变成了never。参数解释与注意事项-M 99999: 这里的99999是一个惯例值代表“永不过期”。你也可以设置成其他更大的数字但99999是公认的、安全的表示方式。立即生效此修改是即时生效的用户下次登录时就会应用新的策略。不影响已过期密码如果用户的密码已经过期执行此命令并不会自动解锁账号。你需要先让用户修改密码或者由管理员使用chage -d 0 appuser强制其下次登录时修改密码之后新的永不过期策略才会生效。3.2 方法二直接编辑/etc/shadow文件高级操作如果你习惯于直接操作配置文件也可以直接修改/etc/shadow。但务必小心任何格式错误都可能导致用户无法登录。使用vipw命令或sudo vi /etc/shadow打开shadow文件。推荐使用vipw因为它会在编辑前对文件进行锁定和备份更安全一些。sudo vipw -s找到对应用户appuser的那一行。定位到第5个字段由冒号分隔将其值从原来的数字如90修改为99999。保存并退出编辑器。重要警告直接编辑/etc/shadow风险极高。务必确保使用cp命令先备份原文件sudo cp /etc/shadow /etc/shadow.bak。编辑时不要增减任何冒号不要破坏字段结构。如果不确定强烈建议优先使用chage命令。3.3 验证修改结果无论用哪种方法修改后都需要验证。除了用chage -l查看还有一个快速命令可以检查密码过期状态sudo grep appuser /etc/shadow | cut -d: -f5这个命令会直接输出appuser在shadow文件中的第5个字段值如果显示99999就说明修改成功了。4. 一劳永逸修改系统默认密码过期策略解决了现有用户的问题我们更希望防患于未然让所有未来新建的用户默认就是密码永不过期。这需要修改系统的用户创建默认配置。4.1 核心配置文件/etc/login.defs/etc/login.defs这个文件定义了很多用户和组创建的默认规则。其中就包括密码过期策略的默认值。我们需要修改其中几个关键参数sudo vi /etc/login.defs找到并修改以下几行如果不存在则添加PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_WARN_AGE 7PASS_MAX_DAYS 99999: 新用户密码的最大有效期设为99999天永不过期。PASS_MIN_DAYS 0: 密码修改的最小间隔天数0表示可以随时修改。PASS_WARN_AGE 7: 在密码过期前7天开始警告用户。修改后的影响这个修改是前瞻性的只对在此之后使用useradd命令且不使用-M等覆盖参数创建的新用户生效。它不会影响系统中已经存在的任何用户。4.2 用户创建的模板/etc/default/useradd另一个可能影响默认值的文件是/etc/default/useradd。我们可以查看一下里面是否有关于过期时间的设置sudo cat /etc/default/useradd | grep -i expire通常这个文件里可能有一个EXPIRE或INACTIVE的配置。但更常见、更全局的配置是在/etc/login.defs中。/etc/default/useradd主要定义的是家目录、shell、默认组等基础属性。4.3 验证默认策略是否生效修改完/etc/login.defs后如何验证呢最直接的方法是创建一个测试用户sudo useradd testnewuser sudo chage -l testnewuser查看新用户testnewuser的密码策略其Maximum number of days...应该显示为99999。验证完毕后记得删除这个测试用户sudo userdel -r testnewuser。5. 特殊场景与深度排查在实际运维中情况可能比单纯的修改数字更复杂一些。下面是一些你可能遇到的特殊场景和深度问题。5.1 用户已处于密码过期状态怎么办如果用户密码已经过期即使你修改了-M为99999用户登录时仍然会被要求强制更改密码。此时有两种处理方式让用户自行修改密码这是最合规的方式。用户通过SSH或控制台登录时系统会提示输入新密码。管理员强制重置“上次修改时间”如果因为某些原因比如服务账号你需要让它立即恢复可用可以使用以下命令sudo chage -d 0 username这个命令将用户的上次密码修改日期设置为“纪元开始”1970-1-1这会导致系统认为密码已经过期太久从而在用户下次登录时强制要求修改密码。对于服务账号这之后你可以再把它改成一个固定的强密码。或者更常见的做法是对于服务账号直接禁用密码登录改用密钥认证一劳永逸。5.2 排查密码过期引起的连锁问题密码过期不仅影响登录还可能引发一些“诡异”的故障这正是开头那个深夜告警的根源。场景一Crontab定时任务失败如果以某个用户身份运行的cron作业该用户密码过期cron在执行任务时可能会因为无法验证用户身份而失败。检查系统日志/var/log/cron或/var/log/syslog可能会看到认证错误的信息。场景二SFTP/SCP服务异常一些SFTP服务如OpenSSH的sftp子系统在用户密码过期后可能会拒绝连接即使使用密钥认证。错误信息可能比较模糊例如“Connection closed”或“Authentication failed”。此时需要检查系统日志/var/log/auth.log或/var/log/secure来确认是否为密码过期问题。场景三基于PAM的应用程序故障任何通过PAM进行用户认证的应用程序如某些FTP服务、Web控制台等都可能因为密码过期而拒绝服务。排查时应用程序自身的日志和系统的认证日志是关键。通用排查思路检查日志第一时间查看/var/log/secure、/var/log/auth.log或journalctl -u相关服务。确认用户状态使用chage -l和passwd -S-S显示密码状态摘要快速诊断。隔离测试尝试直接以该用户身份执行一个简单命令如sudo -u username whoami看是否会提示密码过期。5.3 企业环境下的平衡之道在个人或测试环境中我们可以大胆设置为永不过期。但在严格的企业生产环境或需要遵守等保、PCI DSS等合规要求的环境下密码定期更换是强制要求。此时一刀切的“永不过期”可能不合规。更佳实践是精细化策略管理区分账号类型交互式用户账号如管理员、开发人员保持合理的过期策略如90天并配合密码复杂度要求和密码历史记录通过/etc/pam.d/system-auth配置来提升安全性。服务/系统账号如nginxmysqlapprunner这些账号通常不用于交互式登录应设置为密码永不过期-M 99999并且最好将其登录shell设置为/sbin/nologin或/bin/false并禁用密码登录仅使用密钥或socket认证。这才是最安全的方式。使用集中化管理工具如果服务器数量多可以考虑使用像LDAP、FreeIPA或微软AD这样的目录服务来统一管理用户和密码策略这比在每台机器上手动修改要高效和一致得多。6. 自动化脚本与批量操作当需要管理的服务器或用户数量众多时手动操作效率低下。这里提供两个简单的脚本思路。6.1 批量修改现有用户为永不过期假设你想把除了root之外的所有本地用户的密码策略都改为永不过期请谨慎评估此操作的影响范围。#!/bin/bash # 批量修改所有非root、非系统用户密码永不过期脚本 # 使用前请务必在测试环境验证 # 获取所有普通用户UID 1000根据系统不同可能需调整 for user in $(awk -F: $3 1000 $1 ! nobody {print $1} /etc/passwd); do echo Processing user: $user sudo chage -M 99999 $user # 可选同时将密码过期警告也设为一个值 # sudo chage -W 7 $user done echo 批量修改完成。重要提醒执行此类批量操作前务必在测试环境充分验证脚本逻辑。明确知晓脚本会影响到哪些用户。做好备份并准备好回滚方案。6.2 在新服务器上自动应用默认策略如果你经常需要初始化新的服务器可以将修改默认配置的步骤写入自动化脚本如Ansible Playbook、Shell初始化脚本。一个简单的Ansible任务示例- name: Set default password expiration policy to never expire lineinfile: path: /etc/login.defs regexp: ^PASS_MAX_DAYS line: PASS_MAX_DAYS 99999 state: present become: yes - name: Ensure PASS_MIN_DAYS is set to 0 lineinfile: path: /etc/login.defs regexp: ^PASS_MIN_DAYS line: PASS_MIN_DAYS 0 state: present become: yes7. 常见问题与故障排除实录在实际操作中你可能会遇到下面这些“坑”。这里记录了我自己踩过或见过的一些典型问题。7.1 执行chage命令报错“Permission denied”问题普通用户直接运行chage -l username或chage -M ... username时提示权限不足。原因与解决chage命令需要读取或修改/etc/shadow文件该文件权限为-rw-r-----所有者是root只有root用户和shadow组可读。普通用户无权访问。查看信息使用sudo chage -l username。修改策略必须使用sudo chage -M 99999 username。7.2 修改后用户登录仍提示密码过期问题已经用chage -M 99999修改了但用户SSH登录时依然提示“Your password has expired”要求更改。原因这种情况通常发生在密码已经过期之后才去修改-M值。-M控制的是未来的过期时间但无法追溯性地清除“已过期”的状态。解决让用户按照提示输入旧密码然后设置一个新密码。这是最直接的方法。如果用户无法交互如服务账号管理员可以强制重置其密码修改日期迫使其进入“必须改密码”的状态然后由管理员为其设置一个新密码sudo chage -d 0 username # 强制下次登录改密码 sudo passwd username # 管理员直接为用户设置新密码注意有些发行版在chage -d 0后即使用passwd改了密码首次登录可能仍会要求更改。最稳妥的办法还是让该账号通过一次交互式登录流程。7.3 忘记了root密码且已过期无法sudo问题这是最棘手的情况之一。你的个人用户密码可能没过期但root密码过期了而你的个人用户又不在sudoers文件里导致无法获取root权限来修改任何策略。解决必须通过单用户模式或救援模式来重置root密码。重启服务器在GRUB引导菜单界面按e键编辑启动参数。找到以linux或linux16开头的那一行在行尾在quiet参数之前添加init/bin/bash。按CtrlX或F10启动。系统会直接进入bash shell且拥有root权限。此时文件系统通常是只读的需要重新挂载为可写mount -o remount,rw /。使用passwd root命令重置root密码。执行sync命令同步数据然后重启exec /sbin/init或reboot -f。重启后用新root密码登录再处理密码过期问题。警告此操作需要物理或虚拟控制台访问权限对云服务器可能不适用云平台通常提供控制台重置密码功能。操作前请确认你有权限且了解风险。7.4 PAM模块覆盖了默认策略问题明明修改了/etc/login.defs和chage设置但新用户创建后密码策略还是不对。深度排查除了login.defsLinux的认证体系PAM也可能强制执行密码策略。特别是如果系统安装了libpam-pwquality或pam_cracklib等模块并在/etc/pam.d/common-password或/etc/pam.d/system-auth中配置了pam_unix.so的remember、minlen、maxrepeat等参数或者使用了pam_pwquality.so模块它们可能会定义独立的密码生命周期规则。检查点查看PAM配置cat /etc/pam.d/system-auth或cat /etc/pam.d/common-password。寻找包含pam_unix.so或pam_pwquality.so的行看是否有类似maxage90这样的参数。PAM的优先级有时会高于login.defs。如果存在冲突需要根据实际情况调整PAM配置或login.defs配置确保一致。经过以上从原理到实操从单个用户到默认配置从普通场景到特殊故障的全面梳理你应该已经能够游刃有余地处理Linux下的用户密码过期问题了。核心就是理解/etc/shadow的字段含义熟练运用chage这个工具并知道如何通过/etc/login.defs来定义未来。记住对于生产环境中的服务账号最好的安全实践是“禁用密码登录 使用密钥认证”这远比纠结密码过期策略要来得根本和有效。

相关新闻

Docker部署ScanT3r全流程:简单3步搭建专业漏洞扫描环境

Docker部署ScanT3r全流程:简单3步搭建专业漏洞扫描环境

Docker部署ScanT3r全流程:简单3步搭建专业漏洞扫描环境 【免费下载链接】scant3r ScanT3r - Module based Bug Bounty Automation Tool ( use Lotus instead github.com/bugBlocker/lotus ) 项目地址: https://gitcode.com/gh_mirrors/sc/scant3r ScanT3r是一…

2026/8/11 8:51:23 阅读更多 →
Overused Grotesk完整特性解析:多语言支持、12种样式集与5种字符变体

Overused Grotesk完整特性解析:多语言支持、12种样式集与5种字符变体

Overused Grotesk完整特性解析:多语言支持、12种样式集与5种字符变体 【免费下载链接】Overused-Grotesk A variable sans serif typeface inspired by the classic neo-grotesk Swiss design 项目地址: https://gitcode.com/gh_mirrors/ov/Overused-Grotesk …

2026/8/6 22:51:39 阅读更多 →
提升Vim编辑效率:vim-numbertoggle让行号显示智能化

提升Vim编辑效率:vim-numbertoggle让行号显示智能化

提升Vim编辑效率:vim-numbertoggle让行号显示智能化 【免费下载链接】vim-numbertoggle Toggles between hybrid and absolute line numbers automatically 项目地址: https://gitcode.com/gh_mirrors/vi/vim-numbertoggle 在Vim编辑器中,行号显示…

2026/8/9 18:22:10 阅读更多 →

最新新闻

QD框架变量系统深度解析:自动化任务的数据流转引擎

QD框架变量系统深度解析:自动化任务的数据流转引擎

QD框架变量系统深度解析:自动化任务的数据流转引擎 【免费下载链接】qd QD [v20240210] —— HTTP请求定时任务自动执行框架 base on HAR Editor and Tornado Server 项目地址: https://gitcode.com/gh_mirrors/qd/qd QD框架作为一款基于HAR Editor和Tornado…

2026/8/11 16:38:14 阅读更多 →
Windows安卓应用安装神器:3步搞定APK安装的终极指南

Windows安卓应用安装神器:3步搞定APK安装的终极指南

Windows安卓应用安装神器:3步搞定APK安装的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑上安装Android应用而烦恼吗&#xff…

2026/8/11 16:38:14 阅读更多 →
终极B站会员购抢票神器:3分钟上手,轻松抢到热门漫展门票!

终极B站会员购抢票神器:3分钟上手,轻松抢到热门漫展门票!

终极B站会员购抢票神器:3分钟上手,轻松抢到热门漫展门票! 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 还在为抢不到B站会员购的热门漫展门票而烦恼吗&…

2026/8/11 16:38:14 阅读更多 →
51Nod - 2133:排队接水

51Nod - 2133:排队接水

题目n 个人一起排队接水,第 i 个人需要 b[i] 的时间来接水。( 1≤n≤1000 , 0≤b[i]≤1000)同时只能有一个人接水,正在接水的人和没有接水的人都需要等待。完成接水的人会立刻消失,不会继续等待。你可以决定…

2026/8/11 16:38:14 阅读更多 →
如何快速美化英雄联盟客户端:5个免费技巧终极指南

如何快速美化英雄联盟客户端:5个免费技巧终极指南

如何快速美化英雄联盟客户端:5个免费技巧终极指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要让你的英雄联盟客户端焕然一新吗?LeaguePrank是一款基于官方LCU API开发的开源英雄联盟客户端个性…

2026/8/11 16:38:14 阅读更多 →
League Akari:英雄联盟LCU工具包的3个颠覆性功能完整指南

League Akari:英雄联盟LCU工具包的3个颠覆性功能完整指南

League Akari:英雄联盟LCU工具包的3个颠覆性功能完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟游戏中的繁…

2026/8/11 16:37:14 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →