বাশে পুনর্নির্দেশ সহ সুডো ব্যবহার করার সময় কীভাবে "অনুমতি অস্বীকৃত" সমাধান করা যায়?


137

ফাইলগুলিতে সম্পাদনাগুলিকে অনুমতি দেওয়ার জন্য sudo ব্যবহার করার সময় আমি নিয়মিত 'অনুমতি অস্বীকার' পাই।

উদাহরণস্বরূপ, আমার মাউস চটজলদি এবং আলস্য, তাই আমি ভোটদান অক্ষম করতে চাই:

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

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

bash: /etc/modprobe.d/local.conf: Permission denied

সুতরাং আমি ব্যবহার করে ভোটদান অক্ষম করার জন্য একটি অস্থায়ী পরিবর্তন করার চেষ্টা করেছি:

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

তবুও সিস্টেমটি এর সাথে প্রতিক্রিয়া জানিয়েছিল:

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

কোন ধারনা?

উত্তর:


156

আউটপুট পুনর্নির্দেশ ( >অপারেটরের মাধ্যমে ) শেল দ্বারা সম্পন্ন হয়, ইকো দ্বারা নয় । আপনাকে রুট হিসাবে লগইন করতে হবে

sudo -i

তারপরে আপনি পুনঃনির্দেশ ব্যবহার করতে পারেন

echo N> /sys/module/drm_kms_helper/parameters/poll

অন্যথায় আপনি sudo দিয়ে বাশ স্ট্রিং চালাতে পারেন

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"

1
আপনি সুডো দিয়ে ইকো চালাতে পারবেন না? আমি কী ফলাফল পেয়েছি:saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
saj89

আপনি ফাইলটিতে লিখতে পারেন, "কিছু" প্রতিধ্বনি> যে কোনওটি। এটি পাইপ ব্যবহার করছে .. এটাই সমস্যা।
শান্তনু

4
ঠিক আছে, যদি এটি হয় তবে দয়া করে আপনার উত্তরটি আপডেট করুন যে প্রতিস্থাপন প্রতিধ্বনি কেবল সেই ক্ষেত্রেই একটি সমস্যা।
saji89

আপনি echoসুডো হিসাবে খালি বিল্টিনটি সহজেই চালাতে পারবেন না , যদি না আপনি এর মতো কিছু করেন sudo bash -c 'echo …'; তবে, পসিক্স সিস্টেমগুলি সাধারণত ওএস এক্স-এর echoমতো একটি বাহ্যিক কমান্ড সরবরাহ /bin/echoকরে, যা sudo rigamarol ছাড়াই সম্পাদন করতে পারে। সুতরাং, echoআপনি কমান্ডটি সাধারণত চালান এবং আপনি যে echoকমান্ডটি sudo দিয়ে চালাচ্ছেন তা সম্ভবত দুটি ভিন্ন, তবে একই রকম কমান্ড।
কোজিরো

যদি তা হয় তবে এই প্রশ্নের উত্তরগুলি কেন প্রতিধ্বনিত করেছিল? জিজ্ঞাসাবাবু / প্রশ্ন
হর্ষ

75

আউটপুট ফেরৎ শেল দ্বারা সম্পন্ন করা হয় যেখান থেকে কমান্ড উচ্চারণ করা হয়েছে । সুতরাং, বিটগুলিতে বিভক্ত হয়ে এখানে যা ঘটছে *:

  • শেল ডাকে sudo echo "options drm_kms_helper poll=N", যা কমান্ড লাইনের sudoসাহায্যে echo "options drm_kms_helper poll=N"কমান্ড কার্যকর করে exec

  • sudo একটি পাসওয়ার্ড জিজ্ঞাসা করে, সুপারসেলার শেলটি খোলে এবং অনুরোধ করে echo "options drm_kms_helper poll=N", যা echoএটি পাস করার কমান্ড চালায়"options drm_kms_helper poll=N"

  • প্রতিধ্বনি সহ চলমান প্রতিধ্বনি rootতার স্ট্যান্ডার্ড আউটপুটটিতে স্ট্রিংটি মুদ্রণ করে।

  • echoকমান্ড সমাপ্ত হয়, সুপারসার শেল প্রস্থান করে, sudoসমাপ্ত হয়

  • যে শেল থেকে কমান্ডটি আহ্বান করা হয়েছে তা আউটপুট সংগ্রহ করে এবং এটিকে পুনর্নির্দেশের চেষ্টা করে /etc/modprobe.d/local.conf, যা কেবল রুট দ্বারা লিখনযোগ্য। এটি "অনুমতি অস্বীকৃত" ত্রুটি পায়।

এটি ঠিক করার উপায়গুলি দেখুন @ শান্তনু উত্তর।


