Выполните определенную команду с подсказкой пароля root даже если выполнение как корень

Я хочу выполнить определенную команду, такой как rm, в то время как зарегистрированный как корень, но я хочу, чтобы подсказка пароля root была показана каждый раз. Когда я работаю su -c "command" как корень, мне не предложили пароль.

4
задан 1 March 2017 в 04:26

3 ответа

Специально для 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 корнем затем попросит пароль.

Вы не можете защитить отдельные команды от корня, не рискуя большой поломкой. Просто заблокируйте свой терминал при отъезде его. Не выполняйте корневые сессии.

10
ответ дан 23 November 2019 в 11:35

Простое решение, о котором я могу думать, к su другому пользователю и затем обратно к root снова:

su userx -c 'su -c "ls"'

Один недостаток этого состоит в том, что при необходимости в специальных символах в команде выход становится хитрым.

0
ответ дан 23 November 2019 в 11:35

Можно использовать этот код для 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" на что-либо, что Вы любите и сохранили файл.

Новый Mark rm сценарий как исполняемый файл

Новый флаг rm сценарий как исполняемое использование:

sudo chmod +x /usr/local/bin/rm

Как это Работы

rm password

Если пароль не является WE2U, в первый раз, когда Вы запускаете скрипт, Вы получите "неверный пароль" и ключ шифрования для пароля, который Вы ввели, отображен. Скопируйте и вставьте этот ключ шифрования от терминала в сценарий. Затем прокомментируйте строку с эхом, которое отобразило ключ шифрования на терминале.

Поскольку путь /usr/local/bin выше в списке, чем /bin наша команда rm назван. После получения действительного пароля это звонит /bin/rm сделать реальное удаление.

Вызовы сценария logger записывать каждый раз rm был вручную назван с помощью терминала. Использование команды зарегистрировано к /var/log/syslog.

Взятый из ответа, отправленного в (Как я могу настроить пароль для команды 'комнаты'?) и измененный для требования пароля от пользователя root также.

8
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

Похожие вопросы: