هل هناك طريقة لتغيير متغيرات البيئة لعملية أخرى في يونكس؟

StackOverflow https://stackoverflow.com/questions/205064

سؤال

في نظام Unix، هل هناك أي طريقة يمكن من خلالها أن تقوم إحدى العمليات بتغيير متغيرات البيئة الخاصة بعملية أخرى (على افتراض أن جميعها يتم تشغيلها بواسطة نفس المستخدم)؟سيكون الحل العام هو الأفضل، ولكن إذا لم يكن الأمر كذلك، فماذا عن الحالة المحددة التي يكون فيها أحدهما ابنًا للآخر؟

يحرر:ماذا عن عبر gdb؟

هل كانت مفيدة؟

المحلول

وفيا جدب:

(gdb) attach process_id

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

(gdb) detach

وهذا هو تماما الإختراق سيئة وينبغي أن يتم إلا في سياق سيناريو التصحيح، بطبيعة الحال.

نصائح أخرى

وربما كنت تستطيع ان تفعل ذلك من الناحية الفنية (انظر إجابات أخرى)، لكنه قد لا تساعدك.

ومعظم البرامج ويتوقع أن فار الحياة الفطرية لا يمكن تغيير من الخارج بعد بدء التشغيل، وبالتالي فإن معظم ربما قرأت للتو فار أنهم مهتمون عند بدء التشغيل وتهيئة بناء على ذلك. حتى تغييرها بعد ذلك لن يحدث فرقا، لأن البرنامج لن إعادة قراءتها.

إذا قمت بنشرها في ذلك مشكلة محددة، ربما يجب عليك اتخاذ نهج مختلف. إذا كان مجرد فضول: لطيفة السؤال: -)

وجوهريا، لا. إذا كان لديك امتيازات كافية (الجذر، أو ما يقرب من ذلك) ومطعون حول / ديف / kmem (ذاكرة kernel)، وقمت بإجراء تغييرات على البيئة للعملية، وإذا كانت العملية في الواقع إعادة المشار-متغير البيئة بعد ذلك (أي، عملية لم تتخذ بالفعل نسخة من الحياة الفطرية فار وليس فقط باستخدام هذه النسخة)، ثم ربما، إذا كنت محظوظا وذكية، وكانت الريح تهب في الاتجاه الصحيح، وكان مرحلة من مراحل القمر الصحيح، ربما، قد يحقق شيئا.

نقلا عن جيري بيك:

لا يمكنك تعليم كلب عجوز حيلًا جديدة.

الشيء الوحيد الذي يمكنك فعله هو تغيير متغير البيئة للعملية الفرعية قبل البدء به:فإنه يحصل على نسخة من البيئة الأم، آسف.

يرى http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm للتفاصيل.

مجرد تعليق على الإجابة حول استخدام /proc.تحت Linux /proc مدعوم ولكنه لا يعمل لا تستطيع غير ال /proc/${pid}/environ الملف، حتى لو كنت الجذر:إنها قطعاً يقرأ فقط.

وأنا أفكر في الطريقة المفتعلة بدلا للقيام بذلك، وانها لن تعمل لعمليات التعسفية.

لنفترض أن تكتب مكتبتك الخاصة المشتركة التي تنفذ "تشار * getenv. ثم، تقوم بإعداد "LD_PRELOAD" أو الحياة الفطرية "LD_LIBRARY_PATH. فار بحيث يتم تشغيل كل من العمليات مع محملة على مكتبتك المشتركة.

وبهذه الطريقة، سيكون لديك أساسا السيطرة على مدونة وظيفة "getenv. ثم، هل يمكن أن تفعل كل أنواع الحيل سيئة. الخاص بك getenv "يمكن أن تتشاور ملف التكوين الخارجي أو جزء SHM للقيم بديلة للفار الحياة الفطرية. أو هل يمكن أن تفعل البحث REGEXP / استبدال على القيم المطلوبة. أو ...

