আমি কীভাবে কোনও স্ক্রিপ্টের মধ্যে 'সুডো' কমান্ড চালাব?


84

একটি প্যাচ নিজে হাতে করতে আমাকে অবশ্যই এই আদেশটি টাইপ করতে হবে

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

09 এর ঠিক আগে একটি জায়গা আছে:

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

আমি কীভাবে এটি কোনও স্ক্রিপ্টের মধ্যে চালাতে পারি?

এছাড়াও বেশ কয়েকটি অন্যান্য কমান্ড রয়েছে তবে এটি একটি সমস্যা দিচ্ছে।


2
শুধু স্ক্রিপ্টে রেখেছি, সমস্যা কী?
মিথ্যা রায়ান

6
@ লাইরিয়ান - sudo পাসওয়ার্ড - স্ক্রিপ্ট কেউ প্রবেশ করার জন্য সেখানে না থাকলে পুরোপুরি চলতে সক্ষম হবে না।
উইলফ

আমার সিস্টেমটি প্ররোচিত না করে কেবল তাদের সূক্ষ্মভাবে চালায়। অক্টোবর 2017 এ উবুন্টু 16.04 You আপনি আপনার sudoersসেট আপটি গোলযোগ করেছেন। কোন ব্যাপারই না. এটি ঠিক করা প্রয়োজন।
এসডসোলার

1
@ এসডসোলার আপনার সিস্টেমটি এমন একটি যা গণ্ডগোল করেছে; এটি পাসওয়ার্ডের জন্য অনুরোধ না করার একটি সামান্য সুরক্ষা দুর্বলতা (ব্যবহারকারীদেরকে কিছু ধরণের সামাজিক প্রকৌশল আক্রমণে আরও ঝুঁকিপূর্ণ করে তোলে)।
wizzwizz4

উত্তর:


107

sudoস্ক্রিপ্টগুলির ভিতরে থাকা খুব কমই ভাল ধারণা । পরিবর্তে, sudoস্ক্রিপ্ট থেকে অপসারণ করুন এবং স্ক্রিপ্ট নিজেই দিয়ে চালান sudo:

sudo myscript.sh

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

sudo -u username command 

স্থানটি অপ্রাসঙ্গিক, এটি কোনও কিছুর উপর প্রভাব ফেলবে না, একটি আদেশ এবং এর তর্কগুলির মধ্যে সর্বদা একটি স্থান থাকে।


30
স্ক্রিপ্টে কমান্ড থাকতে পারে যার মূল অনুমোদনের প্রয়োজন নেই, আপনি sudo -u ব্যবহারকারীর নাম ব্যবহার করে এই আদেশগুলির জন্য অস্থায়ীভাবে মূল অধিকারটি ফেলে দিতে পারেন
লাই রায়ান

48
আমি লিখিত প্রচুর স্ক্রিপ্টগুলি ব্যবহারকারীর মিথস্ক্রিয়া এবং / বা ত্রুটি পরীক্ষা করার পুরো গোছা করে। তারপরে একটি কমান্ড শেষে - rsync এর মতো কিছু - মূল হিসাবে চালানো দরকার। আমি কেন পুরো জিনিসটিকে উন্নত করে চালাতে এবং কোডের অনেকগুলি লাইনে নিজেকে খোলা রেখে দিতে চাই যেগুলি রুট অ্যাক্সেসের সাথে গুরুতর ত্রুটি বা দুর্বলতা থাকতে পারে - বিশেষত ডিবাগিংয়ের সময় - যখন কেবল একটি বা কয়েকটি আদেশের জন্য এই অ্যাক্সেসের প্রয়োজন হয়?
জো

2
@ জো মোটামুটি "কখনই ভালো ধারণা" তে "কদাচিৎ" পরিবর্তন করে।
টেরডন

10
@ জো এখানে সত্যিই একটি ভাল পয়েন্ট আছে। এছাড়াও যখন কেউ বলে না যে এটি করবেন না, তবে ঠিক তা কেন, বা কমপক্ষে, কোন প্রসঙ্গে আমি তা না করা উচিত তা
জানলে ভাল লাগবে

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

41

আপনি সম্ভবত sudoersফাইলটি পরিবর্তন করতে পারেন ।

চালান sudo visudo

আপনার ব্যবহারকারীর নাম এবং স্ক্রিপ্টের জন্য একটি এন্ট্রি যুক্ত করুন যা আপনি পাসওয়ার্ডের জন্য জিজ্ঞাসা না করে চালাতে চান।

username ALL=(ALL) NOPASSWD: /path/to/script

2
আমার পক্ষে কাজ করেনি, তবে ধন্যবাদ, এটি বিদ্যমান তা জানতে পেরে ভাল। সম্ভবত আমি সিনট্যাক্সটি ভুল পেয়েছি।
ক্রিস কে

5
কেউ এটি উল্লেখ করেছেন তা নিশ্চিত নয়, তবে sudoersফাইলটি সম্পাদনা করার পরে আপনাকে অবশ্যই সেই ব্যবহারকারীর সমস্ত লগইন সেশন শেষ করতে হবে ।
Escape-llc

1
এখানে কেবল স্পষ্ট করার জন্য এটি স্ক্রিপ্ট নয় যা "sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql" লাইনটি sudoers ফাইলে নির্দিষ্ট করা উচিত তবে প্লেব্যাক_ডিলিট_ডাটা_প্যাচ.শ স্ক্রিপ্ট বা আপনার যে ব্যবহারকারী এবং / অথবা তাদের চাইলে অন্য কমান্ড চান স্ক্রিপ্টগুলি কোনও পাসওয়ার্ড উল্লেখ না করে sudo মাধ্যমে চলতে সক্ষম হবে।
এমটিটি জোকি

