Я хотел бы знать, какие решения придумали люди, запрещающие пользователю изменять общесистемную конфигурацию xscreensaver. Часть моей работы - управление системами, в которых требуется, чтобы рабочий стол блокировался примерно через 10 минут и мог быть разблокирован только с помощью пароля. Я хочу использовать одну заставку, и, учитывая, что xscreensaver очень безопасен со зрелой базой кода, это логичный выбор.
Я создал соответствующие настройки в / etc / X11 / app-defaults / XScreenSaver *, однако проблема в том, что пользователь по-прежнему может изменить свои личные предпочтения, запустив xscreensaver-demo или отредактировав ~ / .xscreensaver.
Я понимаю, что есть несколько хакерских способов сделать это, удалив разрешения на исполняемые файлы из / usr / bin / xscreensaver-demo и изменив право собственности на ~ / .xscreensaver на root.
Если это единственный практический способ сделать это, как мне создать ~ / .xscreensaver с правами суперпользователя при первом входе в систему (в redhat и debian / ubuntu)?
Если домашние каталоги ваших пользователей находятся на локальном диске или они размещены на сервере Linux NFS, на котором у вас есть права sudo / root, вы можете установить каждый файл ~ / .xscreensaver как «неизменяемый».
sudo chattr +i /home/username/.xscreensaver
Это не позволит пользователям изменять его, а также удалять / перемещать / переименовывать.
Ссылка: http://sattia.blogspot.com/2015/01/how-to-make-file-immutable-on-linux.html
Похоже, это на самом деле невозможно. В конечном итоге я немного изменил источник xscreensaver, чтобы принудительно установить определенные настройки. Я попытался использовать наименее инвазивный способ добиться этого с минимальной модификацией источника. Это по-прежнему позволит пользователю настроить многие части заставки, но не те, которые касаются блокировки экрана и тайм-аута.
В дереве исходников найдите файл драйвер / prefs.c и там найдите функцию write_init_file. В этой функции найдите эти строки:
if (!pr || !*pr) ;
CHECK("timeout") type = pref_time, t = p->timeout;
CHECK("cycle") type = pref_time, t = p->cycle;
CHECK("lock") type = pref_bool, b = p->lock_p;
CHECK("lockTimeout") type = pref_time, t = p->lock_timeout;
(..)
CHECK("mode") type = pref_str,
s = (p->mode == ONE_HACK ? "one" :
p->mode == BLANK_ONLY ? "blank" :
p->mode == DONT_BLANK ? "off" :
p->mode == RANDOM_HACKS_SAME
? "random-same"
: "random");
И измените на что-то вроде исходного образца ниже. Это предотвратит сохранение этих настроек в файле .xscreensaver в домашнем каталоге пользователя. И затем, пока для системы по умолчанию установлено все, что вы предпочитаете, xscreensaver будет продолжать использовать эти настройки вместо того, что было бы настроено в файле .xscreensaver.
if (!pr || !*pr) ;
CHECK("timeout") continue; /* don't save */
CHECK("cycle") continue; /* don't save */
CHECK("lock") continue; /* don't save */
CHECK("lockTimeout") continue; /* don't save */
(..)
CHECK("mode") type = pref_str,
s = (p->mode == ONE_HACK ? "one" :
p->mode == BLANK_ONLY ? "blank" :
p->mode == DONT_BLANK ? "blank" : /* prevents xscreensaver from being disabled, will force to blank */
p->mode == RANDOM_HACKS_SAME
? "random-same"
: "random");
Найдите функцию с именем load_init_file и измените строку:
else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK;
кому:
else if (s && !strcasecmp (s, "off")) p->mode = BLANK_ONLY;
Теперь найдите функцию с подходящим названием stop_the_insanity который устанавливает некоторые значения предпочтений обратно в разумные значения, например, тайм-аут> 15 секунд будет принудительно равен 15 секундам. Это хорошее место, чтобы убедиться, что когда пользователь вручную редактирует файл .xscreensaver вместо использования xscreensaver-demo, значения не будут использоваться xscreensaver, но вместо этого будут использоваться наши «нормальные» значения.
В функции stop_the_insanity добавьте что-то подобное, используя свои собственные значения, если хотите. Обратите внимание, что время составляет секунды * 1000. В случае, если пользователь устанавливает режим на «выключено», мы уже заставляем его вернуться к пустому выше.
if (p->timeout > 600000) p->timeout = 600000;
if (p->lock_timeout > 0) p->lock_timeout = 0;
if (! p->lock_p) p->lock_p = True;
Что касается создания .xscreensaver с правами суперпользователя при первоначальном входе в систему, я думаю, что это на самом деле невозможно или не рекомендуется. Вы можете создать сценарий в /etc/profile.d, который создаст пустую .xscreensaver при входе пользователя в систему. Но вышеупомянутое изменение делает это ненужным.