问题原因
我打算使用以下命令为隐藏文件(如“.hgignore”)添加组写入权限:
# 密码 /选择 # sudo chmod -R g+w .*
问题在于“..”匹配了此模式,现在整个 RHEL 文件系统都设置了 g+w。直接的问题如下:
- /etc/sudoers 需要设置为 440,而不是 460,所以现在用户无法使用 sudo。
- 一些与上述类似的机制不允许 ssh 访问。(远程 ssh 客户端收到消息“ssh_exchange_identification:远程主机关闭连接”错误)
问题
为了重新获得远程登录的能力,需要指导具有服务器物理访问权限的人员如何修复系统。
现在的问题是:为了恢复功能,哪些重要的文件和目录需要恢复其ssh
权限sudo
?
关于“因重复而关闭”的说明
问题为什么“chmod -R 777 /”具有破坏性?详细解释了递归扩展权限会产生什么影响。这个问题旨在回答如何通过 ssh 重新获得远程访问,以便进行更广泛的恢复和修复。
答案1
对于属于软件包的文件,您可以通过以下方式找出问题所在:
rpm --verify “软件包名称”
其中 packagename 是一个单独的包,或者您可以循环遍历“rpm -qa”的输出
然后你应该能够使用 rpm 来修复它们,例如
rpm --setperm “软件包名称”
答案2
ssh 的问题不仅仅局限于 /etc 下,还与您尝试连接的用户的 .ssh 文件夹权限不正确有关。通常,用户的 .ssh 文件夹应该是 700,私钥应该是 600,其他所有内容都可以是 644。
/etc/ssh 文件夹应该是 755,/etc/ssh 下的私钥应该是 600,其他所有内容应该是 644。
如何从 /etc 中的错误权限中恢复服务器?
可能最简单的方法之一就是从备份中恢复。您确实备份了,并且测试了恢复过程,对吧?:)
如果您没有可用于恢复的备份,您可能需要在虚拟机中设置一个相同的干净系统,然后通过比较两者根据您的服务器修复主机上的权限。
答案3
如果您有一台已知良好的服务器,则在良好的服务器上运行以下命令可能会帮助您恢复它。(假设具有递归通配符能力(zsh),可以改用 find 和 -exec / xargs):
for i in /etc/**/*; do
perm=$(stat "$i" -c "%a")
ssh root@badServerHostName "chmod $perm $i"
done
可能需要添加几个子目录来排除其他目录...如果 Rsync 可以做到的话会更好仅有的权限,但我不认为它可以。
答案4
如果您有备份并且有 LVM 和足够的空间,您可以执行以下操作:
1. 将备份恢复到新的临时 lv(将其挂载在 /oldperm 下)
2. 执行类似以下伪代码的操作:
foreach oldfile in /oldperm/* {
newf = strip "/oldperm" from oldfile
chmod --reference=oldfile newf
}
如果遇到空间问题,您可以先部分恢复,例如先恢复 /etc 下的所有内容。此技巧依赖于 chmod 的标志 --reference,该标志将另一个文件作为模板,并使参数在权限方面匹配。
这样,您只会恢复旧的权限而不会更改文件的内容。