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

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

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

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

  • Как я могу добавить разрешение sudo для копирования?
  • Как сделать пароль sudo автоматически автоматически, не запрашивая его?
  • как рассказать vi, чтобы не открывать всех включенных юдеров?
  • Почему нам нужно использовать visudo вместо прямой модификации файла sudoers?
  • Как узнать тип пользователя в машине LINUX
  • Как указать регулярное выражение для аргументов команды в sudoers
  • Попросите пароль пользователя, чтобы он переключился на
  • Разрешить пользователю запускать команду с аргументами (которая содержит пробелы)
  • 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; } 
    Linux и Unix - лучшая ОС в мире.