কোনও প্রোগ্রাম বলতে পারে যে এটি সুডোর অধীনে চলছে?


27

আমার একটি প্রোগ্রাম রয়েছে যা "সুডো" এর অধীনে চলতে থাকলে অন্যরকম আচরণ করা উচিত। এটি কি সুডোর অধীনে চালিত হয়েছিল তা খুঁজে পাওয়ার কোনও উপায় আছে?

আপডেট: কেউ জিজ্ঞাসা করেছে আমি কেন এটি করতে চাই। এই ক্ষেত্রে, ম্যাকপোর্টস ব্যবহার করে একটি ম্যাকের আউটপুট রয়েছে যা আপনাকে একটি নির্দিষ্ট কমান্ড কাট-পেস্ট করতে বলে। যদি ম্যাকপোর্টস কমান্ডটি "sudo" দিয়ে চালিত হয় তবে এটি নমুনা কমান্ডে sudo অন্তর্ভুক্ত করা উচিত:

$ sudo port selfupdate 
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead.  It would be even better if it just did it for you :-)

আমি কৌতূহলী: এটি কীভাবে আলাদা আচরণ করা উচিত তা আপনি ব্যাখ্যা করতে পারেন?
সাইরাসাস

1
@ এসসিউরাস সাধারণত একটি ব্যবহার-কেস একটি ইনস্টল স্ক্রিপ্টে থাকে যার জন্য মূল সুবিধার প্রয়োজন; আপনার যদি না থাকে তবে তাড়াতাড়ি মারা যান।
নিক টি


আমি কিছুটা কমান্ড অস্পষ্টভাবে মনে রেখেছি যে এটি সচেতন যে এটি মূল হিসাবে চালিত হয় বা না ... আমি মনে করি উত্তরটি "হ্যাঁ"
রল্ফ

উত্তর:


48

হ্যাঁ, একটি প্রোগ্রাম যখন সুডোর অধীনে চলছে তখন সেখানে 4 পরিবেশের পরিবর্তনশীল সেট রয়েছে:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

মনে রাখবেন যে এগুলি কেবল সেট করেই নকল করা যায়। কোন গুরুতর কিছুর জন্য তাদের বিশ্বাস করবেন না।

উদাহরণস্বরূপ: এই প্রোগ্রামে আমাদের ব্যবহারকারীকে অন্য কিছু প্রোগ্রাম চালানোর জন্য বলতে হবে। যদি বর্তমানটি সুডো দিয়ে চালানো হয় তবে অন্যটিটিও হবে।

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

মনে রাখবেন যে এটি কেবলমাত্র SUDO_ * ভেরিয়েবলের জন্য পরীক্ষা করে যদি এটি প্রথম প্রমাণ করতে পারে যে এটি রুট হিসাবে চলছে। তারপরেও এটি কেবল কিছু সহায়ক পাঠ্য পরিবর্তন করতে ব্যবহার করে।


2
"সমালোচনামূলক কিছু" এর জন্য আমি কী ব্যবহার করব?
কেভিন - মনিকা পুনরায়

3
@ কেভিন যদি কেউ তাদের পরিবেশের সাথে উচ্চতর সুযোগ-সুবিধাগুলিতে ভুয়া থাকার বিষয়ে নজর রাখেন, তবে তারা আশাবাদী যে তারা কী করছে এবং তার পরিণতি স্বীকার করবে।
নিক টি

ডাউনভোটেড কারণ যে কোনও উত্তর যে "সমালোচনামূলক কোনও কিছুর জন্য তাদের বিশ্বাস করবেন না" দ্বারা যোগ্য হতে হবে তা কোনও উত্তর নয়, তবে কুৎসিত হ্যাক।
স্টিফেন সি

এটি যে প্রশ্ন করা হয়েছিল তার পুরোপুরি গ্রহণযোগ্য উত্তর। সতর্কতাটি এমন লোকদের জন্য থাকা দরকার যা কেবল এটি সনাক্ত না করে সুডোর ব্যবহার রোধ করার চেষ্টা করতে পারে । ব্যবহারকারী কী কমান্ড চালাতে পারে তা সীমাবদ্ধ করতে sudo- র কমান্ড অ্যালিয়াসগুলি ব্যবহার করে প্রতিরোধ করা উচিত।
dwurf

11

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

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

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

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

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


7

দুটি পদ্ধতি ব্যবহার করা যেতে পারে।

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

আপনি উপযুক্ত ব্যবহারকারী হিসাবে চালাচ্ছেন কিনা তা পরীক্ষা করা আরও সাধারণ। idকমান্ড এই কাজ করতে ব্যবহার করা যাবে। টমঅনটাইমের স্ক্রিপ্টটি পরবর্তী কমান্ডটি চালানোর প্রয়োজন হতে পারে idতা নির্ধারণ করতে কমান্ডটি ব্যবহার করে sudo


1
> আপনি এইভাবে সুডোর অধীনে চলছেন তা আড়াল করা কঠিন হবে আপনি কেবল sudoবাইনারিটির অন্য কোনও নামকরণ করতে পারবেন না? অথবা sudoউল্টো বিপরীতে অন্য কিছু নির্বাহী নাম রাখুন ? এমন নয় যে আমি সত্যই প্রত্যাশা করেছিলাম যে কেউ এটি করার জন্য ...
বব

