Obtenir la variable d'environnement d'un autre utilisateur [fermé]

23

Existe-t-il un moyen de voir la variable d'environnement d'un autre utilisateur? Je veux le faire en tant que root, donc les autorisations ne seront pas un problème, je suppose.

Pour l'utilisateur lui-même, j'utilise echo $PATHou set | grep PATH(ou setlorsque je ne me souviens pas du nom de la variable). Quelle serait une instruction similaire pour un autre utilisateur?

Pour ce que ça vaut, je suis sur Ubuntu Server 13.04.


la source
4
Les utilisateurs n'ont pas de variables d'environnement, les processus en ont. Il est courant que les processus exécutés par un utilisateur n'aient pas tous le même environnement. Quel problème essayez-vous de résoudre?
Gilles 'SO- arrête d'être méchant'
@Gilles par exemple, je veux savoir de quel dossier MAIL dispose un utilisateur. Je pourrais alors me connecter en tant qu'utilisateur, echo $MAILmais je pensais qu'il pourrait y avoir un raccourci.
3
Cela ne définit toujours pas la question de manière utile (et par exemple, la réponse que vous avez acceptée peut ou non fonctionner en fonction de nombreux facteurs). Recherchez-vous l'emplacement par défaut de la boîte aux lettres? Cherchez-vous l'emplacement où l'utilisateur reçoit réellement son courrier local (qui peut être différent et peut ne pas exister si l'utilisateur en a un .forward)? Les utilisateurs définissent souvent quelques variables dans leurs .profilefichiers de configuration ou dans d'autres, et il n'y a aucun moyen de les énumérer de manière fiable. Encore une fois, quel problème essayez-vous de résoudre?
Gilles 'SO- arrête d'être méchant'

Réponses:

20

Une autre option consiste à utiliser env. Exécutez ceci comme root:

sudo -Hiu $user env | grep $var

Par exemple

sudo -Hiu terdon env | grep HOME
HOME=/home/terdon
terdon
la source
1
Lorsque je me connecte en tant que root et exécute cette commande pour mon nom d'utilisateur standard, j'obtiens HOME=/root. C'est le répertoire personnel de root, mais ce n'est pas mon répertoire personnel standard. Si vous voulez connaître l'environnement qu'un utilisateur particulier obtiendrait lorsqu'il se connecte, vous devez exécuter les scripts de démarrage du shell de connexion de cet utilisateur particulier (et n'oubliez pas que son shell de connexion peut être différent de votre shell de connexion).
Uwe
@Uwe sur quel système? Ça fonctionne bien pour moi. Voulez-vous dire que vous vous connectez à rootpartir du gestionnaire de connexion? Cela fonctionne bien si je tombe sur un tty et me connecte en tant que root.
terdon
Je suis sur une machine Debian. Je me connecte en tant que uwe, j'ouvre un xterm, je cours et je env | grep HOMEreçois HOME=/home/uwe; J'exécute su, puis une fois de plus env | grep HOMEet j'obtiens HOME=/root, puis je cours sudo -u uwe env | grep HOMEet j'obtiens toujours HOME=/root.
Uwe
@uwe étrange. Je suis également sur une machine Debian (LMDE), j'ai fait exactement le même processus que vous avez décrit (même utilisé à la xtermplace de mon terminal habituel) et j'ai obtenu le résultat attendu.
terdon
Selon le manuel, sudodéfinit la variable HOME uniquement si l' -Hoption est présente ou si l'entrée correspondante dans /etc/sudoersest définie. Il semble que nos fichiers sudoers diffèrent. Quoi qu'il en soit, c'est probablement une bonne idée à utiliser -Hici, et peut-être aussi -i.
Uwe
2

Pour un utilisateur, vous pouvez faire ceci:

su - <username> -c '. ~/.profile; echo $PATH'

Liste $ PATH de tous les utilisateurs:

for user in $(cat /etc/passwd | awk -F: '{print $1}'); do
  su - $user -c '. ~/.profile; printf "%s\n" "$PATH"'
done

@Camil Staps

. ~/.profileest donc une astuce que j'apprends de ma personne préférée, Peteris Krumins. Il a expliqué l'astuce ici . Peut-être que la version bash plus tard avait un bâtiment avec option NON_INTERACTIVE_LOGIN_SHELLS.

cuonglm
la source
Merci! Car $PATHcela fonctionne aussi sans la . ~/.profile; pièce - à quoi ça sert?
@CamilStaps Qu'entendez-vous par "ça marche"? Oui, vous obtenez une valeur $PATHmême sans sourcing ~/.profile, mais ce n'est certainement pas celle que vous souhaitez (= la valeur que cet utilisateur verrait lorsqu'il se connecterait). Même le sourcing ~/.profilen'est pas entièrement fiable, car l'utilisateur peut utiliser un shell dont le fichier de démarrage est différent de ~/.profile.
Uwe
@Uwe, j'ai obtenu la même sortie sans, mais je suppose que ce n'est qu'une coïncidence alors.
Vous supposez que l'utilisateur n'utilise pas csh.
glenn jackman
@CamilStaps La première question est de savoir si cet utilisateur particulier modifie son PATH dans le sien ~/.profile. Mais dans tous les cas, le comportement de sudopeut être configuré en grande partie dans /etc/sudoers(voir ma discussion avec terdon), donc lorsque nos systèmes se comportent différemment, cela est probablement dû à des différences dans les fichiers de configuration.
Uwe
0

de la racine, vous pouvez su -à l'utilisateur, puis grep la variable d'environnement que vous souhaitez voir:

su - <username> -c 'echo $PATH'

Raza
la source
pour une raison quelconque, cela ne fonctionne pas pour moi, même si la commande est exécutée en tant qu'utilisateur différent. J'ai fini par utiliser "env", donc ça runuser -l <username> -c "env | grep <var>" | cut -d '=' -f 2marche bien pour moi. Si vous n'êtes pas root, vous devez préfixer la commande avec sudo.
Andrei-Niculae Petre