
Я просто пытаюсь добавить запрос подтверждения для нескольких команд Linux, таких как chmod
и chown
.
Я пытался найти информацию в Google, но не смог найти много информации по этой теме.
Во время поиска я обнаружил, что есть решение для rm
использования этой -i
опции, хотя ее можно перезаписать с помощью-f
Однако есть safe-rm
пакет, который вы можете установить на своем сервере и который заносит в черный список определенные важные каталоги, что является довольно хорошим решением, но, к сожалению, аналогичного пакета для chmod
и нет chown
.
Поэтому моим идеальным решением было бы наличие запросов на подтверждение, chmod
а chown
также внесение определенных каталогов в черный список от chmod- и chown-редактирования.
Буду очень признателен за любые ответы!!!
решение1
КомандыЧаун (1)ичмод (1)изначально не имеют такой возможности. Если вы хотите добавить эту функциональность, то вы либо:
- Придется изменить исходный код и перекомпилировать.
- Или написать обертку.
Первый вариант самый чистый. Второй — проще. Если вы застряли при написании этого, то вам нужен новый вопрос, который, вероятно, лучше подойдет для [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.*