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

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

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

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

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

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

Любые ответы очень ценятся!!!

2 ответа

Решение

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

  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

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

Решением в 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.*
Другие вопросы по тегам