web-dev-qa-db-fra.com

Comment faire en sorte que Sudo préserve mes variables d'environnement?

Utilisation de Sudo 1.7.4p4 sous Solaris 5.10 et de Sudo 1.6.7p5 sous RHEL4 u6 Je ne vois pas comment préserver mes variables d'environnement, par exemple $ PYTHONPATH. J'ai ajouté cette ligne à sudoers, mais cela ne fait aucune différence:

Defaults !env_reset

Est-ce que je fais quelque chose de mal ou est-ce que l'installation de Sudo ne respecte tout simplement pas le drapeau env_reset?

Edit: au moins sous Solaris, nous avons constaté que ce problème dépendait du shell! Le shell racine standard est Bourne. Par contre, si nous exécutons bash sous Sudo (Sudo bash),! Env_preset préservera l'environnement (notamment PATH et LD_LIBRARY_PATH). C'est un comportement plutôt déroutant, je dois le dire.

47
aknuds1

À utiliser avec précaution, il existe des problèmes de sécurité avec Sudo et les variables.

De man sudoers j'ai trouvé que vous devriez utiliser

 Valeurs par défaut env_reset 
 Valeurs par défaut env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER" 

Dans Ubuntu, Sudo préserve certaines variables. Sudo -i s'apparente davantage à la connexion en tant que root, puis à l'exécution de la commande. Les deux peuvent être gênants, le premier pour Sudo nano myfile laisse des fichiers appartenant à la racine à l'intérieur de votre maison et le dernier pour Sudo -i nano myfile essaiera d'ouvrir/root/monfichier.


Courir

Sudo printenv PATH

et voir ce que ça donne. Ici ça donne

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

par exemple. Maintenant, lancez Sudo visudo et ajoutez la ligne

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

en remplaçant par ce que vous avez trouvé juste avant. Ajoutez-y un nouveau chemin si vous en avez besoin.

A propos des bibliothèques:

Sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Les distributions Linux prennent beaucoup de soin avec PATH, et vous devriez vraiment faire attention avant de jouer avec. Faites particulièrement attention en ajoutant des chemins tels que "." ou /home/username, cela n’est pas sécurisé.

L'un des dangers de l'ajout de chemins d'accès est que cela ouvre la possibilité que des fichiers sur ces chemins soient exécutés par root, ouvrant une fenêtre dans la sécurité du système susceptible d'être exploitée par des logiciels malveillants. Il peut y avoir d'autres dangers. Assurez-vous simplement de savoir ce que vous faites. Ignorer les mesures de sécurité Sudo peut rendre votre Solaris aussi sûr que Windows XP.

44
user39559

Il est prudent de jouer avec sudoers, comme d’autres l’ont dit.

Une approche plus simple pour les cas plus simples lorsque vous souhaitez préserver des variables d'environnement particulières consiste à simplement transmettre la variable d'environnement de votre choix directement via Sudo (le code [VAR=value] apparaît dans l'aide de la ligne de commande Sudo).

Voir ce petit exemple où je l'ai également démontré pour plus d'une variable.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ Sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Pour l'exemple PYTHONPATH d'origine dans la question, utilisez simplement les éléments suivants:

$ Sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Créer un alias pour ce genre de chose est pratique. Ainsi:

$ alias sudopy='Sudo PYTHONPATH=$PYTHONPATH'
8
Russ

Votre Defaults !env_reset a l'air OK, en supposant que vous n'appeliez pas également Sudo avec l'option -E.

Vous pouvez essayer de supprimer complètement cette entrée.

Avez-vous vérifié que vous éditez le bon fichier sudoers? Je suppose que ce pourrait être /etc/sudoers ou /usr/local/etc/sudoers en fonction de la façon dont il a été installé. L'avez-vous édité avec visudo?

Comment ça va sudo? Sudo python, Sudo su, Sudo su -, Sudo -s, autre chose? Seuls Sudo python et Sudo su préservent votre environnement.

Que dit env | grep PYTHONPATH? S'il n'y a rien, assurez-vous que PYTHONPATH est exporté en exécutant export PYTHONPATH et essayez à nouveau.

Que dit Sudo env | grep PYTHONPATH? S'il imprime la valeur attendue, quelque chose d'autre remplace votre valeur PYTHONPATH. Peut-être que root .bashrc ou .bash_profile ou les fichiers de configuration du système.

3
Mikel