وأنا لا يمكن التفكير في وسيلة سهلة للقيام بذلك لادارة العمليات التعسفية (حتى لو كنت الجذر)، قصيرة من إعادة كتابة رابط الحيوي (ld-linux.so).

أو اطلب من عمليتك تحديث ملف التكوين للعملية الجديدة ثم إما:

  • قم بتنفيذ Kill -HUP في العملية الجديدة لإعادة قراءة ملف التكوين المحدث، أو
  • اطلب من العملية التحقق من ملف التكوين بحثًا عن التحديثات بين الحين والآخر.إذا تم العثور على تغييرات، فأعد قراءة ملف التكوين.

وليس بقدر ما أعرف. حقا كنت تحاول التواصل من عملية واحدة إلى أخرى التي تدعو إلى إحدى الطرق IPC (الذاكرة المشتركة، الإشارات، ومآخذ، وما إلى ذلك). بعد أن تلقى البيانات من جانب واحد من هذه الأساليب التي يمكن بعد تعيين متغيرات البيئة أو تنفيذ إجراءات أخرى أكثر مباشرة.

إذا يدعم يونكس الخاصة بك نظام الملفات / إجراءات، ثم انها تافهة لقراءة الحياة الفطرية - يمكنك أن تقرأ البيئة، فلكس، والعديد من الجوانب الأخرى من أي عملية كنت تملك هذا النحو. تغيير ذلك ... حسنا، أستطيع أن أفكر في وسيلة، ولكن انها فكرة سيئة.

والقضية الأعم ... أنا لا أعرف، ولكن أشك هناك إجابة المحمولة.

و(تعديل: جوابي الأصلي تولت OP أراد أن يقرأ على الحياة الفطرية، وليس تغييره)

وUNIX هو الكامل من التواصل بين العملية. معرفة ما اذا كان المثال الذي تستهدفه لديه بعض. DBus تثبيت أصبحت المعيار في "سطح المكتب" IPC.

وأنا تغيير متغيرات البيئة داخل نافذة مدير رهيبة باستخدام <م> رهيبة العميل مع هو DBus تثبيت "مرسل" من التعليمات البرمجية لوا.

ليست إجابة مباشرة ولكن... كان لدى ريموند تشين أساس منطقي [يعتمد على Windows] حول هذا الأمر في اليوم الآخر فقط :-

...على الرغم من أن هناك بالتأكيد طرقًا غير مدعومة للقيام بذلك أو طرقًا تعمل بمساعدة مصحح الأخطاء، إلا أنه لا يوجد شيء مدعوم للوصول البرمجي إلى سطر أوامر عملية أخرى، على الأقل لا شيء توفره النواة....

عدم وجود نتيجة لمبدأ عدم تتبع المعلومات التي لا تحتاج إليها.لا تحتاج النواة إلى الحصول على سطر الأوامر لعملية أخرى.يستغرق الأمر تمرير سطر الأوامر إلى CreateProcess وظيفة ونسخها في مساحة العنوان للعملية التي يتم إطلاقها، في الموقع حيث GetCommandLine يمكن للوظيفة استردادها.بمجرد أن تتمكن العملية من الوصول إلى سطر الأوامر الخاص بها، تنتهي مسؤوليات النواة.

نظرًا لأنه يتم نسخ سطر الأوامر في مساحة عنوان العملية، فقد تقوم العملية بالكتابة إلى الذاكرة التي تحتوي على سطر الأوامر وتعديله.إذا حدث ذلك، فسيتم فقدان سطر الأوامر الأصلي إلى الأبد؛تمت الكتابة فوق النسخة الوحيدة المعروفة.

وبعبارة أخرى، فإن أي مرافق نواة من هذا القبيل ستكون كذلك

  • من الصعب تنفيذها
  • يحتمل أن يكون مصدر قلق أمني

ومع ذلك، فإن السبب الأكثر ترجيحًا هو ببساطة أن هناك حالات استخدام محدودة لمثل هذه المنشأة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top