有人知道用于检查文件夹/文件权限并修复/恢复的脚本、程序等吗?

有人知道用于检查文件夹/文件权限并修复/恢复的脚本、程序等吗?

我并不是新手。我是一名专业人士,正在向其他专业人士请教他们如何快速解决常见问题,我知道该怎么做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: <--

由于没有找到理想的解决方案,我决定修改上述脚本并使其有利于实现我想要的解决方案:

permafix.sh - github 上的 Gist

#!/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 私钥。出于谨慎考虑,请考虑更改这些凭据。

至于其余的用户数据,很难说。用户通常(但并非总是)拥有主目录中的文件。多个用户共享目录可能会变得棘手,因为可能不再知道正确的所有者和模式。

如果存在,则备份应该以正确的权限恢复。

正确修复是一项繁琐的工作。通过编写修复数据目录权限的自动化脚本来记录。希望下次备份可以修复问题,但最好制定权限政策。

相关内容