কোনও স্ক্রিপ্টের মধ্যে থেকে মূল অধিকারের অনুরোধ করুন


23

আমি কোনো স্ক্রিপ্ট হিসাবে চালানো পারেন sudo script.shবাpkexec script.sh

স্ক্রিপ্টটি যদি কেবল নাম দিয়ে চালানোর সময় ব্যবহারকারীর কাছে পাসওয়ার্ড চেয়ে থাকে তবে এটি ব্যবহারকারীর দৃষ্টিভঙ্গি থেকে খুব সুন্দর হবে script.sh

আমি কিভাবে "এম্বেড" করার অনুরোধ করতে পারেন pkexecবা sudoরুট বিশেষাধিকার সঙ্গে পুরো স্ক্রিপ্ট চালানোর?

নোট করুন যে sudo sh -cআমার সাথে স্ক্রিপ্টে সমস্ত কিছু চালানো সর্বোত্তম সমাধান হতে পারে না।

উত্তর:


55

এটি কাজ করবে:

echo "$(whoami)"

[ "$UID" -eq 0 ] || exec sudo "$0" "$@"

উদাহরণ:

./test.sh 
blade
[sudo] password for blade: 
root

3
এর মধ্যে যা ভাল তা হল পুনরাবৃত্তি exec- নিজে কল করুন কিন্তু একই সাথে প্রতিস্থাপন প্রক্রিয়া, তাই আমরা স্ক্রিপ্টের একাধিক উদাহরণ উপস্থাপন করি না
সের্গি কলডিয়াজহনি

1
পুনরুদ্ধার পুনরুদ্ধার !!! আমাকে কয়েক দিনের মধ্যে এইটিতে একটি অনুগ্রহ যুক্ত করার জন্য আমাকে স্মরণ করিয়ে দিন!
ফাব্বি

6
এটি করার সময় সচেতন হওয়ার মতো কিছু হ'ল সুবিধাগুলি বৃদ্ধি; মূলত, আপনি যত বেশি কমান্ড রুট হিসাবে চালাবেন তত বেশি কোনও ক্ষতিকারক হ্যাকারের কাছে কোনও রুট অ্যাকাউন্টে অ্যাক্সেস পাওয়ার জন্য কোনও কিছু কাজে লাগানোর সুযোগ রয়েছে। আমি বলছি না যে পুরো স্ক্রিপ্টটিকে মূল হিসাবে চালানো সর্বদা ভুল , তবে আপনি এটি করার আগে এটি সম্পর্কে কিছুটা চিন্তাভাবনা করা উচিত। আমি মনে করি এটি ভাল লাগবে (যদিও প্রয়োজনীয় না হলেও) যদি উত্তরটি তাতে স্পর্শ করে।
ডেভিড জেড

আপনার যদি / etc / sudoers এ একটি শালীন সময়সীমা মান সেট করে থাকে, তবে আপনি স্ক্রিপ্টের প্রতিটি কমান্ডের সামনে sudo রাখতে পারেন যা সত্যিকারের রুট অ্যাক্সেসের প্রয়োজন এবং এটি কেবল একবার জিজ্ঞাসা করবে। একটি জিনিস যা আমি প্রায়শই গোলমাল করি তা হ'ল জিই-র পক্ষ থেকে এই জাতীয় স্ক্রিপ্ট কল করা কার্যকর হবে না কারণ পাসওয়ার্ড ইনপুটটির জন্য sudo / dev / নাল পায় এবং ব্যর্থ হয়। এইগুলি হ্যান্ডেল করার জন্য gksudo এবং kdesudo ডিজাইন করা হয়েছিল কারণ তারা পাসওয়ার্ড জিজ্ঞাসা করতে জিআই ব্যবহার করবে।
জো

1
@ কোডার 256: আপনার সম্পাদনাটি সঠিক ছিল বলে আমি মনে করি না। "$@"একাধিক শব্দে প্রসারিত হবে, প্রতিটি প্যারামিটারের জন্য একটি।
jwodder

12

আপনি যদি একটি সুন্দর সংলাপ চান, এই জাতীয় কিছু চেষ্টা করুন। আমি যা লিখেছিলাম তার থেকে আমি সরাসরি এটি ছিঁড়ে ফেলেছি, সুতরাং এটি আপনার অতিরিক্ত প্রয়োজনের প্রয়োজন বা নাও পেতে পারে, তবে এটি সাধারণ ধারণাটি দেখায়:

brand="My Software"

