Судо - чи є команда перевірити, чи є у мене судо та / або скільки часу залишилось?


27

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

Дивіться заголовок. Я хочу команду, яка дозволяє мені запитувати sudo. В ідеалі це поверне успіх, якщо у мене все ще є судо і помилково, якщо термін дії судо закінчився. Отримати час, що залишився, також може бути корисним (хоча, якби я був стурбований, я міг би просто зробити sudo -v, щоб переоцінити.) О, і не потрібно було б просити пароль.

Найближче, що я знайшов - це "sudo -n true", але варіант -n присутній лише на моїй машині Centos 5 на роботі. -n не вдається, якщо доведеться запитати пароль. Чи є якийсь інший спосіб отримати цю функціональність? Припустимо, я фактично не маю root на всіх машинах, з якими працюю, тому не можу встановити нові версії sudo на свій смак.

Що варто того, я роблю це, щоб я міг підказати статус судо. Мені подобається знати, які термінали можуть активно працювати на sudo. У мене також є підказка, яка змінює кольори, коли я отримую root, але я не дуже часто використовую root, тому це обмежене використання.

Відповіді:


10

Цей -nваріант доступний у нових версіях sudo, але, як ви заявили, це не варіант. Немає реального способу зробити те, що ви хочете, просто спробувати судо і побачити, чи повертається він із запитом про пароль. Якщо ви стурбовані тим, що ви хочете отримати візуальну індикацію, то чому б не почати робити sudo / bin / bash, щоб почати сеанс кореневої баш? Зауважте, що це небезпечно, але також дещо небезпечно, якщо хтось усвідомлює ваші швидкі зміни на судо.


1
+1 для посилення безпеки візуального індикатора!
Призупинено до подальшого повідомлення.

Ця частина мені не прийшла в голову. Що я сподіваюся, що індикатор робить, це нагадує мені запустити sudo -K, замість того, щоб забути, що я залишив активний sudo і залишив відкриті деякі потенційно небезпечні термінали. Не те, що я часто забуваю заблокувати екран, але мені подобається додаткова страховка.
valadil

На даний момент я схиляюсь до перевірки sudo -V, і якщо він достатньо новий, щоб мати -n, перевіряючи -n, щоб отримати повідомлення. Здається, ніде нічого не повинно ламати.
valadil

@valadil: Мені здається, що тонкий показник не спричинить занадто великий ризик безпеки. Наприклад, увімкніть підкреслення для імені користувача у запиті, наприклад.
Призупинено до подальшого повідомлення.

@Dennis: Саме так. Я не збирався змінювати своє запит на "OMG_YOU_HAVE_SUDO_NOW! _User @ host" або щось подібне. Напевно, я б трохи змінив колір. Я не сподіваюсь, що хтось дізнається, що це означає, якщо вони не сідатимуть і не зблизяться з моїм.
valadil

29

Я знаю, що це дійсно давнє запитання, але ось що я зробив у сценарії сьогодні:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
якщо [$ {CAN_I_RUN_SUDO} -gt 0]
потім
    відлуння "Я можу виконати команду sudo"
ще
    відлуння "Я не можу запустити команду Судо"
фі

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схоже, не працює на ОС X. Дивіться моє запитання тут: superuser.com/questions/902826/…
nwinkler

Що ж, тест, який я пропоную sudo -n, чи вважаєте ви, що може бути якийсь інший тест, який міг би бути використаний для визначення, чи є у користувача активний доступ до sudo? а може ОС-X потребує певного оновлення? Я ніколи не використовував OS-X btw.
Сила Водолія

2
Я використовую останню версію ОС X. Можливо, що sudo -nв BSD (на якій базується OS X) поведінка відрізняється від версії GNU. Щойно я додав свій коментар, щоб повідомити людям, що ця версія перевірки, здається, не працює на OS X. Я використав чек з іншої відповіді ( sudo -n uptime 2>&1|grep "load"|wc -l), і це здається, що він працює добре в OS X. Це не так елегантно, але це працює.
nwinkler

1
@nwinkler о, тож насправді це залежить від результату, який він генерує (не повертається значення), цікаве вирішення проблеми
Power Aquarius

@nwinkler, але це як можна ближче. Або ще краще, тому що sudo -nстає баггі в судо -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буде повідомлення, що надсилатиметься для кожного тесту, що призводить до помилки (підказує). Щоб уникнути подібних неприємностей, змініть ту частину файлу ваших судорів

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

В результаті повідомлення з безпеки надсилаються для всіх команд, крім / bin / true. Ну так, зараз хтось може спробувати змусити запросити пароль, зателефонувавши sudo trueнеобмежену кількість разів, не надсилаючи жодної пошти з питань безпеки.

Примітка. visudoЩоб редагувати файл sudoers, замість улюбленого редактора завжди використовуйте . Якщо цього не зробити, ви ризикуєте закритися.


0

Згідно з посібником із судо, сеанс судо визначається відповідно до файлу штампу часу ( /usr/lib/sudo/<username>), тому ви, можливо, зможете визначити, скільки часу залишилось, перевіривши дату / час файлу штампу часу. Однак у моїй системі файл /usr/lib/sudo/<username>часової позначки насправді є каталогом, і в них є три файли з криптовалютним вмістом (а також деякі дивні часові позначки , але, схоже, є часова марка, яка збігалася з часом, коли я дав свій пароль моєму паролю Я думаю, що /usr/lib/sudo/<username>/0має печатку часу останнього sudoвиконання.


1
У моїй системі файли часових позначок знаходяться в каталозі, який неможливо прочитати без використання sudo, який запросить пароль і, отже, не працюватиме для потреб ОП.
Призупинено до подальшого повідомлення.

Влучне зауваження. Я не перевіряв право власності на ці файли. Ви маєте рацію, було б марно.
Дайстер


0

Принаймні, на sudo 1.8.21p2, такий підхід працює чудово:

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

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

Це запросить пароль, якщо користувач ще не має активного сеансу
судо

-2

Як щодо сторінки man

man sudo

Перерахуйте наявні команди:

sudo -l

У судо немає обмежень щодо часу та дати ... дивіться:

man sudo
man sudoers

sudo -l дає мені запит на введення пароля. Мені потрібно це, щоб сказати мені, що у мене немає активного сеансу судо.
valadil

статус судо-тайм-ауту, але ви маєте рацію, якщо маєте на увазі, що він не має функції розкладу.
Призупинено до подальшого повідомлення.

Так - час поза часом, але розкладу немає.
Андреас Рем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.