Intereting Posts
Эффективное приложение todo / project / task manager * Совместимость с исполняемым файлом nix Как выйти из системы, когда рабочий стол замерзает? Что такое проверка целостности qemu-img? Добавление только существующих слов в файл из другого файла и удаление остальных (unix)? Общий ресурс Samba показывает каталог пользователя Загрузите графическое приложение прямо из загрузки Linux (без подробных загрузочных сообщений и рабочего стола) Браузер не может связаться с хостом на Solaris 8 Fedora делает команду сломанной, несоответствие ядра Каким будет пакет RHEL, соответствующий встроенному в Ubuntu? Автоматическая перезагрузка, если соединение Wi-Fi в течение определенного времени Получение 256 цветов для работы в tmux Предотвращение перехода мониторов на экран блокировки на GNOME Как установить emacs с помощью YUM без библиотек X11? Как переместить некоторые, но не все файлы из одного каталога в другой?

Как узнать, была ли утеряна моя sudoer-привилегия?

Я работаю над скриптом, который запускает команду как sudo и повторяет текст текста ТОЛЬКО, если мои привилегии sudo имеют тайм-аут, поэтому, только если для запуска команды с sudo потребуется мой пользователь (а не root), чтобы снова ввести пароль.

Как это проверить? Имейте в виду, что $(id -u) даже при запуске как sudo вернет мой текущий идентификатор пользователя, чтобы не было проверки, чтобы соответствовать ему с 0 …

Мне нужен метод, который будет проверять это спокойно.

Используйте опцию -n чтобы проверить, есть ли у вас все еще привилегии; от man sudo :

-n , –non-interactive

Избегайте приглашать пользователя на вход любого типа. Если для выполнения команды требуется пароль, sudo отобразит сообщение об ошибке и выйдет.

Например,

 sudo -n true 2>/dev/null && echo Privileges active || echo Privileges inactive 

Имейте в виду, что срок действия привилегий истекает между проверкой с помощью sudo -n true и фактическим использованием. Вы можете попробовать напрямую с помощью команды sudo -n command... и в случае сбоя отобразить сообщение и, возможно, повторить запуск sudo интерактивном режиме.

Редактировать: См. Также комментарий Рухаха ниже.

Бег:

 sudo -nv 

Если ваши привилегии sudo имеют тайм-аут, это приведет к завершению с кодом выхода 1 и выходом:

 sudo: a password is required 

Если у вас есть действительные кэшированные учетные данные, эта команда будет успешной и ничего не выводит.

Итак, чтобы собрать все вместе, вот скриптлет, который будет тихо проверять, есть ли у вас действительные кэшированные учетные данные:

 if sudo -nv 2>/dev/null; then echo "no sudo password required" else echo "sudo password expired" fi 

Как упоминалось в других ответах / комментариях, опция -v («validate») для sudo молча возобновляет кэшированные учетные данные, если есть какие-либо запросы на аутентификацию, чтобы генерировать кэшированные учетные данные и параметр -n («неинтерактивный») не позволяет sudo создавать любые интерактивные подсказки, например приглашение на аутентификацию.

sudo -nv отлично работает, но загрязняет системные журналы с ошибками sudo и информацией об аутентификации pam. Мне нужно было проверить привилегии sudo для моего приглашения bash, поэтому он выполнялся довольно часто, и мои журналы состояли почти только из этого шума.

Можно напрямую проанализировать файл sudo timestamp – я написал для него небольшой C util:

 /* compile and set permissions: */ /* $ gcc checksudo.c -o checksudo -std=gnu99 -O2 */ /* $ chown root:root checksudo */ /* $ chmod +s checksudo */ #define USERNAME "replace-with-your-username" #define TIMEOUT 5 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <time.h> void timespec_diff(struct timespec *start, struct timespec *stop, struct timespec *result) { if ((stop->tv_nsec - start->tv_nsec) < 0) { result->tv_sec = stop->tv_sec - start->tv_sec - 1; result->tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000; } else { result->tv_sec = stop->tv_sec - start->tv_sec; result->tv_nsec = stop->tv_nsec - start->tv_nsec; } return; } int main(int argc, char** argv) { if (geteuid() != 0) { printf("uid is not 0 - checksudo must be owned by uid 0 and have the setuid bit set\n"); return 2; } struct timespec current_time; if (clock_gettime(CLOCK_BOOTTIME, &current_time) != 0) { printf("Unable to get current time: %s\n", strerror(errno)); return 2; } struct stat ttypath_stat; if (stat(ttyname(0), &ttypath_stat) != 0) { printf("Unable to stat current tty: %s\n", strerror(errno)); return 2; } FILE* timestamp_fd = fopen("/var/run/sudo/ts/" USERNAME, "rb"); if (timestamp_fd == NULL) { printf("Unable to open sudo timestamp file: %s\n", strerror(errno)); return 2; } long offset = 0; int found = 0; while (1) { if (fseek(timestamp_fd, offset, SEEK_SET) != 0) { printf("Failed to seek timestamp file: %s\n", strerror(errno)); return 2; } unsigned short timestamp_entry_header[4]; if (feof(timestamp_fd)) { printf("matching timestamp not found\n"); return 2; } if (fread(&timestamp_entry_header, sizeof(unsigned short), 4, timestamp_fd) < 4) { break; } if (ferror(timestamp_fd)) { printf("IO error when reading timestamp file\n"); return 2; } // read tty device id if (timestamp_entry_header[2] == 2 && timestamp_entry_header[3] == 0) { if (fseek(timestamp_fd, offset + 32, SEEK_SET) != 0) { printf("Failed to seek timestamp file: %s\n", strerror(errno)); return 2; } dev_t tty_dev_id; if (fread(&tty_dev_id, sizeof(dev_t), 1, timestamp_fd) < 1) { printf("EOF when reading tty device id\n"); return 2; } if (tty_dev_id == ttypath_stat.st_rdev) { // read timestamp if (fseek(timestamp_fd, offset + 16, SEEK_SET) != 0) { printf("Failed to seek timestamp file: %s\n", strerror(errno)); return 2; } struct timespec sudo_time; if (fread(&sudo_time, sizeof(struct timespec), 1, timestamp_fd) < 1) { printf("EOF when reading timestamp\n"); return 2; } struct timespec time_since_sudo; timespec_diff(&sudo_time, &current_time, &time_since_sudo); found = time_since_sudo.tv_sec < TIMEOUT * 60; break; } } offset += timestamp_entry_header[1]; } fclose(timestamp_fd); return !found; }