我并不是新手。我是一名专业人士,正在向其他专业人士请教他们如何快速解决常见问题,我知道该怎么做chmod -R
。
这是对我的问题立即给出的 -1 评分的回应,因为有些人可能会对我的问题的严肃性不屑一顾,或者否认其有效性。
在我的桌面和以 root 身份运行 Kali Linux 的远程服务器之间尝试使用 sshfs(Kali 的默认设置)。设法搞乱了系统上的所有文件和文件夹权限/所有权。我设法修复了一些,只需一个简单的chmod -R 0755
在适当情况下,但注意到许多问题仍未得到解决。
想知道是否有 bash 脚本或其他脚本或程序可以帮助恢复正确的所有者和权限?
我找到了类似的脚本,但它主要用于修复主目录。
脚本如下:
#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "Processing ..."
find -H $(pwd) -type d -exec chmod 0755 {} \;
# set dirs to 755
find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
# libs
IFS=$'\n'
for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
if [ -z "$tstbin" ]; then
tstbat=$(cat "$value" | head -c2 | grep -io '#!')
if [ -n "$tstbat" ]; then
perm=$(stat -c '%a' "$value")
if [ "$perm" != "755" ]; then
chmod 755 $value
echo "Set script 755 $value"
# set batch to 755
fi
else
perm=$(stat -c '%a' "$value")
if [ "$perm" != "644" ]; then
chmod 644 $value
echo "Set regular 644 $value"
# set regular files to 644
fi
fi
# above aren't elf binary
else
perm=$(stat -c '%a' "$value")
if [ "$perm" != "755" ]; then
chmod 755 $value
echo "Set binary 755 $value"
# set elf binaries to 755
fi
fi
done
unset IFS
# process linux permissions for files and folders
else
echo "Aborted."
fi
有人找到更实质性的东西来修复文件系统的权限和所有权吗?
--> Update: <--
由于没有找到理想的解决方案,我决定修改上述脚本并使其有利于实现我想要的解决方案:
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# ====================================================================
# --> Documentation <--
# ---------------------
#
# 0755 21 root root .
# 0755 21 root root ..
# 0755 2 root root bin
# 0755 4 root root boot
# 0755 15 root root dev
# 0755 53 root root etc
# 0755 4 root root home
# 0755 7 root root lib
# 0700 2 root root lost+found
# 0755 6 root root media
# 0755 2 root root mnt
# 0755 4 root root opt
# dr-xr-xr-x 87 root root proc # Not touching this.
# 0744 8 root root root
# 0755 2 root root sbin
# 0755 3 root root share
# 0755 4 root root srv
# 0755 12 root root sys
# 1777 7 root root tmp
# 0755 12 root root usr
# 0755 13 root root var
#
# ========================================================================
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "Processing ..."
#################
# Special Cases #
#################
SDIR=("/lost+found" "/root" "/tmp")
for sd in ${SDIR[-1]}; do
perm=$(stat -c '%a' "$sd")
user=$(stat -c '%U' "$sd")
group=$(stat -c '%G' "$sd")
if [ $sd = "/tmp" ]; then
if [ "$perm" != 1777 ]; then
chmod 1777 $sd
echo "Set directory to 177 $sd"
fi
elif [ $sd = "/lost+found" ]; then
if [ "$perm" != 0700 ]; then
chmod 0700 $sd
echo "Set directory to 0700 $sd"
fi
elif [ $sd = "/root" ]; then
if [ "$perm" != 744 ];then
chmod 744 $sd
echo "Set directory to 744 $sd"
fi
else
echo "Abort!"
fi
# Do change in ownership
if [ "$user" != root ]; then
chown root $sd
echo "Set user to root $sd"
fi
if [ "$group" != root ]; then
chgrp root $sd
echo "Set group to root $sd"
fi
done
###############
# Directories #
###############
DIR=("/bin" "/boot" "/dev" "/etc" "/home" "/lib" "/media" "/mnt" "/opt" "/sbin" "/share" "/srv" "/sys" "/usr" "/var")
for pd in ${DIR[-1]}; do
perm=$(stat -c '%a' "$pd")
user=$(stat -c '%U' "$pd")
group=$(stat -c '%G' "$pd")
if [ "$perm" != 755 ]; then
chmod 755 $pd
echo "Set directory to 755 $pd"
fi
if [ "$user" != root ]; then
chown root $pd
echo "Set user to root $pd"
fi
if [ "$group" != root ]; then
chgrp root $pd
echo "Set group to root $pd"
fi
############################
# Subdirectories and files #
############################
# chmod directories to 755
find -H $pd -type d -exec chmod 0755 {} \;
# Check library files
find -H $pd -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
done
#------#
# libs #
#------#
# Assign Variables
LIBFILES=$(find -H "$(pwd)" -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n')
# Now do the hustle
for PLF in $LIBFILES; do
tstbin=$(readelf -l "$PLF" 2>/dev/null | grep -Pio 'executable|shared')
if [ -z "$tstbin" ]; then
tstbat=$(cat "$PLF" | head -c2 | grep -io '#!')
if [ -n "$tstbat" ]; then
perm=$(stat -c '%a' "$PLF")
if [ "$perm" != "755" ]; then
chmod 755 $PLF
echo "Set script 755 $PLF"
# set batch to 755
fi
else
perm=$(stat -c '%a' "$PLF")
if [ "$perm" != "644" ]; then
chmod 644 $PLF
echo "Set regular 644 $PLF"
# set regular files to 644
fi
fi
# above aren't elf binary
else
perm=$(stat -c '%a' "$PLF")
if [ "$perm" != "755" ]; then
chmod 755 $PLF
echo "Set binary 755 $PLF"
# set elf binaries to 755
fi
fi
done
unset IFS
# process linux permissions for files and folders
else
# When shit goes pear shaped
echo "Aborted."
fi
还有其他方法可以做到这一点,也有更好的方法来编写代码。但是,它目前有效。
--->Yet another update<---
我修复了脚本中的一个粗心错误,正确地重新定位了几个以前由于脚本结构而无法访问的变量的位置。
答案1
不存在用于修复通用系统上任意损坏权限的简单脚本。您、您的用户和您使用的软件可以设置任何您想要的权限以满足您的要求。过于宽泛的权限更改会导致元数据丢失。
首先,确定权限是如何被破坏的,例如chmod
chown
setfacl
命令chcon
。如果所有权错误,您需要修复它,例如将主目录中的文件归还给其所有者。请注意这里有一些微妙的事情,例如chown 将清除 setuid 标志。例如,如果 /usr/bin/ping 失去 setuid root 权限,则可能无法工作。您知道您的其他哪些程序需要 setuid 吗?更复杂的 ACL 或 selinux 标签不在您的解决方案中,但如果它们也存在错误,则可能会使事情变得复杂。
您可以尝试将权限修复为软件包安装时的权限。在基于 Debian 的系统上,您可以输入dpkg --contents
输出到 chmod chown 脚本. 下载所有已安装软件包的 .debs 以供 dpkg 查询是读者的练习。这对用户数据或未通过 deb 安装的软件没有任何作用。
识别先前受文件权限保护的敏感信息。包括但不限于 ssh 和 gpg 私钥。出于谨慎考虑,请考虑更改这些凭据。
至于其余的用户数据,很难说。用户通常(但并非总是)拥有主目录中的文件。多个用户共享目录可能会变得棘手,因为可能不再知道正确的所有者和模式。
如果存在,则备份应该以正确的权限恢复。
正确修复是一项繁琐的工作。通过编写修复数据目录权限的自动化脚本来记录。希望下次备份可以修复问题,但最好制定权限政策。