我需要檢索所有用戶的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我嘗試:如何使用sudo獲取XDG變量?
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我什麼也沒得到。
如果我登錄與用戶帳戶,簡單的命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我該怎麼辦?
我需要檢索所有用戶的$ XDG_CONFIG_HOME,$ XDG_RUNTIME_DIR和$ XDG_DATA_HOME。 我嘗試:如何使用sudo獲取XDG變量?
sudo -Eiu user printenv | grep XDG_CONFIG_HOME
但我什麼也沒得到。
如果我登錄與用戶帳戶,簡單的命令:
printenv | grep XDG_CONFIG_HOME
工作正常。
我該怎麼辦?
TLDR,這些變量在sudo
的情況下不可用,有些甚至在標準登錄情況下甚至可能不會被設置爲的所有。
在我的linux系統上(debian 8),一些XDG
變量是在用pam模塊pam_systemd
初始化用戶會話時定義的。定義爲在該點初始化的變量記錄在手冊頁中,但包括XDG_RUNTIME_DIR
。
該模塊僅在登錄情況下加載 - 即我需要ssh登錄到系統,或者通過控制檯/ gui登錄,以便通過pam_systemd
模塊初始化用戶會話。
該模塊未加載到su
或sudo
的情況。
因此,當您執行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合規性的一個,因爲它在系統管理員指南中提到了它。
有幾個部分可以隔離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
選擇。
這不是太長,這很好,因爲我現在明白了爲什麼我沒有通過連接ssh,sudo或交互式方法得到相同的結果。謝謝 – Mauricio 2015-03-02 14:16:33