Sous Unix, existe-t-il un moyen pour un processus de modifier les variables d'environnement d'un autre (en supposant qu'elles sont 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?
Réponses:
Via gdb:
C'est un hack assez méchant et ne devrait être fait que dans le contexte d'un scénario de débogage, bien sûr.
la source
ptrace: Operation not permitted
Vous pouvez probablement le faire techniquement (voir les autres réponses), mais cela pourrait ne pas vous aider.
La plupart des programmes s'attendront à ce que les variables d'environnement ne puissent pas être modifiées de l'extérieur après le démarrage, par conséquent, la plupart ne liront probablement que les variables qui les intéressent au démarrage et initialiseront en fonction de cela. Donc, les changer par la suite ne fera aucune différence, puisque le programme ne les relira jamais.
Si vous posez cela comme un problème concret, vous devriez probablement adopter une approche différente. Si c'était juste par curiosité: Belle question :-).
la source
En gros, non. Si vous aviez des privilèges suffisants (root ou à peu près) et que vous aviez 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 du var env et n'utilisait pas seulement cette copie), alors peut-être, si vous étiez chanceux et intelligent, et que le vent soufflait dans la bonne direction, et que la phase de la lune était correcte, peut-être, vous pourriez réaliser quelque chose.
la source
gdb
sur le processus parent et est scripté pour faire le changement, et cela fonctionne sans planter le processus parent. OK - vous pouvez probablement le faire, mais ce n'est pas quelque chose que vous allez faire de façon routinière. Pour des raisons pratiques, la réponse reste donc non . Le reste de la réponse couvre les alternatives off-the-wall théoriquement possibles, quelque peu impraticables.Citant Jerry Peek:
La seule chose que vous pouvez faire est de modifier la variable d'environnement du processus enfant avant 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 à propos de l'utilisation de / proc. Sous linux / proc est pris en charge mais, cela ne fonctionne pas, vous ne pouvez pas modifier le
/proc/${pid}/environ
fichier, même si vous êtes root: c'est absolument en lecture seule.la source
Je pourrais penser à la manière 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 l'environnement 'LD_PRELOAD' ou 'LD_LIBRARY_PATH'. 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 vilains tours. Votre 'getenv' pourrait consulter le fichier de configuration externe ou le segment SHM pour des valeurs alternatives de vars env. Ou vous pouvez effectuer une recherche / remplacement de regexp sur les valeurs demandées. Ou ...
Je ne peux pas penser à un moyen facile de le faire pour les processus en cours d'exécution arbitraires (même si vous êtes root), à moins de réécrire l'éditeur de liens dynamique (ld-linux.so).
la source
Ou demandez à votre processus de mettre à jour un fichier de configuration pour le nouveau processus, puis soit:
la source
Pas pour autant que je sache. En réalité, vous essayez de communiquer d'un processus à un autre qui fait appel à 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 pouvez ensuite définir des variables d'environnement ou effectuer d'autres actions plus directement.
la source
Si votre unix prend en charge le système de fichiers / proc, alors il est trivial de LIRE l'environnement - 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 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'environnement, pas le changer)
la source
UNIX regorge de communications inter-processus. Vérifiez si votre instance cible en possède. Dbus est en train de devenir un standard de l'IPC «de bureau».
Je change les variables d'environnement dans le gestionnaire de fenêtres Awesome en utilisant awesome-client avec un "expéditeur" Dbus de code lua.
la source
Pas une réponse directe mais ... Raymond Chen avait une justification [basée sur Windows] à ce sujet seulement l'autre jour : -
En d'autres termes, de telles installations du noyau seraient
Cependant, la raison la plus probable est simplement qu'il existe des cas d'utilisation limités pour une telle installation.
la source
Il semble que putenv ne fonctionne pas maintenant, mais setenv le fait. Je testais la réponse acceptée en essayant de définir la variable dans le shell actuel sans succès
et la variante comment cela fonctionne:
la source