কেন একটি শেল স্ক্রিপ্টে "সুডো সু" বাকী স্ক্রিপ্টটি রুট হিসাবে চালায় না?


36

একটি নমুনা স্ক্রিপ্ট নীচের হিসাবে হতে পারে:

#!/bin/bash
sudo su
ls /root

./test.shসাধারণ ব্যবহারকারী হিসাবে ব্যবহার করার পরিবর্তে lsসুপার ব্যবহারকারী হিসাবে চালিত হয়ে প্রস্থান করুন, এটি রুটে চলে গেছে; এবং আমি লগআউট করার সময় ls /rootএটি সাধারণ ব্যবহারকারীরূপে কার্যকর করে।

কেউ আমাকে সম্পর্কে এটি সম্পর্কে বলার পারেন?


13
sudo suআমার চোখ ব্যাথা করে
জেলরেন

এটি ব্যবহৃত হয় কারণ লোকেরা সুডো যথেষ্ট পরিমাণে জানেন না এবং তাই তাদের সিস্টেমে সু চালানোর জন্য একটি উপায় প্রয়োজন যেখানে ইচ্ছাকৃতভাবে দূষিত পাসওয়ার্ড দ্বারা রুট সুরক্ষিত। তবে হ্যাঁ sudo su এর ব্যবহার "redundifies" করে।
জোহান

1
আপনি শুধু ব্যবহার করতে পারবেন না sudo -s, যদিও?
জো জেড।

@ জোহান, আমি প্রায়শই ব্যবহার করি sudo suকারণ আমি যেগুলির suচেয়ে বেশি তার বিকল্পগুলিতে অভ্যস্ত sudo। আমি সুডোর অপশনগুলি যথেষ্ট পরিমাণে জানি, তবে আমি সুগুলি দ্রুত টাইপ করতে পারি। তবে হ্যাঁ আমি অনুমান করি এর অর্থ আমি সুডো যথেষ্ট পরিমাণে জানি না।
ব্যবহারকারী 606723

1
আমি সবেমাত্র সুডো ম্যান পৃষ্ঠাটি পরীক্ষা করেছি। মনে হচ্ছে sudo -iসদৃশ হয় su -যখন sudo -sমত পরিচালনা su(ড্যাশ ছাড়া)
জোহান

উত্তর:


49

স্ক্রিপ্টের কমান্ডগুলি একে একে স্বাধীনভাবে কার্যকর করা হয়। স্ক্রিপ্টের সমস্ত কমান্ডের পিতা-মাতা হিসাবে স্ক্রিপ্ট নিজেই অন্য একটি স্বতন্ত্র প্রক্রিয়া এবং su কমান্ড এটি রুটে পরিবর্তন করতে পারে না এবং করতে পারে না: su কমান্ডটি রুট সুবিধাগুলি সহ একটি নতুন প্রক্রিয়া তৈরি করে।

Su কমান্ডটি সম্পূর্ণ হওয়ার পরে, একই ব্যবহারকারী হিসাবে চলমান প্যারেন্ট প্রসেসটি, স্ক্রিপ্টের বাকী অংশটি কার্যকর করবে।

আপনি যা করতে চান তা একটি র‌্যাপার স্ক্রিপ্ট লিখুন। সুবিধাযুক্ত কমান্ডগুলি মূল স্ক্রিপ্টে যায়, উদাহরণস্বরূপ~/main.sh

#!/bin/sh
ls /root

মোড়ক স্ক্রিপ্টটি মূল স্ক্রিপ্টটিকে মূল অনুমতি সহ কল ​​করে

#!/bin/sh
su -c ~/main.sh root

এই প্রক্রিয়াটি চালু করতে আপনি মোড়কটি চালান, যা ব্যবহারকারীকে মূল ব্যবহারকারীকে স্যুইচ করার পরে মূল স্ক্রিপ্টটি চালু করে।

এই মোড়ক কৌশলটি স্ক্রিপ্টটিকে নিজের চারপাশে মোড়কে পরিণত করতে ব্যবহার করা যেতে পারে। মূলত এটি রুট হিসাবে চলমান কিনা তা পরীক্ষা করে দেখুন, না হলে নিজেই পুনরায় চালু করতে "সু" ব্যবহার করুন।

$ 0 হ'ল লিপিটি নিজেকে বোঝানোর একটি সহজ উপায় এবং হুয়ামি কমান্ড আমাদের বলতে পারে আমরা কে (আমরা কি মূল?)

তাই অন্তর্নির্মিত মোড়কের সাহায্যে মূল স্ক্রিপ্টটি হয়ে যায়

#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root

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


1
fwiw, এই পয়েন্টের একটি সংযোজন। যদি আমি এটির মতো কোনও স্ক্রিপ্ট লিখছিলাম তবে আমি শুরুতে কেবলমাত্র একটি বিবৃতি করতাম যা cks EID পরীক্ষা করে এবং যদি এটি নিজেই শূন্য না হয় এবং প্রস্থান হয়, অন্যথায় স্ক্রিপ্টের প্রয়োগের সাথে চালিয়ে যান।
ব্র্যাচলে

