JAVA_HOME non défini dans le script lors de l'exécution à l'aide de sudo

19

J'essaie d'exécuter un script d'installation qui nécessite l'installation de Java et la JAVA_HOMEdéfinition de la variable d'environnement.

Je l' ai mis JAVA_HOMEdans /etc/profileet aussi dans un fichier que je l' ai appelé java.shdans /etc/profile.d. Je peux echo $JAVA_HOMEet obtenir la bonne réponse et je peux même sudo echo $JAVA_HOMEet obtenir la bonne réponse.

Dans le install.shJ'essaie de courir, j'ai inséré un echo $JAVA_HOME. Lorsque j'exécute ce script sans, sudoje vois le répertoire java; lorsque j'exécute le script, sudoil est vide.

Des idées pourquoi cela se produit?

J'utilise CentOS.

Josh
la source
J'ai également rencontré ce problème en exécutant Ubuntu 14.04, les deux réponses proposées ont fonctionné pour moi
laconbass

Réponses:

28

Pour des raisons de sécurité, sudopeut effacer les variables d'environnement, c'est pourquoi il ne récupère probablement pas $ JAVA_HOME. Cherchez dans votre /etc/sudoersdossier env_reset.

De man sudoers:

env_reset   If set, sudo will reset the environment to only contain the following variables: HOME, LOGNAME, PATH, SHELL, TERM, and USER (in addi-
           tion to the SUDO_* variables).  Of these, only TERM is copied unaltered from the old environment.  The other variables are set to
           default values (possibly modified by the value of the set_logname option).  If sudo was compiled with the SECURE_PATH option, its value
           will be used for the PATH environment variable.  Other variables may be preserved with the env_keep option.

env_keep    Environment variables to be preserved in the user's environment when the env_reset option is in effect.  This allows fine-grained con-
           trol over the environment sudo-spawned processes will receive.  The argument may be a double-quoted, space-separated list or a single
           value without double-quotes.  The list can be replaced, added to, deleted from, or disabled by using the =, +=, -=, and ! operators
           respectively.  This list has no default members.

Donc, si vous voulez qu'il conserve JAVA_HOME, ajoutez-le à env_keep:

Defaults   env_keep += "JAVA_HOME"

Sinon , définissez JAVA_HOMEdans root ~/.bash_profile.

dogbane
la source
2
Oui, c'était ça. Je n'avais aucune idée que l'on pouvait faire ça. Merci!
Josh
20

Exécutez sudo avec l'option -E (préserver l'environnement) (voir le fichier man) ou placez JAVA_HOME dans le script install.sh.

mazianni
la source
L'option -E n'est pas disponible dans CentOS.
Zubin