# Check that the script is running as root. If not, then prompt for the sudo
# password and re-execute this script with sudo.
if [ "$(id -nu)" != "root" ]; then
    sudo -k
    pass=$(whiptail --backtitle "$brand Installer" --title "Authentication required" --passwordbox "Installing $brand requires administrative privilege. Please authenticate to begin the installation.\n\n[sudo] Password for user $USER:" 12 50 3>&2 2>&1 1>&3-)
    exec sudo -S -p '' "$0" "$@" <<< "$pass"
    exit 1
fi

sudo ডায়ালগ

এটি হুইপটেল ব্যবহার করে, যা আপনি ইতিমধ্যে এটি না থাকলে ইনস্টল করতে পারেন:

sudo apt-get install whiptail

1
আপনি কেন ভেরিয়েবলটিতে পাসওয়ার্ড সংরক্ষণ করছেন?
হিমেইল

10
ডাকবেন না exec echo [PASSWORD]! এটি যে কোনও ব্যবহারকারী দেখতে পাবে কমান্ড-লাইনে পাসওয়ার্ড সহ একটি প্রক্রিয়া তৈরি করবে। হয় বিল্ট-ইন কমান্ড ব্যবহার করুন echo(এর সাথে অন্তর্নির্মিত সংস্করণটি জোর করুন builtin echo) বা বাশিজম <<<(যেমন sudo ... <<< "$pass":); এস এবং অন্যান্য শেলগুলির এই মামলার জন্য এখানে নথি রয়েছে । এছাড়াও, পাসওয়ার্ডটিতে বিশেষ অক্ষর রয়েছে তা উদ্ধৃত করুন।
ডেভিড ফোরস্টার

বিকল্পভাবে, whiptailকমান্ডটি একটি পৃথক স্ক্রিপ্টে রাখুন এবং কাস্টম পাসওয়ার্ড প্রম্পটের সাথে ডিল SUDO_ASKPASS=/path/to/askpass-with-whiptail.sh sudo -A -p "My password prompt" -- "$0" "$@"করার মতো কিছু ব্যবহার করুন sudo
ডেভিড ফোস্টার 4

@ ডেভিডফোরস্টার এটি কাজ করতে পারে তবে আপনার তখন দুটি স্ক্রিপ্টের প্রয়োজন হয়, অথবা আপনি একটি অস্থায়ী ফাইলে আপনার অ্যাসপাস স্ক্রিপ্টটি লিখুন এবং তারপরে এটি sudo এ পাস করুন।
মাইকেল হ্যাম্পটন

ঠিক আছে তবে অন্যরা ইতিমধ্যে উল্লেখ করেছে যে কোনও ভেরিয়েবলের পাসওয়ার্ড দেওয়া অপ্রয়োজনীয়। পথ আইডি এই পদ্ধতির যেমন আমি এখানে দেখানো হয়েছে নামে নল করার জন্য ডায়ালগটি আউটপুট পাস হয় askubuntu.com/a/704643/295286
Sergiy Kolodyazhnyy

11

ব্লেড ১৯৮৯৯-এর উত্তর আসলেই যাওয়ার উপায়, তবে কেউ শেবাং এও ডাকতে পারে sudo bash:

#!/usr/bin/sudo bash
# ...

সুস্পষ্ট সতর্কীকরণ এই শুধুমাত্র যতদিন স্ক্রিপ্ট বলা হয় কাজ করবে ./scriptএবং যত তাড়াতাড়ি স্ক্রিপ্ট বলা হয় ব্যর্থ হবে bash script


5
bash scriptস্ক্রিপ্ট শুরু করার জন্য আপনার কখনই কমান্ড লাইনে টাইপ করা উচিত নয় এর একটি কারণ । যদি স্ক্রিপ্টটি লাইনটি ব্যতীত অন্য কিছু নির্দিষ্ট bashকরে #!, তবে এটির সাথে অনুরোধ bash scriptকরা ব্যর্থ হতে চলেছে। যদি আমি bash script.pyএটি ব্যবহার করে একটি অজগর স্ক্রিপ্ট চালু করার চেষ্টা করতাম তবে তা ব্যর্থ হয়।
কাস্পারড

1
আপনি এটি দিয়ে চালাতে পারেন perl script, যদিও। পার্ল, সত্যই সত্যই সুন্দর হওয়ার প্রয়াসে শেবাং লাইনটি পরীক্ষা করে এবং যদি এটি পার্লকে না ডাকছে তবে এটি সঠিক প্রোগ্রামটি চালায়।
tbodt

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

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

6

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

উদাহরণ

#!/bin/sh 
mem=$(free  | awk '/Mem:/ {print $4}')
swap=$(free | awk '/Swap:/ {print $3}')

if [ $mem -lt $swap ]; then
    echo "ERROR: not enough RAM to write swap back, nothing done" >&2
    exit 1
