在Linux服务器上,数据库密码一般不会以明文形式直接展示在界面上,但通过查看应用配置文件、环境变量以及历史命令,多数情况下都能找到连接数据库的密码线索;如果确实找不到,最稳妥的方式是直接重置数据库密码。
接手一台Linux服务器,发现业务系统连着数据库,但运维文档里没写密码,这种情况下,很多人第一反应是问“linux服务器怎么查看数据库密码”,坦白说,数据库密码很少会被明文存在系统里,但也不是完全无迹可寻,这篇文章就聚焦在如何从Linux服务器上找到数据库连接密码,以及数据库密码忘记怎么找回,全程用可操作的命令和路径说话。
linux服务器怎么查看数据库密码:先翻应用配置文件
大多数Web应用和业务系统,数据库连接信息都会写在配置文件里,按以下顺序排查,命中率相当高。
Java项目(Spring Boot / Spring Cloud)
Spring Boot项目通常把配置放在application.yml或application.properties里,登录服务器后,进入项目部署目录,执行:
find / -name "application.yml" 2>/dev/null
找到配置后,用cat或vim打开,重点看以下几行:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/yourdb
username: root
password: yourpassword
如果密码是加密的(比如jasypt加密),找配置里的jasypt.encryptor.password,或者在启动脚本中寻找JASYPT_ENCRYPTOR_PASSWORD环境变量,这里有个经验:很多团队会把解密的密钥直接放在启动命令或环境变量文件里,算是运维圈里一个不算秘密的惯常做法。
PHP项目(Laravel / ThinkPHP)
Laravel项目的数据库配置在.env文件里:
cd /www/wwwroot/yourproject cat .env
输出里关注DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD这几项,ThinkPHP项目则看config/database.php,或/.env。
Python项目(Django / Flask)
Django项目的settings.py中会有一段DATABASES
配置,密码明晃晃写在PASSWORD字段里,Flask项目则常见于config.py:
SQLALCHEMY_DATABASE_URI = 'mysql://username:password@localhost/dbname'
Node.js项目
很多Node项目使用dotenv库加载配置,.env文件里写着DB_PASS=xxx,另外config.js、config.json都是常见落点。
搜索关键词汇总:如果不想挨个目录翻,直接在服务器全局搜索常见配置文件名:
grep -r "password" /www/wwwroot --include=".env" --include=".yml" --include=".php" --include=".py" -l
这个方法基于一个事实:数据库密码要连接,就必须在某个地方以明文或可解密密文存在,这是应用能连上数据库的前提,行业共识认为,这种做法虽然不算绝对安全,但确实是最普遍的情况。
linux服务器查看数据库密码:环境变量与启动脚本
有些项目不写配置文件,而是用环境变量注入数据库密码,这种情况多见于Docker部署或K8s集群。
Docker容器场景
先找到正在运行的容器:
docker ps | grep mysql
然后用inspect命令查看容器的环境变量:
docker inspect 容器ID | grep -A 5 "MYSQL_ROOT_PASSWORD"
或者直接进入容器查看:
docker exec -it 容器ID env
很多业务容器会通过-e MYSQL_ROOT_PASSWORD=xxx传入密码,这个值在容器创建后就固定了,用docker inspect能直接看到明文。
系统服务脚本场景
有些老项目用systemd管理,密码写在ExecStart的启动参数里:
cat /etc/systemd/system/your-service.service
或者查看进程的完整命令行参数:
ps -ef | grep java
就能看到类似--spring.datasource.password=123456的字样。这是排查数据库连接密码时很容易漏掉的一个位置。
Shell历史记录
这个办法比较碰运气,但确实有相当一部分运维人员会把
mysql -uroot -p密码直接写在命令行里:
cat ~/.bash_history | grep -i "mysql|psql|redis-cli"
如果之前有人用命令行登录过数据库,历史记录里大概率就躺着密码,需要留意的是,history命令看到的只是当前终端会话的历史,而~/.bash_history文件记录的是该用户的所有历史命令,两者不可混淆。
数据库密码忘记怎么找回:重置法兜底
配置文件翻遍了、环境变量也看完了,还是没找到密码,这时候不要指望能“查看”到原来的密码,因为MySQL、PostgreSQL等数据库存储的是加密哈希值,不可逆,破解不现实,正确的思路是直接重置密码。
MySQL密码重置(适用于Root用户权限)
第一步,停掉MySQL服务:
systemctl stop mysqld
第二步,以跳过授权表方式启动:
mysqld_safe --skip-grant-tables &
第三步,登录并修改密码:
mysql -uroot ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES;
注意,MySQL 5.7及以上版本推荐用ALTER USER语法,旧版用UPDATE mysql.user SET authentication_string=PASSWORD('新密码'),新版用ALTER USER,这也是很多新手在重置时容易报错的地方。
PostgreSQL密码重置
先修改pg_hba.conf,将认证方式改为trust,然后重启服务:
vim /var/lib/pgsql/data/pg_hba.conf # 将 scram-sha-256 或 md5 改为 trust systemctl restart postgresql
然后以postgres用户登录并改密码:
su - postgres psql -U postgres ALTER USER postgres WITH PASSWORD '新密码';
改完之后记得把pg_hba.conf改回去,否则数据库将处于不设防状态。这一步相当关键,不少人在重置后忘记复原配置,导致数据库权限大开,引发安全风险。
Redis密码重置
Redis的密码机制比较简单,修改redis.conf中的requirepass项,然后重启:
vim /etc/redis/redis.conf # requirepass yourpassword systemctl restart redis
如果没有设置过requirepass,说明Redis默认无密码,连接时不用认证。
Linux服务器查看数据库密码的安全管理与防泄露
聊完了怎么查,也得说说怎么防,近几年,数据库密码泄露导致的数据安全事故时有耳闻,业内专家指出,多数数据泄露事件的根源并非外部攻击,而是密码明文散落在服务器各处。
日常防护清单
- 定期轮换数据库密码,尤其是人员变动后,建议立即更换所有数据库连接密码
- 使用密钥管理服务,如Vault、KMS,而不是把密码写在配置文件里
- 更新应用代码,用环境变量或外部配置中心替代硬编码的密码
- 限制服务器访问权限,能登录服务器的用户越少,密码暴露的可能性越小
- 启用数据库审计日志,监控密码尝试登录的行为
如果确实需要在服务器上临时查看数据库密码,看完了记得把含有密码的文件权限收一下,至少设置为chmod 600,避免其他用户可读。
常见问题:Linux服务器数据库密码相关
linux服务器查看数据库密码时,发现配置里的密码是加密的怎么办?
项目用了加密组件时,配置里的ENC(密文)格式并不代表密码无法恢复,查找项目代码里的解密逻辑,通常有统一的工具类或配置项,Spring生态中可以尝试jasypt的解密命令,只要拿到解密盐值就能还原出明文。
mysql密码忘记怎么找回最省事?
如果你有服务器的root权限,使用--skip-grant-tables方式重置是公认最快的方法,整个过程需要几分钟到十几分钟不等,前提是数据库当前没有重要的未提交事务,操作前建议先备份数据目录。
使用linux服务器查看数据库密码,配置文件都翻遍了仍然没有找到密码,还有什么可能性?
数据库连接可能经过了中间件代理,比如MyCat、ProxySQL、MaxScale,应用连接的是代理而非真实数据库,这种情况下去看代理的配置文件和用户映射,部分容器编排系统如K8s会使用Secret单独管理密码,需要检查K8s的Secret资源,而不只是应用配置文件。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/685434.html





