আমি কীভাবে বলব যে আমি একটি ক্রুটে চালাচ্ছি?


46

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

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

আরও সাধারণভাবে, পরামর্শগুলি যেগুলি অন্যান্য সংযোজন পদ্ধতির জন্য কাজ করে সেগুলি আকর্ষণীয় হবে। ব্যবহারিক প্রশ্নটি হল, এই সিস্টেমটি কোনও পরিষেবা চালানোর কথা? (উত্তরটি ক্রুটে নয়, এবং হ্যাঁ একটি পূর্ণাঙ্গ ভার্চুয়াল মেশিনে; জেল বা পাত্রে যেমন মধ্যবর্তী ক্ষেত্রে আমি জানি না।)

উত্তর:


45

আমি এখানে যা করেছি তা হ'ল initপ্রক্রিয়াটির মূল (পিআইডি 1) বর্তমান প্রক্রিয়ার মূলের মতো কিনা তা পরীক্ষা করা । যদিও /proc/1/rootসর্বদা এর লিঙ্ক হয় /(যদি না initনিজেই আঁকানো থাকে তবে এটি আমার পক্ষে যত্নবান নয়), এটি অনুসরণ করে "মাস্টার" মূল ডিরেক্টরিতে পরিচালিত হয়। এই কৌশলটি ডেবিয়ানের কয়েকটি রক্ষণাবেক্ষণ স্ক্রিপ্টগুলিতে ব্যবহৃত হয়, উদাহরণস্বরূপ ক্রোট ইনস্টল করার পরে ইউদেব শুরু করা বাদ দেওয়া।

if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  echo "We are chrooted!"
else
  echo "Business as usual"
fi

(যাইহোক, chrootক্রোটযুক্ত প্রক্রিয়াটিতে রুট অ্যাক্সেস থাকলে সুরক্ষার জন্য কেন এটি অনর্থক এটির এটি আরও একটি উদাহরণ Non নন-রুট প্রক্রিয়াগুলি পড়তে পারে না /proc/1/root, তবে /proc/1234/rootপিআইডি 1234 এর মতো চলমান প্রক্রিয়া যদি চলমান থাকে তবে তারা অনুসরণ করতে পারে) ব্যবহারকারী।)

