Есть ли способ дать различным пользователям уникальную системную дату / время в Ubuntu?

Например, если я хотел, чтобы дата Боба всегда была 22 июня для пользователя Боба (потому что это его день рождения), но при этом у всех остальных пользователей было правильное отображение даты / времени, есть ли способ, прямой или нет, сделать это?

1 ответ1

1

Не нужно взламывать ядро. Это было бы относительно легко с библиотекой вставки, предполагающей способы, которые использует Боб, чтобы знать, какое время ограничено.

Например, многие команды, такие как date(1), используют clock_gettime(2) для получения текущей даты и времени. Вставляющая библиотека на лету исправит часть даты и установит ее 22 июня.

Это не будет работать со статически связанными двоичными файлами, такими как busybox, но эти двоичные файлы могут быть легко исправлены таким же образом.

Вот пример кода, демонстрирующий выполнимость:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>

int clock_gettime(clockid_t clk_id, struct timespec *tp)
{
    static int (*cgt)(clockid_t, struct timespec*) = NULL;
    if (!cgt)
        cgt = dlsym(RTLD_NEXT, "clock_gettime");

    int rv = cgt(clk_id, tp);
    if(getuid()==1000) // Assuming 1000 is bob's uid.
    {
        struct tm * tm=localtime(&tp->tv_sec);
        tm->tm_mday=22;
        tm->tm_mon=5;
        time_t tt=mktime(tm);
        tp->tv_sec=tt;
    }
    return rv;
}

И что это обеспечивает:

$ date
Wed Jun  2 23:44:51 CEST 2011
$ export LD_PRELOAD=$PWD/a.so
$ date
Wed Jun 22 23:44:51 CEST 2011
$ id -u
1000

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .