在 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