Запрос подтверждения для chmod, chown

Запрос подтверждения для chmod, chown

Я просто пытаюсь добавить запрос подтверждения для нескольких команд Linux, таких как chmodи chown.

Я пытался найти информацию в Google, но не смог найти много информации по этой теме.

Во время поиска я обнаружил, что есть решение для rmиспользования этой -iопции, хотя ее можно перезаписать с помощью-f

Однако есть safe-rmпакет, который вы можете установить на своем сервере и который заносит в черный список определенные важные каталоги, что является довольно хорошим решением, но, к сожалению, аналогичного пакета для chmodи нет chown.

Поэтому моим идеальным решением было бы наличие запросов на подтверждение, chmodа chownтакже внесение определенных каталогов в черный список от chmod- и chown-редактирования.

Буду очень признателен за любые ответы!!!

решение1

КомандыЧаун (1)ичмод (1)изначально не имеют такой возможности. Если вы хотите добавить эту функциональность, то вы либо:

  1. Придется изменить исходный код и перекомпилировать.
  2. Или написать обертку.

Первый вариант самый чистый. Второй — проще. Если вы застряли при написании этого, то вам нужен новый вопрос, который, вероятно, лучше подойдет для [SO], но вкратце:

1) переместить chmod куда-нибудь еще. напримерmv /bin/chmod /bin/chmold.therealthing

2) Создайте исполняемый скрипт под названием chmod, который делает то, что вам нужно (и который вызывает настоящий chmod).

Непроверенное сообщение от человека, не являющегося специалистом по скриптам оболочки (то есть меня:)

#!/usr/bin/env bash
echo "/bin/chmod (Shell script) called with these arguments:"
echo $@

read -p "Are you sure you want to do this? (y/n) " RESPONSE
if [ "$RESPONSE" = "y" ]; then
    exec /bin/chmod.therealthing $@        
else
    echo "OK, aborting."
fi

если вам нужен более детальный контроль, то скрипт быстро становится более сложным. Тем не менее, если вы хотите, чтобы вы могли анализировать ввод и выполнять chmod для каждого файла (после проверки допустимого синтаксиса).

решение2

Решением в bash было бы использование функций оболочки и псевдонимов. Вы можете поместить их в /etc/bashrc или ~/.bashrc, если вы хотите, чтобы они были только для определенных пользователей. Вот некоторые определения функций и псевдонимов, которые вы могли бы использовать, чтобы сделать что-то вроде того, о чем вы просили.

DANGERLIST=/etc/dangerous.paths

_dangerouspath() {
        file=$(readlink -e "$1")
        [ -z "${file}" ] && return 1

        while read pattern
        do
                [[ "${file}" =~ ^${pattern}$ ]] && return 0
        done < ${DANGERLIST}

        return 1
}

_checkpaths() {
        shift
        while [ -n "$1" ]
        do
                [[ "X$1" =~ ^X[^-].* ]] && _dangerouspath $1 && return 0
                shift
        done

        return 1
}

_saferun() {
        p="$1"
        shift
        if _checkpaths $*
        then
                read -p "Are you sure you want to do this? (y/n) " r && [ "$r" = "y" ]  && $p $*
        else
                $p $*
        fi
}

alias chown="_saferun /bin/chown"
alias chgrp="_saferun /bin/chgrp"
alias chmod="_saferun /bin/chmod"

Вам нужно будет создать список путей, которые вы хотите защитить, в «$DANGERLIST» (/etc/dangerous.paths), который будет выглядеть примерно так:

/
/home
/etc.*
/usr/bin.*
/bin.*

Связанный контент