我想要一些用户(或一些进程)拥有不同的时间和日期。可以吗?
我怎样才能做到这一点?
答案1
什么运行日期执行的操作如下:
RunAsDate 拦截返回当前日期和时间的内核 API 调用(GetSystemTime、GetLocalTime、GetSystemTimeAsFileTime),并用您指定的日期/时间替换当前日期/时间。
在 Linux 下,您可以使用一些选项来完成同样的事情:
找到一个包装器库来执行此操作,或者编写自己的包装器库。下面给出了一些选项。
使用虚拟机。这有点过头了,但由于客户虚拟机中的操作系统与底层主机完全分开,因此您可以将其系统时间设置为完全不同的时间。与其他选项相比,设置起来可能更快。
选项 2 可以通过不同的方法实现,具体取决于您要运行的内容。DaveParillo 的回答链接至DIY 方法解释了不同的方法并包含可执行代码。其他一些选项包括:
datefudge
,可在 Debian/Ubuntu 存储库和其他地方使用。時間虛假perl 模块,也作为包存在于 Debian 存储库中
libtime-fake-perl
。FakeTime 预加载库(又名
libfaketime
,鲜肉链接),一个可以拦截动态链接二进制文件中的系统调用的库。Debian 存储库中提供了 Squeeze 和 Sid 的版本。
答案2
我在寻找 Linux Ubuntu 中 RunAsDate 的替代品时遇到了同样的问题,最后我找到了这个解决方案。
我创建了一个要与 RunAsDate 一起使用的程序启动器。如果您要使用的软件名为 Foo,请在桌面上创建一个名为 Foo.desktop 的文件,并使用 gedit 或类似的文本编辑器对其进行修改。然后向其中添加以下代码行:
[Desktop Entry]
Name=Foo
Comment=Runs the Foo application
Exec=sh -c "sudo date --set '01 Jan 2008 12:00:00'; path/to/Foo; sudo timedatectl set-ntp no; sudo timedatectl set-ntp yes;"
Icon=path/to/icon.png
Terminal=true
Type=Application
StartupNotify=true
您只需要将名称、评论和图标信息更改为您的实际资源即可。
当您使用该应用程序时,Exec 选项会更改会话的系统日期,然后当您完成后它会自动重新同步系统日期。
答案3
您可以将 TZ 设置为您想要的任何值。系统时间不受影响,但表观时间会发生变化。这与拦截内核不同,但不需要编码。使用 (3 个字母标识符)(与 UTC h:m:s 的偏移量)[(夏令时标识符)(与 UTC h:m:s 的夏令时偏移量)]。例如:TZ=XXX[+-]hh:ss:ssYYY[+-]hh:ss:ss
第二个 (夏令时) 集是可选的。
date; export TZ=FOO+23:11:17; date; export TZ=; date
返回:
Sat Oct 24 20:01:55 UTC 2009
Fri Oct 23 21:01:11 FOO 2009
Sat Oct 24 20:01:55 UTC 2009
尽管我可能会对此感到遗憾,这里是一个示例程序,您可以编译它来修改您的内核并完全伪造有关日期的所有或仅选定的程序。
答案4
我已经尝试过这个,并对其进行了一些修改,它对我来说是这样的:
- 第一的:
[Desktop Entry]
Name=Foo
Comment=Runs the Foo application
Exec=sh -c "sudo date --set '01 Jan 2008 12:00:00'; path/to/Foo#see the default launcher if it is already made#; sudo timedatectl set-ntp no;"
Icon=path/to/icon.png
Terminal=true
Type=Application
StartupNotify=true
- 第二步用此代码创建一个单独的启动器,将时间设置回默认网络
timezone:
timedatectl set-ntp yes
您可以运行该程序,在程序运行后,您可以运行第二个启动器以将时间重置为默认值,而您的程序已经在运行。我尝试使用 sleep 命令制作一个启动器,这样我就可以让第二部分在第一部分运行 10 秒后运行,但对我来说没有用。所有这些我在 Linux Mint 上运行过,运行良好。