Запрос подтверждения для 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. Если вы хотите добавить эту функциональность, то вы либо:
- Приходится менять исходный код и перекомпилировать.
- Или напишите обертку.
Первый вариант самый чистый. Второе - легче. Если вы застряли, написав это, вам нужен новый вопрос, который, вероятно, лучше подходит для [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.*