এক্সিকিউটেবলের rootনাম পরিবর্তন করতে আপনার কাছে @ Bob আপনার অ্যাক্সেসের প্রয়োজন হবে sudo। একটি সাধারণ ব্যবহারকারী এটি করতে সক্ষম হবেন না। আমি নোট করেছি যে আপনি যে জাল করতে পারেন যে আপনার অধীনে চলছে sudo। একটি বিদ্যমান প্রোগ্রামটির নতুন নামকরণ কাজ করবে। ডেডিকেটেড জাল sudoপ্রোগ্রামের জন্য প্রয়োজনীয় কোডটি তুচ্ছ।
বিলথোর

আপনি কোথাও থেকে সুডো বাইনারি ডাউনলোড করতে পারেন এবং এটিকে সঠিক অনুমতি দিতে পারেন ...
জেনস টিমর্ম্যান

@ জেনস টিম্মারম্যান এটির সঠিক অনুমতি দেওয়ার জন্য আপনার রুট অ্যাক্সেসের প্রয়োজন। আপনি যদি কেবল এটির নাম পরিবর্তন করতে পারেন বা হার্ড লিঙ্ক করতে পারেন। এটি ডাউনলোড করার দরকার নেই। যদি আপনি এটি কোনও লক্ষ্য ব্যবহারকারী আইডিতে SID ইনস্টল করেন (যদি সেভাবে কাজ করে), আপনাকে ইতিমধ্যে লক্ষ্য ব্যবহারকারী আইডি নিয়ে আপস করতে হবে।
বিলথোর

আহ, ঠিক আছে, এটি নির্ধারিত ছাড়া কাজ করতে অস্বীকার করে, আমার খারাপ ...
জেনস টিমারম্যান

2

আপনি কার্যকর বনাম বাস্তব ব্যবহারকারী আইডি তুলনা করতে পারেন।

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


2
না, sudoকার্যকর এবং বাস্তব আইডি উভয়ই সেট করে। হিসাবে মামলা হিসাবে বিরোধী, যা না। : এখানে একটি তুচ্ছ সি প্রোগ্রাম আপনি (দুঃখিত, মন্তব্য নতুন লাইন মুছে ফেলা হবে, আপনি তাদের পুনরায় জুড়তে হবে করব) পরীক্ষা ব্যবহার করতে পারেন#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
derobert

... বা, বিকল্পভাবে,perl -E 'say $<, "\n", $>'
ডার্বার্ট

2

আপনি কার্যকর ইউআইডি (ইডিইউ) ভেরিয়েবলটি নীচের হিসাবে পরীক্ষা করতে পারেন:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

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

@ স্টেফেনসি - আমি মনে করি যে ওপি-র উদ্দেশ্যে, কোনও পার্থক্য নেই। আইএমএইচও তাদের লক্ষ্য হ'ল সুডো এক্সিকিউশন বা পার্থক্য ছাড়াই একটি খাঁটি রুট শেল থেকে কার্যকর করা execution
ইলিরান মালকা

1
আমি মনে করি আপনি ঠিক থাকতে পারেন। আমি এখানে এসেছি কারণ আমি বুঝতে পারি নি কেন sudo echo $USERঅনিচ্ছাকৃত ব্যবহারকারীর নাম মুদ্রণ করা হয় (সুডোর আগে পরিবর্তনশীলটি প্রতিস্থাপিত হয়)। আমি আসলে আমার স্ক্রিপ্টে আপনার কোডটি ব্যবহার করে শেষ করেছি। ধন্যবাদ!
স্টিফেন সি

সর্বাধিক স্বাগতম :)
এলিরান মালকা

-1

আপনি একটি ফাইল স্পর্শ করতে পারেন /rootএবং তারপরে if -eএটি। এবং যদি -e সত্য হয়, rm(ত্রুটির কোডটি পরীক্ষা করা) এটি তাই আপনার পরের বার পরীক্ষা করে।

আরএম এর পরে ত্রুটি কোড (বা রিটার্ন কোড) যাচাই করা আপনার হাত থেকে একটি প্রংক বাজানোর জন্য ফাইলটি তৈরি করতে সুডো শক্তি ব্যবহার করে কাউকে হাতছাড়া করে।


4
এই উত্তরটি প্রক্রিয়াটিতে লেখার অনুমতি রয়েছে কিনা তা যাচাই করে /root(এটি ইউআইডি 0 এর মতো চলমান নয়) তবে এটি ব্যবহার করে এই অনুমতি পেয়েছে কিনা তা পরীক্ষা করে না sudo
লাদাদাদাদা

হ্যাঁ, "একটি বিড়ালের চামড়ার হাজার উপায়"; আমি যেমন উত্তরটি লিখেছিলাম, আমি আরও 4 বা 5 টি জিনিস ভেবেছিলাম, তাই আমি এটিকে গুটিয়ে রেখেছি।
ক্রিস কে

-2

আমি দেখতে পেয়েছি যে এটি এটির জন্য ভাল কাজ করে

[ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]

আমি ফ্রিবিএসডি, সেন্টোস 7, বা ম্যাকোস এক্স এ চেষ্টা করার পরে এটি কার্যকর হয় না I তবে এই পরিবর্তনটি সত্ত্বেও, এটি এই তিনটির কোনওটিতেই কাজ করে না। "$ ব্যবহারকারী" sudo দ্বারা পুনরায় সেট করা হয়েছে। আপনি কি mean SUDO_USER বলতে চাচ্ছেন? এছাড়াও, আপনার অর্থ "[" "এর পরিবর্তে" [""?
টমঅনটাইম

1
আমি উদাহরণ স্থির। মূলত লগইনউইডের জন্য পরীক্ষা করা 0 এর সমান নয়, তবে ব্যবহারকারী মূল is
ruckc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.