限制使用者更改 xscreensaver 設置
我想知道人們提出的任何解決方案,以限制使用者更改 xscreensaver 的系統範圍配置。我的部分工作是管理要求桌面在大約 10 分鐘內鎖定並且只能使用密碼解鎖的系統。我想使用一個螢幕保護程序,並且考慮到 xscreensaver 具有成熟的程式碼庫非常安全,這是一個合乎邏輯的選擇。
我在 /etc/X11/app-defaults/XScreenSaver* 中創建了適當的設置,但問題是使用者仍然可以通過執行 xscreensaver-demo 或編輯 ~/.xscreensaver 來更改他們的個人偏好。
我知道有一種黑客方法可以做到這一點,從 /usr/bin/xscreensaver-demo 中刪除可執行權限並將 ~/.xscreensaver 的所有權更改為 root。
如果這是唯一可行的方法,我將如何在使用者初始登錄時(在 redhat 和 debian/ubuntu 中)創建具有 root 所有權的 ~/.xscreensaver?
看起來這是不可能的。我確實最終稍微修改了 xscreensaver 的源以強制某些設置。我嘗試使用侵入性最小的方式來實現這一點,而對原始碼的修改最少。這仍然允許使用者配置螢幕保護程序的許多部分,而不是關於螢幕鎖定和超時的部分。
在原始碼樹中找到文件driver/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;
關於在初始登錄時創建具有 root 所有權的 .xscreensaver,我認為這實際上是不可能或不可取的。您可以在 /etc/profile.d 中創建一個腳本,該腳本將在使用者登錄時創建一個空的 .xscreensaver。但是上面提到的改變使得這沒有必要。
如果您的使用者的主目錄位於本地磁碟上,或者它們託管在您擁有 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