fi

sudo swapoff -a && 
sudo swapon -a

এই স্ক্রিপ্টটি হয় হিসাবে sudo <scriptname>বা হিসাবে চালানো যেতে পারে <scriptname>। উভয় ক্ষেত্রে এটি পাসওয়ার্ডের জন্য একবার জিজ্ঞাসা করবে।


2
এখানে সমস্যাটি হ'ল একাধিক কমান্ড থাকতে পারে যার sudoজন্য রুট অ্যাক্সেসের দরকার পড়ে, যার অর্থ 25 টি পৃথক কমান্ডকে রিলানডেন্টের জন্য কল করা - একবার সুদকে কল করা আরও সহজ। এখানে তবে আপনার স্ক্রিপ্টটি কেবল একবার সুডোকে কল করার কারণটি হ'ল সুডোর 15 মিনিটের মধ্যে সময় রয়েছে - যে কমান্ডগুলির চেয়ে বেশি সময় নেয় তা পুনরায় চাপানো দরকার। আপনার উপায় ঠিক কাজ করে। । । আমার এটি কাজ করার উপায় নয়।
সের্গেই কোলোডিয়াজনি

@ সার্গ একটি ছোট স্ক্রিপ্টের জন্য, আমার যেভাবে ছিল তাড়াতাড়ি এবং সহজ ছিল - আমি সত্যই কোনও মার্জিত প্রোগ্রামার নই!
চার্লস সবুজ

আপনি এই পৃষ্ঠায় সেরা প্রোগ্রামার পোস্টিং। আপনি sudo যেমন ব্যবহার করা উচিত ঠিক তেমন ব্যবহার করছেন - কেবল যেখানে প্রয়োজন সেখানে এবং খুব পরিষ্কার ফলাফল প্রত্যাশিত।
ডগলাস

4

এটি প্রদর্শিত হয় যে অন্য কেউ এখানে সুস্পষ্ট উদ্বেগ মোকাবেলা করেন নি। sudoআপনার স্ক্রিপ্টের মধ্যে রাখলে আপনি বিতরণ করেন যা খারাপ ব্যবহারকারীর অভ্যাসকে প্রচার করে । (আমি ধরে নিচ্ছি আপনি এটি বিতরণ করছেন কারণ আপনি "ব্যবহারকারী দৃষ্টিকোণ থেকে" উল্লেখ করেছেন)

সত্যটি হ'ল অ্যাপ্লিকেশন এবং স্ক্রিপ্টগুলি ব্যবহারের ক্ষেত্রে একটি গাইডলাইন রয়েছে যা ব্যাংকিংয়ের সুরক্ষা নীতির অনুরূপ: আপনাকে যে কোনও ব্যক্তি ফোন করে এবং বলে যে তারা "আপনার ব্যাংক থেকে" ফোন করছে এবং যেটি উপস্থিত রয়েছে তার কাছে কখনও আপনার ব্যক্তিগত তথ্য দিবেন না একই কারণে

অ্যাপ্লিকেশনগুলির জন্য নিয়মটি হ'ল:

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

আপনি যদি নিজের পাসওয়ার্ডটি টাইপ করে থাকেন কারণ আপনি sudoকমান্ড লাইনে দৌড়েছিলেন , দুর্দান্ত। আপনি যদি এটি টাইপ করে থাকেন কারণ আপনি একটি এসএসএইচ কমান্ড চালিয়েছেন, ঠিক আছে। আপনি নিজের কম্পিউটারে লগ ইন করার সময় যদি এটি টাইপ করেন তবে অবশ্যই দুর্দান্ত।

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

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

সুতরাং, আমার এটির নিজস্ব ব্যক্তিগত প্রতিক্রিয়া হ'ল, আপনার স্ক্রিপ্টে রাখা সবচেয়ে ভাল জিনিস যদি এটির মূল সুযোগগুলির প্রয়োজন হয়, তা হ'ল:

#!/bin/bash
[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1;}

# do privileged stuff, etc.

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

@ সার্জি কলোডিএজনি এটি একই রকম, তবে আপনি সরাসরি স্ক্রিপ্টে আপনার পাসওয়ার্ড টাইপ করলে এটি আরও খারাপ। Sudo দিয়ে চালিত একটি স্ক্রিপ্ট এখনও আপনার পাসওয়ার্ড জানে না।
ওয়াইল্ডকার্ড

1

আমি এটি এইভাবে করেছি:

echo -n "Enter password for sudo rights: "
read -s pass

echo $pass | sudo -S [your command here]

4
কমপক্ষে আপনার ভেরিয়েবলগুলি উদ্ধৃত করুন।
মারু

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