Sudo - есть ли команда, чтобы проверить, есть ли у меня sudo и / или сколько времени осталось?

27

(Первоначально опубликовано на переполнение стека. Они предложили мне попробовать здесь. Вот оригинальное сообщение: /programming/3858208/sudo-is-there-a-command-to-check-if-i-have -судо-или-или-сколько-осталось времени )

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

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

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

valadil
источник

Ответы:

10

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

8BitsOfGeek
источник
1
+1 за последствия для безопасности визуального индикатора!
Приостановлено до дальнейшего уведомления.
Эта часть не пришла мне в голову. Я надеюсь, что индикатор напомнит мне запустить sudo -K, вместо того, чтобы забыть, что я оставил sudo активным и оставил открытыми некоторые потенциально опасные терминалы. Не то чтобы я часто забывал заблокировать экран, но мне нравится дополнительная страховка.
Валадил
В данный момент я склоняюсь к проверке sudo -V, и, если он достаточно новый, чтобы иметь -n, проверяю -n, чтобы получить уведомление. Похоже, это никуда не должно сломаться.
Валадил
@valadil: мне приходит в голову, что тонкий индикатор не будет представлять слишком большую угрозу безопасности. Например, включите подчеркивание для имени пользователя в приглашении.
Приостановлено до дальнейшего уведомления.
@ Денис: Точно. Я не собирался менять свое приглашение на «OMG_YOU_HAVE_SUDO_NOW! _User @ host» или что-то в этом роде. Я бы, наверное, просто немного изменил цвет. Я не ожидаю, что кто-нибудь узнает, что это значит, если только они не сядут и не станут близки с моим .bashrc.
Валадил
29

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

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
если [$ {CAN_I_RUN_SUDO} -gt 0]
тогда
    echo "Я могу запустить команду sudo"
еще
    эхо "Я не могу запустить команду Судо"
фи
wags007
источник
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 ниже.

Водолей Сила
источник
Проверка кода выхода sudo -nне работает на OS X. Смотрите мой вопрос здесь: superuser.com/questions/902826/…
nwinkler
Итак, тест, который я предлагаю, заключается в том sudo -n, считаете ли вы, что может быть какой-либо другой тест, который можно использовать для определения, активен ли у пользователя доступ sudo? или, может быть, OS-X требует обновления? Я никогда не использовал OS-X, кстати.
Водолей Power
2
Я использую последнюю версию OS X. Возможно, что sudo -nв BSD (на которой основана OS X) поведение отличается от версии GNU. Я просто добавил свой комментарий, чтобы люди знали, что эта версия проверки, похоже, не работает на OS X. Я использовал проверку из другого ответа ( sudo -n uptime 2>&1|grep "load"|wc -l), и, похоже, это работает нормально на OS X. Это не так элегантно, но это работает.
nwinkler
1
@nwinkler о, так что это на самом деле зависит от генерируемого результата (не от возвращаемого значения), интересный обходной путь
Aquarius Power,
@nwinkler, но это как можно ближе. Или даже лучше, потому что sudo -nстановится глючным в sudo -V 1.7.9
Марко М. фон Хаген
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. В противном случае вы рискуете быть заблокированным.

Уве Гойдер
источник
0

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

Dysaster
источник
1
В моей системе файлы временных меток находятся в каталоге, который невозможно прочитать без использования sudo, которое запрашивает пароль и, следовательно, не будет работать для нужд OP.
Приостановлено до дальнейшего уведомления.
Хорошая точка зрения. Я не проверял право собственности на эти файлы. Вы правы, это было бы бесполезно.
Dysaster
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 1.8.21p2 этот подход работает нормально:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi
fxlv
источник
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
Гарольд Фишер
источник
-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
danday74
источник
Это
запросит
-2

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

man sudo

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

sudo -l

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

man sudo
man sudoers
Андреас Рем
источник
sudo -l дает мне запрос пароля. Мне нужно сказать, что у меня нет активной сессии sudo.
Валадил
Состояние sudo истекло, но вы правы, если имеете в виду, что у него нет функции расписания.
Приостановлено до дальнейшего уведомления.
Да - это истекло время - но нет графика.
Андреас Рем