(*) - যদিও উপরের ক্রমটি কমান্ডটি ব্যর্থ হয় তা বুঝতে সহায়তা করে, বাস্তবে কিছু কিছু অ-অফ-অর্ডার হয়: মূল শেলটি পুনঃনির্দেশটি লক্ষ্য করে এবং sudo ...কমান্ডটি চাওয়ার আগে লেখার জন্য ফাইলটি খোলার চেষ্টা করে । ফাইলটি খোলার সময় ব্যর্থ হয়ে শেলটি সেই কমান্ডটিও প্রার্থনা করে না যা ফাইলটিতে লেখার কথা ছিল (এটি নির্দেশ করার জন্য @ পানসরোন্টোগিয়ানিসকে ধন্যবাদ))

এখানে একটি দ্রুত পরীক্ষা:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

উপরের পরীক্ষায় "রুট" শব্দটি যুক্ত whoami | tee who.txtএকটি ফাইল তৈরি করতে যাচ্ছিল who.txt। যাইহোক, যখন কলিং শেলটিতে আউটপুট পুনর্নির্দেশটি ব্যর্থ হয়, তখন "who.txt" ফাইলটিও অনুপস্থিত কারণ কমান্ডটি চাওয়া হয়নি।


সম্ভবত শেল নিজেই 'কাঁটাচামচ' হয়ে যায় এবং 'এক্সিকিউটিভ' সুডোর চেষ্টা করার আগে /etc/modprobe.d/local.conf খোলার চেষ্টা করে যার অর্থ যে আপনার বর্ণিত প্রথম 4 টি ধাপ আসলে কখনই ঘটে না কারণ ফাইলটি খোলার উপায় নেই।
প্যানোস রন্টোগিয়ানিস

1
@ পানসরন্টোগিয়ানিস: ধন্যবাদ, আমি উত্তরটি আপডেট করেছি
সের্গে

60

শান্তনুর জবাব যোগ করা:

... অথবা আপনি teeএই জাতীয় আদেশ ব্যবহার করতে পারেন :

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

বা যদি এটি একটি কমান্ডের আউটপুট:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

3
মূল হিসাবে +1 লগ ইন করা ম্যানুয়াল কাজের জন্য একটি খারাপ ধারণা, এবং স্ক্রিপ্টযুক্ত কার্যগুলির জন্য সত্যই একটি খারাপ ধারণা।
l0b0

2
এছাড়াও, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/nullআপনি যদি এটিও মুদ্রণ করতে চান না stdout
ফ্যাবিয়ান ট্যাম্প

16

যে পদ্ধতির বিষয়টি আমি এখানে উল্লেখ করি নি তা হ'ল সম্পূর্ণ কমান্ডলাইনটিকে কেবল নিজের শেলের মধ্যে চালানো। sudoর manpage নিজেই এই পদ্ধতির একটি উদাহরণ দেয়:

/ Home পার্টিশনে ডিরেক্টরিগুলির ব্যবহারের তালিকা তৈরি করতে। নোট করুন যে এটি সিডি এবং ফাইল পুনর্নির্দেশ কাজ করতে একটি সাব-শেলের কমান্ডগুলি চালায়।

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

ওহ ধন্যবাদ. একটি সহজ সমাধান
স্থিতিস্থাপকতা

4

আরেকটি বিকল্প হ'ল অস্থায়ী ফাইল ব্যবহার করা। এটি ব্যাশ স্ক্রিপ্টে দরকারী।

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever

3

sudo dd of=

আপনি যেমন চান সংযোজন:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

বা স্ক্র্যাচ থেকে ফাইলটি পুনরায় তৈরি করতে:

echo inbytes | sudo dd of=outfile

সুবিধাদি:

  • teeকোনও /dev/nullপুনঃনির্দেশের চেয়ে ভাল
  • shসুস্পষ্ট সাবসেল না হওয়ার চেয়ে সুন্দর (তবে পুনঃনির্দেশের জন্য একটি অন্তর্ভুক্ত)
  • ddঅনেক শক্তিশালী বিকল্প রয়েছে, যেমন status=progressস্থানান্তর অগ্রগতি দেখতে

কাজ করে কারণ সুডো স্ট্যান্ডিনকে কমান্ডে ফরোয়ার্ড করে।


1
এটা ভাল. আমরা ddকীভাবে আমাদের একক-দুর্দান্ত ফাইল সিস্টেমগুলি ওভাররাইট করে ফেলি এবং এটি বুঝতে পারি না যে এটি জাগতিক কাজগুলির জন্যও - এবং রুট হিসাবে অন্যান্য কমান্ডগুলিও যদি ভুল ফাইল / ডিভাইসগুলিতে ব্যবহার করা হয় তবে এটি প্রচুর ক্ষতি করতে পারে। পছন্দ করুনsudo tee , sudo ddঅবশ্যই এখানে স্ট্রিংগুলির সাথেও কাজ করবে , যেমন sudo dd of=outfile <<<'hello world',। [সম্পাদনার জন্য ধন্যবাদ। এনবি সহ sh -c 'cmd', shএটি একটি উপশহর যা শেল, তবে সমস্ত বাহ্যিক কমান্ড এক হিসাবে শুরু হওয়া অর্থে ব্যতীত সত্যই সাবস্কেল নয় ]]
এলিয়াহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.