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

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

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

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

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

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

2 ответа2

1

Решением в 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.*
0

Команды 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 для каждого файла (после проверки правильности синтаксиса).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .