ব্যাশ স্ক্রিপ্টে sudo ব্যবহার করার সর্বোত্তম অনুশীলন


11

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

আমি কিছু পদ্ধতি নিয়ে এসেছি, তবে তাদের প্রত্যেকেরই কিছু সমস্যা আছে

পদ্ধতি 1: ফাইলের অভ্যন্তরে sudo ব্যবহার করা

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

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

পদ্ধতি 2: ফাইল কল করতে sudo ব্যবহার করে এবং তারপরে যখন প্রয়োজন হয় তখন মূল ব্যবহারকারীটিতে ফিরে আসুন

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

এটিও স্তন্যপান করে, কারণ আমার su username -cপ্রায় প্রতিটি লাইনের সামনে যোগ করা দরকার । এছাড়াও আসল ব্যবহারকারীর নাম সন্ধান sudoকরা সম্ভব তবে জটিল।

একটি ভাল উপায় আছে কি?

সম্পাদনা: আমি কী বলছি তা দেখাতে আমি এখানে কেবলমাত্র ছোট, অযৌক্তিক স্ক্রিপ্টগুলি পোস্ট করেছি। প্রকৃত স্ক্রিপ্টে আমার কয়েকটি লাইন রয়েছে যার জন্য সুডো (পরিষেবাগুলি শুরু করা এবং বন্ধ করা) দরকার রয়েছে, কিছু লাইন যেখানে সুডো রয়েছে তাতে কিছু আসে যায় না এবং বেশ কয়েকটি লাইনই সত্যই সুডো ছাড়া চালানো দরকার।


4
এটি খুব কমই প্রয়োজন হয়। বেশিরভাগ ক্ষেত্রে, আপনি sudoযদি স্ক্রিপ্টটিকে উচ্চতর অনুমতির প্রয়োজন হয় তবে এটি চালান । তবে su username -cএকটি চালাতে স্যুইচ করার কোনও মানে নেই echo। অন্য কথায়, এটি [XY] এর মতো শোনাচ্ছে। আপনি কী সম্পাদনা করতে এবং ব্যাখ্যা করতে পারবেন যে আপনার স্ক্রিপ্টটি আসলে কী করবে এবং আপনি কেন এত ঘন ঘন ব্যবহারকারীদের স্যুইচিংয়ের প্রয়োজন মনে করেন?
টেরডন

1
@ এল্ডারগীক আপনি কি ভুল লিঙ্কটি পেস্ট করেছেন? এমনকি এটি সম্পর্কিত বলে মনে হয় না। এটি সম্ভবত একটি স্ক্রিপ্টের মধ্যে আমি কীভাবে 'sudo' কমান্ড চালাব? তবে আমি আশা করি ওপি আরও কিছুটা ব্যাখ্যা করতে পারে।
টেরডন

@terdon এটা মনে হবে। পরিষ্কার আপ.
বয়স্ক

এটি কেবল একটি উদাহরণ স্ক্রিপ্ট। আমি এখানে 200+ লাইনের স্ক্রিপ্টটি আটকাতে চাইনি। আমি আরও বিশদ জন্য উত্তর সম্পাদনা করব।
ডাকারন

আপনি কি বৈধতা বিকল্পটি বিবেচনা করেছেন, যা বর্ণিত হয়েছে man sudo? -v, --validate 'ব্যবহারকারীর ক্যাশেড শংসাপত্রগুলি আপডেট করুন, প্রয়োজনে ব্যবহারকারীকে প্রমাণীকরণ করুন। সুডোয়ার্স প্লাগইনের জন্য এটি ডিফল্টরূপে আরও 15 মিনিটের জন্য সুডোর সময়সীমা প্রসারিত করে তবে কোনও কমান্ড চালায় না। সমস্ত সুরক্ষা নীতিগুলি ক্যাশেড শংসাপত্রগুলিকে সমর্থন করে না '' (আপনি যদি এটি প্রায়শই চালান তবে সুডো প্রমাণীকরণের সময়সীমা শেষ হওয়া উচিত নয়))
সুডোডাস

উত্তর:


5

পদ্ধতি 2 সম্পর্কিত, কোনও ফাংশন ব্যবহার করা সহজ। উদাহরণ স্বরূপ:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERsudoer এর ব্যবহারকারীর নাম। আপনি $(logname)তার জায়গায় ব্যবহার করতে পারেন ।

আমার মেশিনে চলছে:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

পড়া দ্বারা man sudoers, একটি দেখতে:

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

সুতরাং, আপনি regularহোস্টের machine1সাথে পাসওয়ার্ড প্রমাণীকরণ ছাড়াই , নির্ধারণ করতে command1এবং command2রুট হিসাবে অনুমতি দিতে পারেন :

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

তবে man -k sudoবিশদগুলির জন্য প্রতিটি পড়ুন ।


0

হতে পারে এটি সাহায্য করতে পারে:

chmod 775 thycript.sh

তারপরে আপনি স্ক্রিপ্টের অভ্যন্তরে sudo ব্যবহার করতে পারেন (পাসওয়ার্ড প্রম্পট ছাড়াই) এবং আপনার স্ক্রিপ্টের ভিতরে অন্যান্য কমান্ডের জন্য sudo ব্যবহার করতে পারবেন না।


আমি ভয় করি যে কাজ করে না। chmod 775কেবলমাত্র আপনাকে ফাইলটি কার্যকর করতে অনুমতি দেয় এবং ফাইল বা তাদের অধিকার নির্বাহকারী ব্যবহারকারীকে পরিবর্তন করেন না।
ডাকারন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.