Я не новичок. Я профессионал, умоляющий других профессионалов об их открытиях быстрого решения общей проблемы, и я знаю, что такое chmod -R
.
Это ответ на оценку -1, мгновенно присвоенную моему вопросу, для тех, кто может игнорировать серьезность моего запроса или отрицать его обоснованность.
Эксперименты с sshfs между моим рабочим столом и удаленным сервером, на котором Kali linux работает от имени пользователя root (по умолчанию для 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
Кто-нибудь нашел что-нибудь более существенное, что может исправить разрешения и права собственности для файловой системы?
-> Обновление: <-
Не обнаружив желаемого решения, я решил модифицируя приведенный выше сценарий и сделав его способствующим моему желаемому разрешению:
#!/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
Есть другие способы сделать это, а также лучшие способы написания кода. Но пока это работает.
---> Еще одно обновление <---
Я исправил неосторожную ошибку в скрипте, правильно изменив положение нескольких переменных, которые ранее были недоступны из-за структуры скрипта.
Воспользуйтесь этой ссылкой, чтобы получить самую последнюю версию этого скрипта.
Простого сценария для исправления произвольно нарушенных разрешений в системе общего назначения не существует. Вы, ваши пользователи и программное обеспечение, которое вы используете, можете установить любые разрешения, которые вам нравятся, чтобы соответствовать вашим требованиям. Слишком широкие изменения разрешений - это потеря метаданных.
Сначала определите, как были нарушены разрешения, например, команды chmod
chown
setfacl
или chcon
. Если право собственности неверно, вам нужно будет исправить это, например, вернуть файл в домашнем каталоге его владельцу. Имейте в виду, что здесь есть тонкие моменты, например, chown снимет флаги setuid. Например, /usr/bin/ping может не работать, если он потеряет setuid root. Знаете ли вы, какие еще ваши программы нуждаются в setuid? Более сложные ACL или ярлыки selinux не входят в ваше решение, но могут усложнить ситуацию, если они также ошибочны.
Вы можете попытаться исправить разрешения на те, которые были при установке пакета. В системах на базе Debian вы можете передать вывод dpkg --contents
в сценарий chmod chown. Загрузка .debs для всех установленных пакетов для запроса dpkg - это упражнение для читателя. Это ничего не даст для пользовательских данных или программ, не установленных через deb.
Выявление конфиденциальной информации, ранее защищенной правами доступа к файлам. Включая, но не ограничиваясь, закрытые ключи ssh и gpg. Рассмотрите возможность изменения этих учетных данных из осторожности.
Что касается остальных пользовательских данных, трудно сказать. Пользователи обычно, но не всегда, владеют файлами в своих домашних каталогах. С общими каталогами нескольких пользователей могут возникнуть сложности, поскольку правильный владелец и режим могут быть больше не известны.
Резервные копии должны восстанавливаться с правильными разрешениями, если они существовали.
Кропотливая работа для правильного исправления. Документируйте, написав сценарий автоматизации, который исправляет разрешения в каталогах данных. Надеюсь, что резервные копии исправят ситуацию в следующий раз, но с тем же успехом можно создать политику, определяющую, какими должны быть разрешения.