J'ai installé et configuré Maven et Java. Je peux avec succès courir
mvn spring-boot:run
Mais quand je cours
Sudo mvn spring-boot:run
Je reçois Maven: Java_HOME is not defined correctly
Quand je fais
$ echo $Java_HOME
/home/ubuntu/jdk1.8.0_26
Est-ce que j'ai râté quelque chose?
Vous voudrez probablement éditer votre fichier sudoers
avec _Sudo visudo
_, trouver la ligne _Defaults env_reset
_ et ajouter une ligne _Defaults env_keep = "Java_HOME"
_ en dessous. Voir ci-dessous pour des explications, des détails et des alternatives.
Sudo
efface-t-il _Java_HOME
_Lorsque vous exécutez une commande avec Sudo
, votre environnement est par défaut not transmis intact. La plupart des variables d'environnement sont supprimées, pour des raisons de sécurité, ce qui est généralement souhaitable. Comme man sudoers
, dans la section "Environnement de commande":
Les variables d'environnement pouvant influer sur le comportement du programme,
sudoers
permet de limiter les variables de l'environnement de l'utilisateur héritées par la commande à exécuter.sudoers
peut traiter les variables d'environnement de deux manières différentes.Par défaut, l'option _
env_reset
_ est activée. Cela provoque l'exécution de commandes avec un nouvel environnement minimal. Sous AIX (et les systèmes Linux sans PAM), l'environnement est initialisé avec le contenu du fichier _/etc/environment
_. Le nouvel environnement contient les variables TERM, PATH, HOME, MAIL, Shell, LOGNAME, USER, USERNAME et Sudo_ *, en plus des variables du processus d'appel autorisé par les options _env_check
_ et _env_keep
_. C'est effectivement une liste blanche pour les variables d'environnement.Si, toutefois, l'option env_reset est désactivée, toutes les variables non explicitement refusées ....
Java_HOME
_ travers une foisUne option, si vous exécutez rarement _mvn spring-boot:run
_ en tant que root et préférez ne pas modifier la configuration du tout, consiste simplement à transmettre manuellement la valeur de _Java_HOME
_:
_Sudo Java_HOME="$Java_HOME" mvn spring-boot:run
_
Quand vous courez ça:
"$Java_HOME"
_ par la valeur (c'est-à-dire le contenu) de _Java_HOME
_. Si cela ne contient aucun espace, les guillemets ne sont pas nécessaires (leur but ici est d'empêcher fractionnement de mots ).Sudo
est appelé avec trois arguments: _Java_HOME=...
_, où _...
_ est la valeur de _Java_HOME
_ lorsque vous avez exécuté la commande; mvn
et _spring-boot:run
_.Sudo
reconnaît la syntaxe _variable=value
_ et sait exécuter mvn
avec _Java_HOME
_ défini sur la valeur spécifiée. (_spring-boot:run
_ est passé en tant que premier argument de ligne de commande à mvn
).Pour passer all vos variables d'environnement, vous pouvez exécuter _Sudo -E mvn spring-boot:run
_, mais ceci est potentiellement moins sécurisé et pas idéal car _Java_HOME
_ est la seule variable dont vous avez besoin de conserver la valeur (à part la poignée de variables dont les valeurs sont automatiquement conservées même avec _env_reset
_).
Java_HOME
_ à chaque foisBien que vous puissiez désactiver _env_reset
_ dans votre fichier sudoers
, cela transmet presque toutes les variables d'environnement d'un utilisateur à chaque exécution de Sudo
et, pour cette raison, n'est pas recommandé.
Au lieu de cela, je vous recommande de modifier votre fichier sudoers
et d'ajouter une ligne _env_keep
_ appropriée après la ligne _env_reset
_.
/etc/sudoers
_ directement. Au lieu de cela, vous devez toujours utiliser la commande visudo
, qui vérifie que votre syntaxe est correcte (empêchant la création d'un fichier sudoers
non valide qui verrouille Sudo
jusqu'à ce qu'il soit corrigé ) .Courir:
_Sudo visudo
_
Cela utilisera votre éditeur de texte par défaut en ligne de commande. Si vous souhaitez utiliser un autre éditeur, vous pouvez exécuter visudo
avec celui-ci affecté à la variable d'environnement VISUAL
. Par exemple:
Sudo VISUAL=nano visudo
_Sudo VISUAL=gedit visudo
_(VISUAL
ne porte pas le même nom que le "vis" dans visudo
; il s'agit plutôt de la variable d'environnement permettant de spécifier les éditeurs de texte par défaut. Vous pouvez également utiliser la variable EDITOR
, mais VISUAL
est prioritaire s'il est défini.)
Exécuter visudo
ouvre une copie temporaire de votre fichier sudoers
dans un éditeur de texte; à la sortie, les modifications apportées à cette copie sont écrites dans _/etc/sudoers
_.
Trouvez la ligne qui dit:
_Defaults env_reset
_
Ajoutez une ligne juste en dessous, en disant:
_Defaults env_keep = "Java_HOME"
_
(If vous avez déjà une ligne _env_keep
_, ajoutez _Java_HOME
_ à la liste citée des variables autorisées. Les noms de variables sont séparés les uns des autres par des espaces.)
Enregistrez le fichier et quittez l'éditeur de texte. Désormais, lorsque les utilisateurs exécutent des commandes avec Sudo
, la variable d’environnement _Java_HOME
_ sera préservée.