web-dev-qa-db-fra.com

Comment puis-je m'assurer qu'une variable d'environnement est définie quand je suis sudo?

Comment puis-je m'assurer qu'une variable d'environnement (GRAILS_HOME par exemple) est définie quand I Sudo?

J'ai mis un script dans mon /etc/profile.d avec cette valeur et je l'ai fait ugo+x. Que dois-je faire pour que cela soit visible au super utilisateur?

2
C. Ross

Essayer avec

Sudo su -

Le - charge tous les fichiers d'environnement. De man su:

-, -l, --login
   Provide an environment similar to what the user would expect had
   the user logged in directly.

   When - is used, it must be specified as the last su option. The
   other forms (-l and --login) do not have this restriction.

Mise à jour: Dans le cas général, vous exécutez Sudo -i mycomment, comme le dit la page de manuel de Sudo,

-i [command]
           The -i (simulate initial login) option runs the Shell
           specified in the passwd(5) entry of the target user as a
           login Shell.  This means that login-specific resource files
           such as .profile or .login will be read by the Shell.  If a
           command is specified, it is passed to the Shell for
           execution.  Otherwise, an interactive Shell is executed.
           Sudo attempts to change to that user's home directory
           before running the Shell.  It also initializes the
           environment, leaving DISPLAY and TERM unchanged, setting
           HOME, Shell, USER, LOGNAME, and PATH, as well as the
           contents of /etc/environment on Linux and AIX systems.  All
           other environment variables are removed.
3
user4124

Selon cette réponse: Paramétrez PATH de manière à ce qu'il s'applique à tous les utilisateurs, y compris root/Sudo si vous notez que Sudo réinitialise toutes les variables et le chemin par défaut.

Bit pertinent:

La page de manuel pour sudoers indique:

env_reset       If set, Sudo will reset the environment to only contain
                   the LOGNAME, MAIL, Shell, USER, USERNAME and the Sudo_*
                   variables.  Any variables in the caller's environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when Sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

Vous pouvez donc procéder comme suit pour gérer les variables lors de l’utilisation de Sudo.

Sudo visudo

cela ouvrira les paramètres Sudo pour vous. Ensuite, par ce que je vous ai ajouté ce qui suit ci-dessous

Defaults secure_path="blah"

Defaults env_keep +="VARIABLE VARIABLE VARIABLE"

(EXCLUDING PATH tel qu'il est défini par secure_path) et il ne s'agit que d'espaces simples entre chaque variable si vous souhaitez en conserver plusieurs.

et ce que cela fait, c'est dire à Sudo quelles variables env doivent être conservées et ne pas être ignorées.

Lorsque vous avez terminé, maintenez les touches ctrl et o enfoncées et appuyez sur o pour écrire, appuyez sur Entrée, puis sur Oui pour enregistrer. Même si un fichier tmp est spécifié, il est OK, il sera réécrit dans la configuration principale.

Cela devrait vous permettre de conserver les variables souhaitées (la plus importante étant Java_HOME et http_proxy si vous utilisez un proxy).

Donc, il devrait ressembler à quelque chose comme ci-dessous, y compris votre variable spécifiée:

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin/bin"
Defaults        env_keep +="GRAILS_HOME"

et pour vérifier qu'il faut quitter toutes les fenêtres de terminal ouvertes et en rouvrir un et exécuter

echo $GRAILS_HOME 

Il devrait être ce que vous définissez, maintenant émettre

Sudo echo $GRAILS_HOME

et il devrait maintenant rester inchangé

1
Pariah