我想知道任何解决scheme的人提出了限制用户改变xscreensaver系统范围的configuration。 我的一部分工作是pipe理系统,要求桌面在大约10分钟内locking,只能用密码解锁。 我想使用一个屏幕保护程序,考虑到xscreensaver是非常安全的,有一个成熟的代码库是一个合理的select。
我在/ etc / X11 / app-defaults / XScreenSaver *中创build了适当的设置,但问题是用户仍然可以通过运行xscreensaver-demo或编辑〜/ .xscreensaver来更改他们的个人偏好。
我知道有一个hackish的方式做到这一点,从/ usr / bin / xscreensaver-demo中删除可执行权限,并将〜/ .xscreensaver的所有权更改为root。
如果这是做这件事的唯一可行的方法,那么我将如何在初始login用户时(在redhat和debian / ubuntu中)以root用户身份创build〜/ .xscreensaver?
如果您的用户的主目录位于本地磁盘上,或者托pipe在您拥有sudo / root权限的Linux NFS服务器上,则可以将每个〜/ .xscreensaver文件设置为“不可变”。
sudo chattr +i /home/username/.xscreensaver
这将防止用户修改它,并删除/移动/重命名它。
参考: http : //sattia.blogspot.com/2015/01/how-to-make-file-immutable-on-linux.html
看起来这是不可能的。 我最终修改了xscreensaver的来源,以强制某些设置。 我试图用最小的侵入性的方式来完成这个最小的修改源。 这仍然允许用户configuration屏幕保护程序的许多部分,而不是有关屏幕locking和超时。
在源代码树中find文件driver / prefs.c,并在那里寻找函数write_init_file 。 在那个函数中find这些行:
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文件中configuration的内容。
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");
find名为load_init_file的函数并更改该行:
else if (s && !strcasecmp (s, "off")) p->mode = DONT_BLANK;
至:
else if (s && !strcasecmp (s, "off")) p->mode = BLANK_ONLY;
现在find适当命名的函数stop_the_insanity ,它将首选项的某些值设置回合理的值,例如超时> 15秒将被强制为15秒。 这是确保在用户手工编辑.xscreensaver文件而不是使用xscreensaver-demo时,xscreensaver不会使用这些值,但我们的“理智”值将被用来代替。
在函数stop_the_insanity中添加这样的东西,如果你想使用你自己的值。 请注意,时间的值是秒* 1000。 在用户将模式设置为“closures”的情况下,我们已经强制回到上面的空白。
if (p->timeout > 600000) p->timeout = 600000; if (p->lock_timeout > 0) p->lock_timeout = 0; if (! p->lock_p) p->lock_p = True;
关于在初始login时使用root权限创build.xscreensaver,我认为这是不可能的或不可取的。 您可以在/etc/profile.d中创build一个脚本,在用户login时创build一个空的.xscreensaver。 但是上面提到的改变使得这个不必要。