26

(Первоначально опубликовано на переполнение стека. Они предложили мне попробовать здесь вместо этого. Вот оригинальное сообщение: https://stackoverflow.com/questions/3858208/sudo-is-there-a-command-to-check-if-i-have-sudo-and-or-how-much-time-is левый)

Смотрите заголовок. Я хочу команду, которая позволяет мне запрашивать sudo. В идеале было бы возвращение успеха, если у меня все еще есть sudo и false, если срок действия sudo истек. Получение оставшегося времени также может быть полезно (хотя, если бы меня это беспокоило, я мог бы просто сделать sudo -v для повторной проверки.) Да, и не нужно спрашивать пароль.

Самое близкое, что я нашел, это «sudo -n true», но опция -n присутствует только на моей машине с Centos 5 на работе. -n не удается, если он должен попросить пароль. Есть ли другой способ получить эту функциональность? Предположим, у меня нет root на всех машинах, с которыми я работаю, поэтому я не могу устанавливать новые версии sudo по своему вкусу.

Для чего это стоит, я делаю так, чтобы я мог получить подсказку, чтобы указать статус sudo. Мне нравится знать, какие терминалы активно sudo-способны. У меня также есть подсказка, которая меняет цвета, когда я root, но я не очень часто использую root, поэтому он ограничен.

10 ответов10

28

Я знаю, что это действительно старый вопрос, но вот что я сделал сегодня в сценарии:

CAN_I_RUN_SUDO=$(sudo -n uptime 2>&1|grep "load"|wc -l)
if [ ${CAN_I_RUN_SUDO} -gt 0 ]
then
    echo "I can run the sudo command"
else
    echo "I can't run the Sudo command"
fi
10

Опция -n доступна в более новых версиях sudo, но, как вы сказали, это не вариант. Нет никакого реального способа сделать то, что вы ищете, кроме как просто попробовать sudo и посмотреть, вернется ли он с запросом пароля. Если вас беспокоит, что вам нужна визуальная индикация, почему бы не запустить sudo /bin /bash для запуска сеанса root bash? Обратите внимание, что это небезопасно, но также несколько небезопасно, если кто-то осознает ваши быстрые изменения в sudo.

1

Чтобы упростить ответ, данный @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

Однако, если в вашей конфигурации https://www.sudo.ws/man/1.8.15/sudoers.man.html у вас есть defaults mail_badpass будет отправляться письмо для каждого теста, результатом которого будет false (было бы предложено). Чтобы избежать такой неприятности, измените эту часть файла sudoers на

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

В результате письма с предупреждениями безопасности отправляются для всех команд, кроме /bin /true. Ну, да, теперь кто-то может попытаться взломать пароль, позвонив sudo true неограниченное количество раз без отправки какого-либо сообщения с предупреждением.

Примечание. Всегда используйте visudo вместо вашего любимого редактора для редактирования файла sudoers. В противном случае вы рискуете быть заблокированным.

1

Команда ниже покажет цветную индикацию того, что вы предоставили sudo, так что вы не забудьте сделать sudo -k прежде чем уходить от машины. Это полезно также на неокрашенных терминалах.

Поскольку sudo может быть активным и неактивным на разных терминальных сессиях, я создал это, что вы можете поместить в конец вашего ~/.bashrc

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

В терминале наберите bash чтобы проверить это. Каждый раз, когда вы выполняете команду, она также добавляет целую строку, которая содержит информацию о времени окончания последней команды, чтобы вы могли пообедать и узнать, когда последняя команда завершилась :).

Вы можете играть с этим кодом, чтобы соответствовать вашим потребностям. Существует также переменная PS1 (то есть фактическая небольшая строка подсказки), но я думаю, что лучше не связываться с ней.

PS: для OS-X ищите комментарий ниже @nwinkler.

0

Предупреждение

Согласно Bugzilla sudo Bug ID = 590 вызов sudo -n true 2&>/dev/null ; echo $? вокруг sudo -V 1.7.10

Читайте Bugzilla [здесь](http://bugzilla.sudo.ws/show_bug.cgi?id=590 "Bug ID = 590")

0

Вероятно, это является чрезмерным перебором по стандарту большинства людей, но вот (правильно заданная) функция, которую я использую, чтобы проверить, разблокирована ли sudo (функция не будет тратить свое время, если пользователь, выполняющий ее, является пользователем root , поскольку нет необходимости разблокировать sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo
0

Согласно руководству sudo, сеанс sudo определяется в соответствии с файлом отметки времени (/usr/lib/sudo/<username>), поэтому вы можете выяснить, сколько времени осталось, проверив дату / время файл метки времени. Однако в моей системе файл меток времени фактически является каталогом, и в нем есть три файла с загадочным содержимым (а также некоторые странные метки времени, но, похоже, в /usr/lib/sudo/<username> есть метка времени это совпало со временем, когда я дал sudo свой пароль. Я думаю, что /usr/lib/sudo/<username>/0 имеет метку времени последнего выполнения sudo .

0

По крайней мере, на sudo 1.8.21p2 этот подход работает нормально:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi
-1

простой ответ ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0
-2

Как насчет справочной страницы

man sudo

Перечислите ваши доступные команды:

sudo -l

Само sudo не имеет ограничений по времени или дате ... см .:

man sudo
man sudoers

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