19

আপনি এরকম কিছু চেষ্টা করতে পারেন:

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

আপনি সরল পাঠ্যে একটি sudoer পাসওয়ার্ড লেখার কারণে এটি করা সবচেয়ে সুরক্ষিত জিনিস নয়। এটিকে কিছুটা আরও সুরক্ষিত করতে আপনি একটি ভেরিয়েবল তৈরি করতে পারেন এবং ভেরিয়েবলের মধ্যে সুডো পাসওয়ার্ডটি পড়তে পারেন এবং তারপরে আপনি কমান্ডটি কার্যকর করতে পারেন:

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

এছাড়াও, আপনি যদি আপনার সমস্ত কমান্ডগুলি রুট হিসাবে সম্পাদন করতে আপত্তি না করেন তবে আপনি sudoআগে পরামর্শ হিসাবে আপনার স্ক্রিপ্টটি কার্যকর করতে পারবেন ।

sudo ./myscript

নিরাপদে ভেরিয়েবলে পাসওয়ার্ড পড়া:read -s PASSWORD
টোবিয়াস উহমান

10

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

তবে আপনি যদি কিছু কমান্ডের কাছে রুট সুবিধাগুলি ফেলে দিতে চান এবং কমান্ডটি ব্যবহার করে এমন প্রকৃত ব্যবহারকারী হিসাবে চালিত করতে চান তবে আপনি আসল ব্যবহারকারীর সন্ধান sudoকরতে $SUDO_USERভেরিয়েবলটি পরীক্ষা করতে পারেন ।

আপনি কীভাবে এটি অর্জন করতে পারলেন এটি একটি উদাহরণ স্ক্রিপ্ট:

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want running as root would be invoked
# with: sudo -u $real_user
# So they will be run as the user who invoked the sudo command
# Keep in mind if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command

4

এটি করার একটি খুব সহজ উপায় আছে। বহনযোগ্যতার জন্য, এটি আমার বাস্তবায়ন তবে আপনার প্রয়োজন অনুসারে এটি নিরবচ্ছিন্ন মনে করুন feel

স্ক্রিপ্ট শুরু করার সময় আপনার সুডো পাসওয়ার্ডটিকে প্যারামিটার হিসাবে প্রবেশ করুন, এটি ক্যাপচার করুন এবং প্রতিটি কমান্ডের সাথে এটি প্রতিধ্বন করুন যা সুডো পাসওয়ার্ডের জন্য অনুরোধ করবে।

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>

স্ক্রিপ্টটি এভাবে সরিয়ে দেওয়ার পরে আপনি একটি প্রম্পট যুক্ত করতে এবং ক্যাপচার করতে পারেন:

echo "enter the sudo password, please"
read PW

তবে অন্য কেউ নোডে কী চলছে তা পর্যবেক্ষণ করে; এটি দ্বারা নির্মিত লগ অ্যাক্সেস আছে; বা আপনি যখন পরীক্ষা চালাচ্ছেন তখন এলোমেলোভাবে আপনার উচিত দেখাচ্ছেন, এটি সুরক্ষার সাথে আপস করতে পারে।

এটি চলমান কমান্ড / স্ক্রিপ্টগুলির সাথেও কাজ করে যার জন্য চালিয়ে যাওয়ার জন্য হ্যাঁ দরকার:

echo $PW | yes | ./install.sh

প্রতিধ্বনি একটি প্রম্পটের প্রতিক্রিয়া হিসাবে, যাতে আপনি নিজের প্রয়োজন মতো কিছু ব্যবহার করতে পারেন, যদি আপনি অন্যান্য স্ক্রিপ্টগুলি চালাচ্ছেন যা ক্রমানুসারে ক্রম প্রগতির জন্য প্রম্পট রয়েছে। নিশ্চিত হয়ে নিন যে আপনি সেই আদেশটি জানেন, তবে বা খারাপ কিছু ঘটতে পারে।


এটি এত বেশি মার্জিত এবং সাধারণ, আমি খুশি যে আমি সমস্ত দিক দিয়ে স্ক্রোল করেছি! সম্পাদনা: অপেক্ষা করুন, এটি আমার টার্মিনালের ইতিহাসে পাসওয়ার্ড যুক্ত করবে
কাজ

1
কীভাবে ব্যবহারকারীর নাম / পাসওয়ার্ডের জন্য জিজ্ঞাসা করতে হবে read: ryanstutorials.net/bash-scriptting-tutorial/bash-input.php এই সমস্যাটি এড়ানো উচিত
জব

3
#!/bin/bash
# this declares that current user is a sudoer
sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
sudo npm install hexo-cli -g
mkdir Untitled
sudo apt-get install python

# then to remove the sudo access from the current user
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

0

আপনি যে ব্যবহারকারীকে sudoers ফাইলে স্ক্রিপ্টটি চালান তারা যুক্ত করার চেষ্টা করতে পারেন:

#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm

sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm

সাধারণত এটি একটি দুর্বল পদ্ধতি। আপনি যদি NOPASSWD sudo বিধি যুক্ত করতে চলেছেন, বিশেষত অটোমেশন চালিত অ্যাকাউন্টগুলির জন্য, আপনার সর্বনিম্ন তাদের চালানো ঠিক কমান্ডের (এবং সমস্ত নয়) সীমাবদ্ধ করা উচিত
ক্রিস্টোফার হান্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.