добавить статус сеанса sudo в PS1 без продления сеанса

Это не должно быть службой

Что-то, что не может быть остановлено без причинения катастрофического ущерба его работе, должно запускаться не как "служба", а как -сценарий задания или процесс.

То, что вы пытаетесь сравнить с ожиданием того, что Интернет прекратит запросы с вашего веб-сайта, прежде чем позволить systemctl stop apache2завершиться.

Для локальной машины, если вам нужно выключить машину, вы все равно не сможете продолжить запись файла. Если вы решили это сделать, то вы хотитеsystemctlзавершить службу без ожидания.

Возможно, вашей службе следует запустить другой скрипт, ожидающий завершения.

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


Я отвечаю на это следующими предложениями, не зная содержания вашего скрипта hltv_start.sh, потому что вы им не поделились. Таким образом, это не должно быть центральным в вашем вопросе. Соответственно, кроме этих мозговых штурмов, я не могу быть конкретным...


Рассмотрим:

  • Используйте скриптовый подход к тому, что Kdenlive делает в графическом интерфейсе, подобно опции выключения компьютера после завершения рендеринга. Вы можете адаптировать сценарий, чтобы начать запись файла, а затем автоматически отключить службу черезsystemctl stopпосле , когда вы закончите запись файла.
  • Создайте сценарий для записи файла для каждого -задания, используя wait, чтобы завершить процесс записи перед выходом.
  • Напишите отдельный скрипт, используя systemctlдля завершения этого процесса, который является своего рода силовым -ходом, который должен остановить процесс в середине -файла.
  • Если вам нужен задействованный сервис, используйте его для «прослушивания» или чего-то еще, а не для фактического написания — сервис, который вызывает сценарий, использующий wait, для завершения, если это даже необходимо.
  • Если служба только «слушает», а затем запускает другой скрипт, который записывает ваш файл, используя wait, то теоретически вы могли бы systemctl stopсвою службу разрешить завершение операции записи, что, я думаю, и является вашей целью.
4
22.07.2020, 03:12
1 ответ

Вы можете использовать файл временных меток, который sudo создает для -пользователя, чтобы узнать, как давно этот пользователь использовал команду sudo; если это больше, чем настроенныеtimestamp_timeout(по умолчанию 5 минут ), тогда для нового sudo потребуется пароль.

Файл пользователя -создается в/var/run/sudo/ts/(в моей системе ). Его формат частично описан в man sudoers, а из исходников timestamp.c и check.h видно, что он состоит из нескольких записей, описываемых структурой struct timestamp_entry_v1или новее struct timestamp_entry.

Версия git новее, чем исходные коды, соответствующие моей старой -системе ish, поэтому я использую старую структуру версии 1. Возможно, вам понадобится более новая версия 2 с дополнительным полем.

Вот минимальная программа на C для создания дампа записей для жесткого -проводного пользователя:

/* https://unix.stackexchange.com/a/595473/119298
 * struct from 
 * https://github.com/sudo-project/sudo/blob/master/plugins/sudoers/check.h
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define TS_VERSION      1
/* Time stamp entry types */
#define TS_GLOBAL       0x01
#define TS_TTY          0x02
#define TS_PPID         0x03
#define TS_LOCKEXCL     0x04
/* Time stamp flags */
#define TS_DISABLED     0x01    /* entry disabled */
#define TS_ANYUID       0x02    /* ignore uid, only valid in the key */

struct timestamp_entry {
    unsigned short version;     /* version number */
    unsigned short size;        /* entry size */
    unsigned short type;        /* TS_GLOBAL, TS_TTY, TS_PPID */
    unsigned short flags;       /* TS_DISABLED, TS_ANYUID */
    uid_t auth_uid;             /* uid to authenticate as */
    pid_t sid;                  /* session ID associated with tty/ppid */
    struct timespec ts;         /* timestamp (CLOCK_MONOTONIC) */
    union {
        dev_t ttydev;         /* tty device number */
        pid_t ppid;           /* parent pid */
    } u;
};

void main(int argc, char **argv){
    struct timestamp_entry entry;
    struct timespec now;
    int fd = open("/var/run/sudo/ts/meuh",O_RDONLY);

    if(fd<0)exit(1);
    clock_gettime(CLOCK_MONOTONIC, &now);
    while(read(fd,&entry,sizeof(entry))==sizeof(entry)){
        printf("type=%d flags=%d uid=%d sid=%d elapsedtime=%d\n",
               entry.type, entry.flags, entry.auth_uid, entry.sid,
               entry.ts.tv_sec-now.tv_sec);
    }
    exit(0);
}

Компиляция и запуск этого корневого каталога setuid в моей системе дали мне такие строки, как

type=4 flags=0 uid=0 sid=0 elapsedtime=-4763540
type=2 flags=1 uid=1000 sid=7003 elapsedtime=-4763540
type=2 flags=0 uid=1000 sid=4378 elapsedtime=-12

Первая запись типа 4 используется для блокировки записей. Другие линии могут быть на -tty и так далее. флаги 1 предназначены для отключенной записи (, например, из-заsudo -k). Последняя строка была для моего uid 1000, выполнившего команду sudo 12 секунд назад из процесса 4378. Поскольку это меньше 5 *60 секунд, дальнейшие sudo еще не нуждаются в пароле.

2
18.03.2021, 23:23

Теги

Похожие вопросы