শুধুমাত্র একবারে পাসওয়ার্ড প্রবেশ করিয়ে সুদো হিসাবে কোনও স্ক্রিপ্টের অংশগুলি চালান


14

আমি একটি স্ক্রিপ্ট লিখছি (আসলে স্ক্রিপ্ট এবং মেকফিলের সংমিশ্রণ) যা বাহ্যিক নির্ভরতা ইনস্টল করে: কিছু apt-getআদেশ, কিছু gitক্লোনিং, বিল্ডিং, ইনস্টল, ব্যবহারকারীদের গোষ্ঠীতে যুক্ত করা, ...

এই স্ক্রিপ্টগুলির কিছু ক্রিয়াকলাপের জন্য সুপারসারের অনুমতি প্রয়োজন হয়, কারও কারওর প্রয়োজন নেই।

এখন অবধি আমি সুডো দিয়ে পুরো মেক প্রক্রিয়াটি চালিয়েছি তবে এর কিছু ত্রুটি রয়েছে:

  • gitরেপোস rootহিসাবে আমি মালিক হিসাবে পেতে ক্লোন করেছি , যার অর্থ আমি পরে sudoবা তাদের ছাড়া তাদের সংশোধন করতে পারি নাchown
  • স্ক্রিপ্ট গোষ্ঠীতে ব্যবহারকারীদের যুক্ত যা ব্যবহারকারী থেকে যোগ করার জন্য জানি না whoamiআয়root

কেবলমাত্র সুপারিশ হিসাবে চালিত হওয়ার সর্বোত্তম উপায়টি যা কেবল এটির প্রয়োজন হয়? আদর্শভাবে প্রক্রিয়াটির জন্য এখনও আমার sudoপাসওয়ার্ডটি প্রবেশ করানো দরকার তবে ইনস্টল প্রক্রিয়াটির একেবারে প্রথম দিকে once এটি তখন একেবারে শেষের দিকে ভুলে যাবে তবে ততক্ষণ পর্যন্ত এটি রাখুন (এটি বেশ কয়েক ঘন্টা সময় নিতে পারে)।

আমি অনলাইনে যে সমাধানগুলি পেয়েছি সেগুলির মধ্যে রয়েছে:

  • sudo -vস্ক্রিপ্টের সূচনায়, তবে আমি যদি এই সময়টি সঠিকভাবে বুঝতে পারি। আমার স্ক্রিপ্ট কয়েক ঘন্টা চলতে পারে
  • সঙ্গে স্ক্রিপ্ট চালাতে sudo, কিন্তু কমান্ড যে কি না সঙ্গে সুপার-ইউজার প্রয়োজন sudo -u $(logname) <command>। আমি এখন এটিই করি তবে এটি অন্যরকম হওয়া উচিত বলে মনে হয়।

আদর্শভাবে, আমি আমার স্ক্রিপ্টটি চাই:

  1. সুপারিশারের শংসাপত্রগুলির জন্য জিজ্ঞাসা করুন
  2. লগ ইন করা ব্যবহারকারী হিসাবে সাধারণ কমান্ডগুলি চালান
  3. পদক্ষেপ 1 এ প্রবেশ করা শংসাপত্রগুলির সাথে sudo কমান্ডগুলি চালান
  4. sudo -k সুপারউসার সেশন বন্ধ করতে

2
আপনি এখনও সুডো হিসাবে সমস্ত কিছু চালাতে পারেন এবং আপনার স্ক্রিপ্ট SUDO_USERপরিবেশ পরিবর্তনশীল চেক করতে পারে। যদি উপস্থিত থাকে তবে এটিতে সুডো ব্যবহারকারীর ব্যবহারকারীর নাম থাকবে। সুতরাং আপনি (রুট হিসাবে) own SUDO_USER: U SUDO_GID $ আপনার_ফায়ালগুলি ছেঁকে দিতে পারেন। একইভাবে, আপনি এই ভেরিয়েবলগুলি পরীক্ষা করতে পারেন যাতে আপনার অ্যাডুজার কমান্ডগুলি জানতে পারে যে কোন ব্যবহারকারী যুক্ত করা উচিত।
রোডম্রি

... বা রুট হিসাবে সবকিছু su $SUDO_USER -c commandচালান এবং সাধারণ ব্যবহারকারীর মতো কমান্ড ব্যবহার করুন।
রোমানো

উত্তর:


7

আপনার যেহেতু সুডো অ্যাক্সেস রয়েছে, নিজের জন্য একটি sudoers ফাইল তৈরি করুন, তারপরে স্ক্রিপ্টটি হয়ে গেলে এটি মুছুন:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

2

ওয়ান ওয়ে, আমি সাধারণত না করার পরামর্শ দিচ্ছি, পাসওয়ার্ড নিজের পড়া, এবং ব্যবহার sudoএর -Sহিসাবে এবং প্রয়োজন হলে বিকল্প পাসওয়ার্ড পাস:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

থেকে man sudo:

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.

1
এটা কি নিরাপদ? echo "$password"??
αғsнιη

@ ক্যাসিয়াএ echo "$password"হবে না তবে হেরিডোকস এবং হেরস্ট্রিংস কিছুটা বেশি নিরাপদ। সাধারণ সরঞ্জামগুলি দ্বারা প্রদর্শিত কমান্ড লাইনে এগুলি দৃশ্যমান নয়।
মারু

1
আমি মনে করি, যথাযথ ভাবে বললে echo "$password"উপর একটি নল বামদিকে হয় একটি ব্যাশ স্ক্রিপ্টের মধ্যে নিরাপদ। echoএটি একটি শেল বিল্টিন; /bin/echoযখন এটি সরলভাবে বলা হয় তখন চলবে না echo ...। অন্য কয়েকটি শেলের একটি echoবিল্টিন রয়েছে ( dashউদাহরণস্বরূপ), তবে বোর্ন-স্টাইলের শেলগুলি রাখার দরকার নেই । সুতরাং আমি মনে করি echo "$password" |বাশে গ্রহণযোগ্য হবে তবে সমস্যাটি নজরে না রেখে কেউ যদি অন্য শেলটিতে স্ক্রিপ্টটি পোর্ট করে তবে সে ক্ষেত্রে সর্বোত্তম এড়ানো যেতে পারে। আমি একটি অ-পোর্টেবল ব্যবহার [[পরিবর্তে [মধ্যে স্ক্রিপ্টটি সমস্যা একই সাজানোর এড়াতে। @ ক্যাসিয়া
এলিয়াহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.