সম্মত, এবং আমি এটি ব্যাখ্যা করার জন্য উত্তর আপডেট করব।
জোহান

2
সম্ভবত এটি কিছুটা প্রত্নতাত্ত্বিক তবে আমি প্রতিটি নির্বাহযোগ্যের জন্য নিখুঁত পাথগুলি পছন্দ করি যাতে কেউ ~ / main.sh স্ক্রিপ্টটিকে নিকৃষ্ট কিছুতে পরিবর্তন করতে পারে না। স্ক্রিপ্টের ব্যবহারকারী অংশটি আক্রমণ করছে
আরটিফেক্স

2
আপনি the *
ব্র্যাচলে

@ জোয়েলডাভিস আমি সর্বদা "আর্গুমেন্টে ফাঁকা অক্ষর থাকলে কী হবে" এর প্রাচীরে প্রবেশ করি। আমি কখনও সন্তোষজনক সমাধান খুঁজে পাইনি। । একবার ভাবলাম একটি স্ক্রিপ্ট যা টেম্প ফাইলের মধ্যে এর আর্গুমেন্টগুলি আউট করা, প্রতি লাইনে একটি যুক্তি, এবং তারপর বলা যাই হোক না কেন এটা প্রয়োজন এবং যে চূড়ান্ত স্ক্রিপ্টে কি ফাইলে মূল আর্গুমেন্ট এটি পড়তে আর্গুমেন্ট পাস লিখেছিলেন
জোহান

20

স্ক্রিপ্টে নিম্নলিখিত ব্যবহার করুন।

sudo su <<HERE
ls /root
HERE

এখানে ব্লকের মধ্যে কোডটি রুট হিসাবে চালানো হবে।


6
sudo suদুটি প্রোগ্রাম কল করছে। ব্যবহার sudo -s <<HEREDOCবা su user <<HEREDOC... বোকা 5 মিনিটের সীমা।
জোহান

6

আরও যুক্তি ছাড়াই suমূলের জন্য লগইন শেলটি চালানো হবে। আপনার স্ক্রিপ্টের প্রথম লাইনটি আসলে এটি করে। যখন আপনি প্রস্থান, লগইন শেল প্রচেষ্টা, su কমান্ড আয় এবং আপনার স্ক্রিপ্ট সম্পাদন অব্যাহত, দ্বিতীয় লাইন সাথে আছেন যে: ls /root। আমি মনে করি আপনি sudo ls /rootযা চান তা কেবল করতে পারেন।


হ্যাঁ, আমি জানি আমি এটির জন্য এটি করতে পারি lsতবে এটি কেবল একটি নমুনা। প্রকৃতপক্ষে আমাকে মূল অধিকার সহ আরও অনেক কিছু করতে হবে :-) তাই আমি @ অঙ্কিতের উত্তর পছন্দ করি।
হংকক্সু চেন

1

একবার আপনি সুপার ইউজারের কাঁটাযুক্ত sudo suকার্যকর সঙ্গে একটি নতুন প্রক্রিয়া ফায়ার userid (euid=EUID), অতএব আমরা (pid=PID)একই টার্মিনাল সঙ্গে যুক্ত বিভিন্ন প্রক্রিয়া আইডি চলমান নতুন বাশ আছে (tname=TTY)

ব্যাখ্যা

ধরুন গুলি চালানোর পরে ps -A | grep bashআপনার 21460 pts/2 00:00:00 bashআউটপুট আছে। এখন, আপনি যখন চালানো ./test.shউভয় কমান্ড sudo suএবং ls /rootকরতে spooled হবে PID 21460। কার্যকর হওয়ার পরে যখন আপনি আবার rootসক্রিয় ব্যবহারকারী হিট ps -A | grep bashহয়ে যাবেন, আপনি একটি নতুন বাশ চলমান লক্ষ্য করবেন PID say, 21570। থেকে প্রস্থান করা root bashসদ্য user's bashকাঁটাযুক্ত বাশকে ফিরে যেতে মেরে ফেলবে এবং তাই ls /rootপ্রম্পট প্রকাশের আগে স্পুলেড কমান্ড কার্যকর করে।


যদি su বা sudo ব্যাশ-এ (বা অন্য কোথাও) ব্যবহার করা "স্থির" ছিল তবে এটি সমাধানের চেয়ে আরও অনেক সমস্যা তৈরি করতে পারে। সুরক্ষা এবং সুরক্ষার জন্য আপনাকে রুট হিসাবে সর্বনিম্ন সম্ভব করা দরকার। সু এবং সুদো (সুরক্ষা ব্যতীত!) থাকার মূল বিষয় হ'ল মূল সুবিধাগুলির জন্য কী কী প্রয়োজন সে সম্পর্কে আপনাকে যত্ন সহকারে চিন্তা করা।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.