ইউনিক্সে অন্য প্রক্রিয়ার পরিবেশের পরিবর্তনগুলি পরিবর্তন করার কোনও উপায় আছে কি?


105

ইউনিক্সে, কোনও প্রক্রিয়া কীভাবে অন্যের পরিবেশের ভেরিয়েবলগুলি পরিবর্তন করতে পারে (ধরে নিলেন তারা সবাই একই ব্যবহারকারী দ্বারা চালিত হচ্ছে)? একটি সাধারণ সমাধান সবচেয়ে ভাল হবে, তবে যদি তা না হয় তবে সেই নির্দিষ্ট ক্ষেত্রে কী হবে যেখানে একজন অন্যের সন্তান হয়?

সম্পাদনা: জিডিবি দিয়ে কীভাবে?


এটি আমাকে কুৎসিতের চেয়ে বেশি আঘাত করে। আসল সমস্যাটি আপনি কী সমাধান করতে চান?
জেনস

1
উদাহরণ: আমি একটি পরিবেশের পরিবর্তনশীল সংজ্ঞায়িত করতে চাই যাতে প্রতিটি নতুন অ্যাপ্লিকেশন - ইউআই দ্বারা চালু করা - এটি পায়। আমি স্টার্টআপ স্ক্রিপ্টগুলির একটিতে আরআর-লগিনের ভেরিয়েবলগুলি সংজ্ঞায়িত করা ব্যতীত অন্য কোনও পদ্ধতি সম্পর্কে জানি না। আমি তবে চাই যে পুনরায় লগইন না করে, তবে চলতি সেশনে কেবলমাত্র ভেরিয়েবলগুলি সংজ্ঞায়িত করতে হবে যাতে নতুন অ্যাপ্লিকেশনগুলি এটি পেতে পারে - ইউআই থেকে লগ আউট না করে।
অ্যালিক্লিজিন-কিলাকা

উত্তর:


142

জিডিবি এর মাধ্যমে:

(gdb) attach process_id

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

(gdb) detach

এটি বেশ বাজে হ্যাক এবং অবশ্যই একটি ডিবাগিং দৃশ্যের প্রসঙ্গে অবশ্যই করা উচিত।


8
সুতরাং এটিকে বোঝা যাচ্ছে যে আপনি জিডিবি যেমন প্রক্রিয়ায় সংযুক্ত হন, এবং তারপরে বিচ্ছিন্ন হয়ে থাকেন তবে আপনি প্রকৃতপক্ষে কোনও প্রক্রিয়ার পরিবেশ পরিবর্তন করতে পারেন। মনে হচ্ছে এমন কোনও প্রোগ্রাম লেখা সম্ভব হবে যা কেবল এটি করে।
শোক করুন

3
"মনে হচ্ছে এটি কোনও প্রোগ্রাম লিখতে সম্ভব হবে যা কেবল এটিই করে" সত্যিই .. এটি।
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

2
এমনকি সাইগউইন ব্যবহার করে উইন্ডোজে কাজ করে, সাইগউইন ব্যবহার করে সংকলিত নয় এমন প্রক্রিয়াগুলির জন্য!
হুয়ান কার্লোস Muñoz

11
মনে রাখবেন যে প্রক্রিয়াটি স্থায়ীভাবে কোনও পূর্ববর্তী গেস্টেভের পরে মানটি ক্যাশে না করে থাকলে এটি কেবলমাত্র কার্যকর হয়।
অ্যানড্রু

1
ptrace: Operation not permitted
জারিত

22

আপনি সম্ভবত এটি প্রযুক্তিগতভাবে করতে পারেন (অন্যান্য উত্তর দেখুন), তবে এটি আপনাকে সাহায্য করবে না।

বেশিরভাগ প্রোগ্রাম আশা করে যে এনভ ভার্সগুলি প্রারম্ভকালের পরে বাইরে থেকে পরিবর্তন করা যায় না, তাই সম্ভবত বেশিরভাগ তারা কেবল স্টার্টআপে আগ্রহী ওয়ারগুলি পড়বে এবং তার ভিত্তিতে সূচনা করবে। সুতরাং তাদের পরে পরিবর্তন করা কোনও তাত্পর্যপূর্ণ করবে না, যেহেতু প্রোগ্রামটি সেগুলি আর কখনও পড়বে না।

আপনি যদি এটি একটি কংক্রিট সমস্যা হিসাবে পোস্ট করেন তবে আপনার সম্ভবত অন্যরকম পদ্ধতির গ্রহণ করা উচিত। যদি এটি কেবল কৌতূহলের বাইরে ছিল: দুর্দান্ত প্রশ্ন :-)।


