我可以在 Ubuntu 中为单个用户设置唯一的日期/时间吗?

我可以在 Ubuntu 中为单个用户设置唯一的日期/时间吗?

在 Ubuntu 中有没有办法为不同的用户提供唯一的系统日期/时间?

例如,如果我希望用户 Bob 的日期始终为 6 月 22 日(因为这是他的生日),但仍然为其他每个用户显示正确的日期/时间,有没有一种直接或间接的方法可以做到这一点?

答案1

无需破解内核。使用一个插入库(假设 Bob 用来了解时间的方式是有限的)会相对容易。

例如,许多命令(如 date(1))都使用 clock_gettime(2) 来获取当前日期和时间。一个中间库会动态修补日期部分并将其设置为 6 月 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

相关内容