Linux runasdate аналог

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

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

5 ответов

Решение

Что 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 свежая ссылка), библиотека, которая может перехватывать системные вызовы в динамически связанных двоичных файлах. Доступно в репозиториях Debian для Squeeze и Sid.

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

Вы можете установить 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

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

Я попробовал это и немного повозился с этим, и вот как это работает для меня:

  1. Первый:
      [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
  1. Во-вторых, создайте отдельную программу запуска с этим кодом, чтобы вернуть время в сеть по умолчанию.
      timezone: 
timedatectl set-ntp yes

Вы можете запустить программу, а после ее запуска запустить вторую программу запуска, чтобы сбросить время до значений по умолчанию, пока ваша программа уже запущена. Я пытался создать один лаунчер с командой сна, чтобы вторая его часть запускалась через 10 секунд после первой, но у меня это не сработало. Все это я запускал на Linux Mint, и все работает нормально.

Другие вопросы по тегам