2015-03-02 33 views
3

我需要檢索所有用戶的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我嘗試:如何使用sudo獲取XDG變量?

sudo -Eiu user printenv | grep XDG_CONFIG_HOME 

但我什麼也沒得到。

如果我登錄與用戶帳戶,簡單的命令:

printenv | grep XDG_CONFIG_HOME 

工作正常。

我該怎麼辦?

回答

3

TLDR,這些變量在sudo的情況下不可用,有些甚至在標準登錄情況下甚至可能不會被設置爲的所有

在我的linux系統上(debian 8),一些XDG變量是在用pam模塊pam_systemd初始化用戶會話時定義的。定義爲在該點初始化的變量記錄在手冊頁中,但包括XDG_RUNTIME_DIR

該模塊僅在登錄情況下加載 - 即我需要ssh登錄到系統,或者通過控制檯/ gui登錄,以便通過pam_systemd模塊初始化用戶會話。

該模塊未加載到susudo的情況。

因此,當您執行sudo來模擬用戶時,此變量未設置。

其他XDG變量只有在用戶實際登錄GUI時才適用。我沒有在我使用的GUI上獲取這些變量集,但the docs for XDG variables指定了它們應該默認設置的內容,如果它們沒有設置。 XDG_CONFIG_HOME的默認值是$HOME/.config,而XDG_DATA_HOME的默認值是$HOME/.local/share

因此,您應該只希望在交互式登錄的情況下設置這些變量,而不是通過非交互式的情況 - sudo將被有效地指定爲非交互式的情況,即使您可以使用它進行交互式操作。

這些值非常模板化 - 例如,我的系統上的XDG_RUNTIME_DIR/var/run/UID,而且根據手冊頁,在我上次登出後不能存活;所以它不是放置永久文件的地方。

除非您作爲用戶更改這些值,否則我會預期在XDG文檔中指定的默認值爲the KDE compliance頁面。可能還有其他的,但我只是選擇了KDE合規性的一個,因爲它在系統管理員指南中提到了它。

+0

這不是太長,這很好,因爲我現在明白了爲什麼我沒有通過連接ssh,sudo或交互式方法得到相同的結果。謝謝 – Mauricio 2015-03-02 14:16:33

0

有幾個部分可以隔離Linux機器上的所有普通用戶(非系統帳戶)。出於您的目的,最簡單的方法可能是將所有用戶讀入數組,然後查看每個用戶的XDG配置。用於此目的的快速bash腳本是:

#!/bin/bash 

uarray=($(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if ($3 >= limit) print $1}' /etc/passwd))
 

for i in "${uarray[@]}"; do 
    printf "\nXDG Config for user: %s\n\n" "$i" 
    sudo -Eiu $i printenv | grep XDG 
done 

,將打印所有XDG環境變量對每個用戶有一個簡短的標題,以確定是誰的。如果您希望這一切在同一行:

for i in $(awk -F':' -v "limit=$(grep "^UID_MIN" /etc/login.defs | sed -e 's/UID_MIN\s*//')" '{ if ($3 >= limit) print $1}' /etc/passwd); do printf "\nXDG Config for user: %s\n\n" "$i"; sudo -Eiu $i printenv | grep XDG; done 

可以限制或改變其XDG環境變量被縮小論據grep選擇。

+0

他遇到的問題是**沒有**的XDG變量設置在sudo的情況下。 – Petesh 2015-03-02 12:46:18

+0

無論是他或他正在使用'user'而不是每個單獨的用戶名。另一種可能性是XDG配置在桌面啓動時加載,然後如您所說,對於某些未登錄的用戶不可用。 – 2015-03-02 12:49:13

+0

在一行中檢索用戶列表是完美的。採納。謝謝。 – Mauricio 2015-03-02 14:20:48