যদি আপনার কাছে রুট অনুমতি না থাকে তবে আপনি লিনাক্স কার্নেল ডকুমেন্টেশনে সংক্ষিপ্তভাবে নথিভুক্ত করতে পারেন /proc/1/mountinfoএবং দেখতে পারেন । এই ফাইলটি বিশ্ব-পঠনযোগ্য এবং ফাইল সিস্টেমের প্রক্রিয়াটির দৃশ্যে প্রতিটি মাউন্ট পয়েন্ট সম্পর্কে প্রচুর তথ্য রয়েছে। সেই ফাইলের পাথগুলি ক্রোট দ্বারা পাঠক প্রক্রিয়াটিকে প্রভাবিত করে, যদি কোনও হয় তা দ্বারা সীমাবদ্ধ। প্রক্রিয়া পাঠটি যদি এমন কোনও ফাইল সিস্টেমে ক্রোয়েটেড হয় যা গ্লোবাল রুট থেকে পৃথক হয় (ধরে নিই যে পিড 1 এর মূলটি গ্লোবাল রুট), তবে কোনও প্রবেশের জন্য উপস্থিত হবে না । প্রক্রিয়া পাঠটি যদি গ্লোবাল রুট ফাইল সিস্টেমের কোনও ডিরেক্টরিতে ক্রোটযুক্ত হয় তবে তার জন্য একটি এন্ট্রি প্রদর্শিত হবে তবে ভিন্ন মাউন্ট আইডি রয়েছে। ঘটনাচক্রে, মূল ক্ষেত্র (/proc/$$/mountinfofilesystems/proc.txt/proc/1/mountinfo//proc/1/mountinfo/proc/1/mountinfo//proc/1/mountinfo$4) ক্রোটটি তার মাস্টার ফাইল সিস্টেমে কোথায় রয়েছে তা নির্দেশ করে।

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

এটি একটি খাঁটি লিনাক্স সমাধান। এটি পর্যাপ্তরূপে অনুরূপ অন্যান্য ইউনিক্স রূপগুলিতে সাধারণীকরণযোগ্য হতে পারে /proc(সোলারিসের একটি একইরকম রয়েছে /proc/1/rootবলে আমি মনে করি, তবে তা নয় mountinfo)।


1
এটি ওপেনবিএসডি তে কাজ করবে না কারণ এটিতে এলোমেলো পিআইডি রয়েছে ; মূল প্রক্রিয়াটি মূলত কখনই পিআইডি হয় না Now এখন আপনি জানেন কেন!
অ্যাডাম কাটজ

@ অ্যাডামক্যাটজ "... বেশ কয়েকটি সুস্পষ্ট ব্যতিক্রম সহ, যেমন, ডিআইডি (8)" " তাহলে এটি কোনটি?
মুড়ু

@ মুরু: ও, শক! তুমি আমাকে গুলি করে ফেলেছ আমি নিশ্চিত নই যে কেন init(8)এমন এক ধরণের হার্ড-কোডেড প্রকৃতির প্রয়োজন নেই যদি না একেবারে # 1 স্লট প্রয়োজন হয় (যাতে আমি এখনও কেন অনিশ্চিত থাকব )। অবশ্যই, বিএসডিগুলির কাছে কেবল ক্রোটের চেয়ে অনেক বেশি উন্নত জেল রয়েছে, সুতরাং এটি কতটা সমস্যাযুক্ত তাও আমি নিশ্চিত নই।
আদম কাটজ

4
@ অ্যাডামক্যাটজ এটির বিপরীত: পিড 1 এর একটি বিশেষ ভূমিকা রয়েছে (এটি অবশ্যই জম্বি ফসল কাটতে হবে, এবং এটি সিগ্কিলের থেকে সুরক্ষিত)। Init প্রোগ্রামটি সেই ভূমিকার বাস্তবায়ন। আমার উত্তর ওপেনবিএসডি তে কাজ না করার কারণ এর সাথে কিছুই করার নেই: এটি কারণ ওপেনবিএসডি-তে সোলারিস / লিনাক্সের মতো কিছু নেই /proc। আমার উত্তরটি লিনাক্স ব্যতীত আর কিছুই সম্বোধনের উদ্দেশ্যে নয়।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

@ গিলিস আমি অনুভব করেছি যে ওপেনবিএসডি এটি কোনও উপায়ে বা অন্যভাবে পরাজিত করবে। তবুও, আমি আশ্চর্য হয়েছি যে এই সমস্ত বিশেষ ভূমিকা আইটেমগুলি সালিসী পিআইডি প্রয়োগ করতে সক্ষম নয় (কোনও পরিণতি ছাড়াই), যা আমি এর আগে আমার italicized "কেন" বলতে বোঝাতে চাইছিলাম।
আদম কাটজ

22

হিসাবে উল্লেখ inode সংখ্যা খুঁজে বের করতে পোর্টেবল পথ এবং ভিতর থেকে একটি chroot জেল সনাক্ত , আপনি পরীক্ষা করতে পারবেন এর inode সংখ্যা কিনা /হয় 2:

$ ls -di /
2 /

2 এর চেয়ে আলাদা একটি ইনোড নম্বর নির্দেশ করে যে আপাত রুট কোনও ফাইল সিস্টেমের আসল মূল নয়। এটি মাউন্ট পয়েন্টে বা এলোমেলো রুট ইনোড সংখ্যাসহ অপারেটিং সিস্টেমগুলিতে শিকড় সনাক্ত করবে না ।


কোন ফাইল সিস্টেমে এই তাত্ত্বিক কাজ করে?
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

Ext3 এবং এইচএফএসে পরীক্ষিত।
l0b0

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

6
এটি এক্সট্রা [234] এর ক্ষেত্রে সত্য, তবে সমস্ত ফাইল সিস্টেমের ক্ষেত্রে নয়। এটি কেবল এটি পরীক্ষা করে যে আপনার রুট ফাইল সিস্টেমের মূল, যা আসল রুট হিসাবে মাউন্ট করা যায় না। অন্য কথায়, আপনি যদি / জেলের মধ্যে অন্য একটি পার্টিশন মাউন্ট করেন এবং chroot /jailতারপরে এটি এই পরীক্ষার আসল মূলের মতো দেখাবে।
psusi

1
পছন্দ করেছেন ওপেনবিএসডি .0.০-স্থিতিশীল পরীক্ষিত, প্রকৃত মূল পাথের জন্য ইনোড নম্বরটি এখনও 2 এবং এটি ক্রুটের জন্য এলোমেলো সংখ্যা।
দিমিত্রি ডিবি

5

এখানে তালিকাভুক্ত অন্যান্য বিকল্পগুলির মতো পরিষ্কারভাবে পোর্টেবল না হওয়ার পরেও যদি আপনি কোনও ডেবিয়ান-ভিত্তিক সিস্টেমে থাকেন তবে চেষ্টা করুন ischroot

দেখুন: https://manpages.debian.org/jessie/debianutils/ischroot.1.en.html

ইস্ক্রুট ব্যবহার করে সরাসরি কনসোলে স্থিতি পেতে:

ischroot;echo $?

প্রস্থান কোডগুলি:

0 if currently running in a chroot
1 if currently not running in a chroot
2 if the detection is not possible (On GNU/Linux this happens if the script is not run as root).
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.