web-dev-qa-db-fra.com

Existe-t-il un moyen de modifier les variables d'environnement d'un autre processus sous Unix?

Sous Unix, existe-t-il un moyen pour un processus de changer les variables d'environnement d'un autre (en supposant qu'elles soient toutes exécutées par le même utilisateur)? Une solution générale serait la meilleure, mais sinon, qu'en est-il du cas spécifique où l'un est enfant de l'autre?

Edit: que diriez-vous via gdb?

90
raldi

Via gdb:

(gdb) attach process_id

(gdb) call putenv ("env_var_name=env_var_value")

(gdb) detach

C'est un hack assez méchant et ne doit être fait que dans le contexte d'un scénario de débogage, bien sûr.

126
An̲̳̳drew

Vous pouvez probablement le faire techniquement (voir les autres réponses), mais cela pourrait ne pas vous aider.

La plupart des programmes s'attendent à ce que les vars env ne puissent pas être modifiés de l'extérieur après le démarrage, par conséquent, la plupart liront probablement les vars qui les intéressent au démarrage et initialiseront en fonction de cela. Les modifier par la suite ne fera donc aucune différence, car le programme ne les relira jamais.

Si vous avez signalé cela comme un problème concret, vous devriez probablement adopter une approche différente. Si c'était juste par curiosité: Belle question :-).

22
sleske

En gros, non. Si vous disposiez de privilèges suffisants (root ou à peu près) et que vous avez fouillé/dev/kmem (mémoire du noyau) et que vous avez apporté des modifications à l'environnement du processus, et si le processus a effectivement re-référencé la variable d'environnement par la suite (c'est-à-dire le processus n'avait pas déjà pris une copie de la var env et n'utilisait pas seulement cette copie), alors peut-être, si vous étiez chanceux et intelligent, et le vent soufflait dans la bonne direction, et la phase de la lune était correcte, peut-être, vous pourriez réaliser quelque chose.

13
Jonathan Leffler

Citant Jerry Peek:

Vous ne pouvez pas apprendre de nouveaux tours à un vieux chien.

La seule chose que vous pouvez faire est de changer la variable d'environnement du processus enfant avant de le démarrer: il obtient la copie de l'environnement parent, désolé.

Voir http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm pour plus de détails.

Juste un commentaire sur la réponse concernant l'utilisation de/proc. Sous linux/proc est pris en charge mais, cela ne fonctionne pas, vous ne pouvez pas changer le /proc/${pid}/environ fichier, même si vous êtes root: il est absolument en lecture seule.

7
Davide

Je pourrais penser à la façon plutôt artificielle de le faire, et cela ne fonctionnera pas pour des processus arbitraires.

Supposons que vous écriviez votre propre bibliothèque partagée qui implémente 'char * getenv'. Ensuite, vous configurez "LD_PRELOAD" ou "LD_LIBRARY_PATH" env. vars afin que vos deux processus soient exécutés avec votre bibliothèque partagée préchargée.

De cette façon, vous aurez essentiellement un contrôle sur le code de la fonction "getenv". Ensuite, vous pourriez faire toutes sortes de trucs désagréables. Votre "getenv" pourrait consulter un fichier de configuration externe ou un segment SHM pour des valeurs alternatives de vars env. Ou vous pouvez faire une recherche/remplacement regexp sur les valeurs demandées. Ou ...

Je ne peux pas penser à un moyen facile de le faire pour des processus d'exécution arbitraires (même si vous êtes root), à moins de réécrire l'éditeur de liens dynamiques (ld-linux.so).

7
ADEpt

Ou demandez à votre processus de mettre à jour un fichier de configuration pour le nouveau processus, puis:

  • effectuer un kill -HUP sur le nouveau processus pour relire le fichier de configuration mis à jour, ou
  • demandez au processus de vérifier le fichier de configuration pour les mises à jour de temps en temps. Si des modifications sont trouvées, relisez le fichier de configuration.
3
Rob Wells

Pas autant que je sache. Vraiment, vous essayez de communiquer d'un processus à un autre, ce qui nécessite l'une des méthodes IPC (mémoire partagée, sémaphores, sockets, etc.). Après avoir reçu des données par l'une de ces méthodes, vous pourrait alors définir des variables d'environnement ou effectuer d'autres actions plus directement.

2
Stephen Darlington

Si votre unix prend en charge le système de fichiers/proc, alors il est trivial de LIRE l'env - vous pouvez lire l'environnement, la ligne de commande et de nombreux autres attributs de tout processus que vous possédez de cette façon. Le changer ... Eh bien, je peux penser à un moyen, mais c'est une mauvaise idée.

Le cas le plus général ... Je ne sais pas, mais je doute qu'il y ait une réponse portable.

(Modifié: ma réponse originale supposait que l'OP voulait LIRE l'env, pas le changer)

1
Mike G.

UNIX est plein de communication inter-processus. Vérifiez si votre instance cible en a. Dbus devient une norme dans l'IPC "de bureau".

Je change les variables d'environnement à l'intérieur du gestionnaire de fenêtres Awesome en utilisant awesome-client avec un "expéditeur" Dbus de code lua.

1
dvd

Pas une réponse directe mais ... Raymond Chen avait une justification [basée sur Windows] autour de cela seulement l'autre jour : -

... Bien qu'il existe certainement des façons non prises en charge de le faire ou des méthodes qui fonctionnent avec l'aide d'un débogueur, il n'y a rien qui est pris en charge pour l'accès programmatique à la ligne de commande d'un autre processus, du moins rien fourni par le noyau. ...

Qu'il n'y a pas de conséquence du principe de ne pas garder la trace des informations dont vous n'avez pas besoin. Le noyau n'a pas besoin d'obtenir la ligne de commande d'un autre processus. Il prend la ligne de commande passée à la fonction CreateProcess et la copie dans l'espace d'adressage du processus en cours de lancement, à un emplacement où la fonction GetCommandLine peut la récupérer. Une fois que le processus peut accéder à sa propre ligne de commande, les responsabilités du noyau sont terminées.

Étant donné que la ligne de commande est copiée dans l'espace d'adressage du processus, le processus peut même écrire dans la mémoire qui contient la ligne de commande et la modifier. Si cela se produit, la ligne de commande d'origine est définitivement perdue; la seule copie connue a été écrasée.

En d'autres termes, de telles installations de noyau seraient

  • difficile à mettre en œuvre
  • potentiellement un problème de sécurité

Cependant, la raison la plus probable est simplement qu'il existe des cas d'utilisation limités pour une telle installation.

1
Ruben Bartelink