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

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

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

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

3 Solutions collect form web for “Как узнать, была ли утеряна моя sudoer-привилегия?”

Используйте опцию -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; } 
  • Что означает «ВСЕ ВСЕ = (ВСЕ) ВСЕ» означает в судерах?
  • Может ли вредоносное ПО запускаться после входа пользователя в режим sudo?
  • Есть ли способ запустить sudo, не запуская еще одну ненужную команду?
  • В чем разница между gksu и sudo?
  • sudoers: NOPASSWD в той же строке, что и PASSWD: ALL?
  • Специальная команда Sudo без пароля
  • su для конкретного пользователя, только если запрашивающий пользователь находится в определенной группе
  • Разрешить пользователю использовать sudo без пароля
  • sudo host field: для чего он используется?
  • Как восстановить права доступа к файлу sudoers без пароля?
  • Невозможно добавить себя в группу «судо»
  • Как возможно, что команда найдена без, но не с sudo -E?
  • Linux и Unix - лучшая ОС в мире.