7

Я хочу, чтобы у какого-то пользователя (или какого-то процесса) было другое время и дата. Является ли это возможным?

Как я могу это сделать?

4 ответа4

12

Что RunAsDate делает следующее:

RunAsDate перехватывает вызовы API ядра, которые возвращают текущую дату и время (GetSystemTime, GetLocalTime, GetSystemTimeAsFileTime), и заменяет текущую дату / время указанной вами датой / временем.

Под Linux у вас есть несколько вариантов, чтобы выполнить то же самое:

  1. Если вы можете получить версию программы для Windows, вы можете запустить RunAsDate под Wine (но следите за недавней ошибкой).

  2. Найдите для этого библиотеку-обертку или напишите свою. Некоторые варианты приведены ниже.

  3. Используйте виртуальную машину. Это излишне, но, поскольку ОС в гостевой виртуальной машине полностью отделена от базового хоста, вы можете установить системное время на что-то совершенно другое. Это может быть быстрее настроить, чем другие параметры.


Вариант 2 может быть реализован разными способами, в зависимости от того, что вы пытаетесь запустить. Ответ DaveParillo ниже ссылается на самодельный подход, который объясняет различные методы и включает в себя код для исполняемого файла. Некоторые другие варианты включают в себя:

  • datefudge, доступный в репозиториях Debian/Ubuntu и других местах.

  • Perl-модуль Time-Fake, также в репозиториях Debian как пакет libtime-fake-perl.

  • Библиотека предварительной загрузки FakeTime (также известная как libfaketime , ссылка на freshmeat), библиотека, которая может перехватывать системные вызовы в динамически связанных двоичных файлах. Доступно в репозиториях Debian для Squeeze и Sid.

2

У меня была такая же проблема в поиске альтернативы RunAsDate в Linux Ubuntu, и я пришел к этому решению.

Я создал программу запуска программы, которую я хочу использовать с 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 изменяет системную дату для сеанса, пока вы используете приложение, а затем, когда вы закончите, автоматически синхронизирует системную дату.

1

Вы можете установить TZ практически на любое желаемое значение. Системное время не изменяется, но видимое время изменится. Это не то же самое, что перехват ядра, но не требует кодирования. Используйте (трехбуквенный идентификатор) (смещение от 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

Хотя я могу сожалеть об этом, вот пример программы, которую вы могли бы скомпилировать для модификации вашего ядра и полностью подделать все или только выбранные программы относительно даты.

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