Я хочу выполнить определенную команду, такой как rm
, в то время как зарегистрированный как корень, но я хочу, чтобы подсказка пароля root была показана каждый раз. Когда я работаю su -c "command"
как корень, мне не предложили пароль.
Специально для su
, корень не запрашивается пароль, потому что su
правила PAM позволяют его:
$ grep root /etc/pam.d/su
# This allows root to su without passwords (normal operation)
auth sufficient pam_rootok.so
# Uncomment this to force users to be a member of group root
# than the default "root" (but this may have side effect of
# denying "root" user, unless she's a member of "foo" or explicitly
# permitted earlier by e.g. "sufficient pam_rootok.so").
, Если Вы хотите сделать su
, просят пароль для корня, комментируют использование pam_rootok
. Конечно, su
не заботится о командах, таким образом, любое использование su
корнем затем попросит пароль.
Вы не можете защитить отдельные команды от корня, не рискуя большой поломкой. Просто заблокируйте свой терминал при отъезде его. Не выполняйте корневые сессии.
Простое решение, о котором я могу думать, к su
другому пользователю и затем обратно к root
снова:
su userx -c 'su -c "ls"'
Один недостаток этого состоит в том, что при необходимости в специальных символах в команде выход становится хитрым.
Можно использовать этот код для rm
сценарий обертки, но Вы могли бы хотеть создать аналогичные версии для mv
и find
также.
Редактирование 5 марта 2017 - метод Изменения проверки при выполнении в терминале.
Этот ответ проверяет при выполнении на терминале и не запрашивает пароль при выполнении в фоновом сценарии, таком как запуск, крон или GUI. Сценарий может быть улучшен для обеспечения rm
был введен непосредственно в терминале. Затем, если другой сценарий как sudo update-grub
или sudo apt update
названный rm
второй пароль не требовался бы.
Я записал, что сценарий к паролю защищает rm
как OP, который требуют и код ниже, то же кроме него пароль требований от sudo / пользователь root. Это также имеет редактирования для предотвращения Вас от случайного удаления:
Использовать gksu gedit /usr/local/bin/rm
и копия в этих строках:
#!/bin/bash
tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi
if [ $Terminal == "Y" ] ; then
# Running from terminal don't allow delete of / or /toplevel directory even if sudo
for i in ${@:1}
do
# Skip options -i -r -v -d
if [[ ${i:0:1} != "-" ]] ; then
# if parameter doesn't begin with '-' it's file or directory, so get real path.
fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
# We must have at least two `/` in the full path
levels=$(echo "$fullname" | tr -cd '/' | wc -c)
if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
echo "Attempting to remove top level directory '$fullname'"
echo "Use 'sudo /bin/rm $@' instead."
exit 1 # error
fi
fi
done
fi
if [ $Terminal == "Y" ] ; then
# Only running from a terminal needs password (ie not cron)
# log rm usage to /var/log/syslog
PARENT_COMMAND="$(ps -o comm= $PPID)"
logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"
# Get password
Password=$(zenity --password --title="Password for rm")
encryptPassword=$(echo -n "$Password" | md5sum)
echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.
if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe -" ]]; then
echo "Invalid password!"
exit 1
fi
fi # non-terminals can't enter password.
# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"
exit 0
Измените пароль "WE2U" на что-либо, что Вы любите и сохранили файл.
rm
сценарий как исполняемый файлНовый флаг rm
сценарий как исполняемое использование:
sudo chmod +x /usr/local/bin/rm
Если пароль не является WE2U, в первый раз, когда Вы запускаете скрипт, Вы получите "неверный пароль" и ключ шифрования для пароля, который Вы ввели, отображен. Скопируйте и вставьте этот ключ шифрования от терминала в сценарий. Затем прокомментируйте строку с эхом, которое отобразило ключ шифрования на терминале.
Поскольку путь /usr/local/bin
выше в списке, чем /bin
наша команда rm
назван. После получения действительного пароля это звонит /bin/rm
сделать реальное удаление.
Вызовы сценария logger
записывать каждый раз rm
был вручную назван с помощью терминала. Использование команды зарегистрировано к /var/log/syslog
.
Взятый из ответа, отправленного в (Как я могу настроить пароль для команды 'комнаты'?) и измененный для требования пароля от пользователя root также.