1
সবচেয়ে কার্যকর ব্যবহারের ক্ষেত্রে যেখানে এটি কার্যকর হবে তা হল শিশু প্রক্রিয়াগুলিকে নতুন পরিবেশের ভেরিয়েবলের উত্তরাধিকারী করা, উদাহরণস্বরূপ, ডেস্কটপ পরিবেশে যেখানে আপনি নতুন ভেরিয়েবলগুলি ব্যবহার করতে নতুন টার্মিনাল চান।
Hjulle

13

সুস্পষ্টভাবে, না। আপনার যদি পর্যাপ্ত সুযোগসুবিধা (রুট, বা তার অবস্থান) থাকে এবং আশেপাশে / dev / kmem (কার্নেল মেমরি) থাকে এবং আপনি প্রক্রিয়াটির পরিবেশে পরিবর্তন করে থাকেন, এবং প্রক্রিয়াটি যদি বাস্তবে পরিবেশের পরিবর্তনশীলটিকে পুনরায় রেফার করে তবে (এটি প্রক্রিয়াটি হয় ইতিমধ্যে env var এর একটি অনুলিপি গ্রহণ করেনি এবং কেবল সেই অনুলিপিটি ব্যবহার করে নি) তবে সম্ভবত আপনি যদি ভাগ্যবান এবং চতুর হন এবং বাতাসটি সঠিক দিকে প্রবাহিত হত এবং চাঁদের পর্বটি সঠিক ছিল, সম্ভবত, আপনি কিছু অর্জন করতে পারে।


2
উত্তর পেলাম না।
অ্যালিকেলিন-কিলাকা

@ কিলাকা: মূল শব্দটি দ্বিতীয়টি - না । বাকি উত্তরটি বলছে যে আপনার যদি মূল অধিকার রয়েছে বা কোনও ডিবাগার চালাচ্ছেন তবে আপনি এটি করতে পারেন তবে সমস্ত ব্যবহারিক উদ্দেশ্যে, উত্তরটি হ'ল না
জোনাথন লেফলার 15

আপনার কাছে একটি শেল স্ক্রিপ্ট চলছে; আপনি আপনার শেল স্ক্রিপ্টের পিতামহীন প্রক্রিয়াতে পরিবেশ পরিবর্তন করতে চান ... সুতরাং শেল স্ক্রিপ্টটি gdbপিতামাতার প্রক্রিয়াতে আরম্ভ করে এবং পরিবর্তনটি করাতে স্ক্রিপ্ট করা হয়, এবং এটি প্যারেন্ট প্রক্রিয়াটি ক্র্যাশ না করে কাজ করে। ঠিক আছে - আপনি সম্ভবত এটি করতে পারেন, তবে এটি এমন কিছু নয় যা আপনি রুটিন ভিত্তিতে করতে যাচ্ছেন। ব্যবহারিক উদ্দেশ্যে, সুতরাং, উত্তর না হয় । উত্তরটির বাকী অংশটি দেয়ালের বাইরে থাকা তাত্ত্বিকভাবে সম্ভব, কিছুটা অযৌক্তিকভাবে ডোবেবল বিকল্পগুলিও কভার করে।
জোনাথন লেফলার

7

জেরি পিককে উদ্ধৃত করে:

আপনি কোনও পুরানো কুকুরকে নতুন কৌশল শেখাতে পারবেন না।

একমাত্র আপনি যা করতে পারেন তা হল শিশু প্রক্রিয়া শুরু করার আগে পরিবেশের পরিবর্তনশীল পরিবর্তন করা: এটি পিতামাতার পরিবেশের অনুলিপি পেয়েছে, দুঃখিত।

বিশদ জানতে http://www.unix.com.ua/orelly/unix/upt/ch06_02.htm দেখুন ।

ব্যবহার / প্রকল্প সম্পর্কে উত্তর সম্পর্কে কেবল একটি মন্তব্য। লিনাক্স / প্রোক এর অধীন সমর্থিত তবে এটি কাজ করে না, আপনি রুট হলেও ফাইলটি পরিবর্তন করতে পারবেন না/proc/${pid}/environ : এটি একেবারে পঠনযোগ্য।


যা এখনও প্রশ্নটি ফেলেছে: এনভির মানগুলি আসলে কোথায় সঞ্চিত? এটি কি কর্নেল দ্বারা সম্পন্ন হয়েছে? অথবা শেলটি মানগুলি সঞ্চয় করে এবং / proc / <pid> / পরিবেশ সেগুলি সেগুলি থেকে পেয়ে যায়?
অলিভার

এটি একটি বাস্তবায়ন বিশদ, এবং এটি একটি (পৃথক) ভাল প্রশ্ন হতে পারে। আমি মনে করি প্রতিটি ইউএনআইএক্স স্টোরেজের জন্য নিজস্ব উপায় ব্যবহার করে তবে তারা সকলেই উপরে বর্ণিত আচরণটি ভাগ করে নেয় যা নির্দিষ্টকরণের অংশ।
ডেভিড

