chmod 644 -R *将当前目录下所有文件(不包括隐藏文件和目录本身)的权限设为 644(rw-r--r--),但对目录会破坏其可执行位,导致无法进入目录。以下是恢复步骤:
第一步:评估损坏范围
# 查看当前目录下被错误修改的目录
ls -la | grep '^d'
你会看到目录权限类似 drw-r--r--(缺少 x位)。
第二步:恢复目录权限
核心思路:为所有目录重新添加可执行位(+x)。
方案A:使用 find 命令(推荐)
# 1. 仅为当前目录的所有子目录恢复权限(不修改文件)
find . -type d -exec chmod 755 {} \;
# 2. 如果要恢复目录权限,但保持文件为 644
find . -type d -exec chmod 755 {} \; && find . -type f -exec chmod 644 {} \;
方案B:分别处理不同类型
# 恢复目录权限
chmod 755 $(find . -type d)
# 如果你只想恢复部分重要目录
chmod 755 /usr/bin /usr/lib /usr/local
第三步:处理特殊情况
如果命令涉及系统关键目录,需特别注意:
1. /usr/bin, /usr/sbin等系统目录
# 恢复标准系统目录权限
chmod 755 /usr/bin
chmod 755 /usr/lib
chmod 755 /usr/local
2. 用户主目录
# 恢复家目录权限为 700
chmod 700 ~
# 或恢复当前用户的目录
chmod 755 $HOME
3. SSH 相关目录(重要!)
# 修复 .ssh 目录
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
chmod 644 ~/.ssh/*.pub
第四步:预防措施
- 先列出,再操作:
# 先查看哪些文件会被影响
find . -name "*.sh" -type f
# 确认后再执行
find . -name "*.sh" -type f -exec chmod +x {} \;
- 使用更安全的别名:
# 添加到 ~/.bashrc
alias chmod='chmod --preserve-root' # 防止修改根目录
alias chmodrec='echo "Use: find . -type f/d -exec chmod ..."'
如果系统已无法正常工作
如果影响了系统目录导致系统异常:
- Live CD/USB 启动:从其他系统挂载受影响的分区
- 使用包管理器修复:
# Debian/Ubuntu
sudo dpkg --configure -a
# 或重新安装核心包
sudo apt install --reinstall coreutils
- 使用 setfacl 备份权限(事前):
# 备份权限
getfacl -R /path > /backup/permissions.acl
# 恢复权限
setfacl --restore=/backup/permissions.acl
重要提示:如果没有提前备份权限,完全恢复原状是困难的。上述方法能解决大部分问题,但特殊权限(如 setuid/setgid)可能需手动恢复。未来执行
chmod -R前,务必先在小范围测试。