7

আমি এটি করার পরিবর্তে স্বীকৃত উপায় সম্পর্কে ভাবতে পারি এবং এটি স্বেচ্ছাসেবী প্রক্রিয়াগুলির জন্য কাজ করবে না।

মনে করুন আপনি নিজের ভাগ করা লাইব্রেরি লিখেছেন যা 'চর * জেনেটভ' প্রয়োগ করে। তারপরে, আপনি 'এলডি_প্রেল্যাড' বা 'এলডি_লিবিআরএআইপিএটিএইচ' এনভিউ সেট আপ করেছেন। vars যাতে আপনার উভয় প্রসেস আপনার ভাগ করা লাইব্রেরি প্রিললোডের সাথে চালিত হয়।

এইভাবে, আপনার মূলত 'জেন্তেভ' ফাংশনের কোডের উপর নিয়ন্ত্রণ থাকবে। তারপরে, আপনি সমস্ত ধরণের কদর্য কৌশলগুলি করতে পারেন। আপনার 'জেন্তেভ' এনভি ভার্সের বিকল্প মানের জন্য বাহ্যিক কনফিগারেশন ফাইল বা এসএইচএম বিভাগের সাথে পরামর্শ করতে পারে। অথবা আপনি অনুরোধকৃত মানগুলিতে রিজেক্সপ অনুসন্ধান / প্রতিস্থাপন করতে পারেন। বা ...

স্বেচ্ছাসেবী চলমান প্রক্রিয়াগুলির জন্য এটি করার সহজ উপায় সম্পর্কে আমি ভাবতে পারি না (এমনকি আপনি যদি মূল হন), গতিশীল লিঙ্কার (ld-linux.so) পুনর্লিখনের সংক্ষিপ্ততা।


এটি করা উচিত। আপনার ভার = মান জোড়ার জন্য কিছুটা জিডিবিএম ডাটাবেস থাকতে পারে। আমার কাছে স্ট্রমবার্গ.ডনসালিআস.আর
স্ট্রোমব্রিজ

আমি মনে করি এই পদ্ধতিটি যদিও পূর্বে চিন্তা করা প্রয়োজন। এটিকে দুর্ঘটনাক্রমে অত্যধিক প্রক্রিয়াতে প্রয়োগ না করার বিষয়ে আপনাকেও যত্নবান হতে হবে।
ডিস্ট্রোমবার্গ

3

অথবা নতুন প্রক্রিয়াটির জন্য একটি কনফিগার ফাইল আপডেট করার জন্য আপনার প্রক্রিয়াটি পান এবং তারপরে হয়:

  • আপডেট হওয়া কনফিগারেশন ফাইলটি পুনরায় পড়তে নতুন প্রক্রিয়াতে একটি কিল-এইচপি করুন, বা
  • প্রক্রিয়াটি এখন এবং তারপরে আপডেটগুলির জন্য কনফিগার ফাইলটি পরীক্ষা করে দেখুন। যদি পরিবর্তনগুলি পাওয়া যায়, তবে কনফিগার ফাইলটি পুনরায় পড়ুন।

2

আমি যতদূর জানি না। সত্যিই আপনি একটি প্রক্রিয়া থেকে অন্য প্রক্রিয়াতে যোগাযোগ করার চেষ্টা করছেন যা আইপিসির একটি পদ্ধতির (ভাগ করা মেমোরি, সেমোফোরস, সকেট ইত্যাদি) জন্য ডাকে। এর মধ্যে একটি পদ্ধতির মাধ্যমে ডেটা প্রাপ্ত করার পরে আপনি পরিবেশের ভেরিয়েবলগুলি সেট করতে পারেন বা আরও সরাসরি অন্য ক্রিয়া সম্পাদন করতে পারেন।


1

যদি আপনার ইউনিক্স / proc ফাইল সিস্টেমটিকে সমর্থন করে, তবে এনভিডি পড়ার পক্ষে এটি তুচ্ছ - আপনি পরিবেশ, কমান্ডলাইন এবং আপনার যে কোনও প্রক্রিয়ার মালিকানাধীন আরও অনেকগুলি বৈশিষ্ট্য পড়তে পারেন। এটিকে পরিবর্তন করা ... ঠিক আছে, আমি কোনও উপায়ের কথা ভাবতে পারি, তবে এটি একটি খারাপ ধারণা।

আরও সাধারণ ক্ষেত্রে ... আমি জানি না, তবে আমি সন্দেহ করি এর একটি বহনযোগ্য উত্তর আছে।

(সম্পাদিত: আমার আসল উত্তর ধরে নেওয়া হয়েছে যে ওপি vভিনিটি পড়তে চায়, এটি পরিবর্তন করতে পারে না)


ওফস, আমার উত্তর সম্পাদনা করেছে - আমি ধরে নিচ্ছিলাম তিনি env পড়তে চেয়েছিলেন, এটি পরিবর্তন করেননি।
মাইক জি।

1
আমাকে ঝুলন্ত রাখবেন না। আপনার খারাপ ধারণা কি?
raldi

লিনাক্সে, আমি বিশ্বাস করি যে আপনি নিজের মালিকানাধীন অন্যান্য প্রক্রিয়ার জন্য / proc / <pid> / মেম রিড-রাইট খুলতে সক্ষম হতে পারেন ... যদিও আমি নিশ্চিত নই। চেষ্টা করা এবং প্রকৃতপক্ষে পরিবেশের সাথে জগাখিচুড়ি করা অবশ্যই একটি খারাপ ধারণা হবে। সুতরাং আমি আপনাকে এটি চেষ্টা করার পরামর্শ দিচ্ছি না ...
মাইক জি।

1

ইউএনআইএক্স আন্ত-প্রক্রিয়া যোগাযোগে পূর্ণ। আপনার লক্ষ্য উদাহরণটি কিছু আছে কিনা তা পরীক্ষা করুন। ডিবিস "ডেস্কটপ" আইপিসিতে একটি স্ট্যান্ডার্ড হয়ে উঠছে।

আমি আশ্চর্যজনক উইন্ডো ম্যানেজারের সাথে পরিবেশগত ভেরিয়েবলগুলি লুয়া কোডের একটি ডিবিস "প্রেরক" এর সাথে দুর্দান্ত ব্যবহার করে using


1

সরাসরি উত্তর নয় তবে ... র‌্যামন্ড চেনের কেবলমাত্র এই দিনটিকে ঘিরে [উইন্ডোজ ভিত্তিক] যুক্তি ছিল : -

... যদিও এটি করার কোনও অসমর্থিত উপায় বা কোনও ডিবাগারের সহায়তায় কাজ করার উপায়গুলি রয়েছে, অন্য প্রসেসের কমান্ড লাইনে প্রোগ্রাম্যাটিক অ্যাক্সেসের জন্য সমর্থিত এমন কিছুই নেই, কমপক্ষে কার্নেলের দ্বারা সরবরাহ করা হয়নি। ...

আপনার প্রয়োজন নেই এমন তথ্যের উপর নজর রাখার নীতিটির কোনও ফলাফল নেই। কার্নেলের অন্য প্রক্রিয়ার কমান্ড লাইন পাওয়ার প্রয়োজন নেই। এটি CreateProcessফাংশনে পাস হওয়া কমান্ড লাইনটি গ্রহণ করে প্রক্রিয়াটি যে স্থানে GetCommandLineফাংশনটি পুনরুদ্ধার করতে পারে তার ঠিকানার জায়গায় এটি অনুলিপি করে। প্রক্রিয়াটি তার নিজস্ব কমান্ড লাইনটি অ্যাক্সেস করতে পারলে কার্নেলের দায়বদ্ধতাগুলি সম্পন্ন হয়।

যেহেতু কমান্ড লাইনটি প্রক্রিয়াটির ঠিকানা স্থানে অনুলিপি করা হয়, প্রক্রিয়াটি এমনকি কমান্ড লাইন ধারণকারী মেমরিটিতেও লিখে এটি পরিবর্তন করতে পারে ify যদি এটি হয়, তবে মূল কমান্ড লাইন চিরতরে হারিয়ে যাবে; একমাত্র পরিচিত অনুলিপি ওভাররাইট করা হয়েছে।

অন্য কথায়, এ জাতীয় কোনও কার্নেল সুবিধা হবে

  • কার্যকর করা কঠিন
  • সম্ভাব্য একটি সুরক্ষার উদ্বেগ

তবে সর্বাধিক সম্ভাব্য কারণটি হ'ল এই জাতীয় সুবিধার জন্য সীমিত ব্যবহারের কেস নেই।


1

মনে হচ্ছে যে putenv এখন কাজ করে না, কিন্তু setenv আছে। কোনও সফলতা ছাড়াই বর্তমান শেলটিতে ভেরিয়েবল সেট করার চেষ্টা করার সময় আমি গ্রহণযোগ্য উত্তরটি পরীক্ষা করছিলাম

$] sudo gdb -p $$
(gdb) call putenv("TEST=1234")
$1 = 0
(gdb) call (char*) getenv("TEST")
$2 = 0x0
(gdb) detach
(gdb) quit
$] echo "TEST=$TEST"
TEST=

এবং এটি কীভাবে কাজ করে তা বৈকল্পিক:

$] sudo gdb -p $$
(gdb) call (int) setenv("TEST", "1234", 1)
$1 = 0
(gdb) call (char*) getenv("TEST")
$2 = 0x55f19ff5edc0 "1234"
(gdb) detach
(gdb) quit
$] echo "TEST=$TEST"
TEST=1234
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.