একটি সুডোর সাথে কমান্ডের একটি লাইন কার্যকর করুন


21

উদাহরণস্বরূপ যদি আমি একটি ফাইল তৈরি করতে চাই এবং এক লাইনে পাঠ্য লিখতে চাই তবে আমি >অপারেটরের ব্যবহারের সাথে একটি ফাইলের আউটপুটটিকে পুনর্নির্দেশ করতে পারি :

echo "something" > /path/foobar

তবে যদি আমার ফোল্ডারে অ্যাক্সেস না থাকে /path/এবং সুডো প্রাইভেলিজ দরকার হয় তবে সুডো রাইটস সহ সাধারণ ব্যবহারকারীর মতো এই একই কমান্ডটি আমি কীভাবে অর্জন করতে পারি?

আমি চেষ্টা করেছিলাম

sudo echo "something" > /path/foobar

কিন্তু যে কাজ না করে, কারণ উবুন্টু শুধুমাত্র গন্য editকিন্তু এই অংশের জন্য না
এর>

অবশ্যই, আমি এর আগে রুট হয়ে উঠতে পারি sudo suবা teeপরিবর্তে ব্যবহার করতে পারি:

echo "something" | sudo tee /path/foobar

তবে আমি এমন একটি সমাধান খুঁজতে চাই যেখানে আমি প্রতিস্থাপন হিসাবে শেষ লাইনের সাথে কাজ করতে পারি

sudo !!

শেষ লাইনে "পুনর্ব্যক্ত" করার উপায় নেই এবং কেবল sudoসামনে যুক্ত করা যায়?



এটি কোনও সদৃশ নয়। আমি আসল Qeustion আহরণ এবং শিরোনাম পরিবর্তন। এখন এটি যা আমি সত্যিই সন্ধান করছি
রুব্বো

এটি অবশ্যই একটি সদৃশ ছিল , তবে এটি এখন কিছুটা আলাদা। আমার কাছে দেখে মনে হচ্ছে আপনি বুগির উত্তরের আলোকে প্রশ্নটি পুনরায় লিখেছেন, যা ভাল - এটি একটি ভাল উত্তর। আমি আমার ঘনিষ্ঠ ভোট প্রত্যাহার করেছি, তবে এটি এখনও অনিবার্য (লোকেরা প্রায়শই ইস্যুটির দিকে মনোযোগ না দিয়ে প্রশ্ন ঘনিয়ে যাওয়ার পরে স্বয়ংক্রিয়ভাবে ভোট দেয়): একটি মন্তব্য বন্ধ করুন যখন এটি গোল্ডলোকস বন্ধ হয়ে যাবে এবং আমি আবার খুলতে ভোট দেব । তুমিও আপনার ক্ষেত্রে আত্মসমর্থন করতে চ্যাট যে এরকম একবার।
সোনারলোকস

উত্তর:


13

আপনি কেবল sudoশেল কমান্ডের সামনে আটকে থাকতে পারবেন না , সেই আদেশটি পুনরায় মূল্যায়নের জন্য আপনাকে শেলটি চাপতে হবে (ভেরিয়েবল প্রসারিত করা, পুনর্নির্দেশ অপারেটরগুলির জন্য ফাইল খোলার মতো কাজ করা ইত্যাদি)। তাই যে

sudo bash -c !!

ব্যতীত এটি বেশ কার্যকর হয় না, কারণ !!পূর্ববর্তী কমান্ডের পাঠ্য, বিশেষ অক্ষর এবং সমস্তগুলিকে বিভক্ত করে। আপনাকে কমান্ডের পাঠ্যটি স্ট্রিং হিসাবে পুনরুদ্ধার করতে হবে এবং এটি একটি আর্গুমেন্ট হিসাবে পাস করতে হবে sh। সৌভাগ্যবসত, ব্যাশ এর fcbuiltin আপনি that¹ করতে দেয়।

sudo bash -c "$(fc -ln -1)"

বা এমনকি, বর্তমানে চলমান ব্যাশের একই সংস্করণটি আহ্বান করতে ভুলবেন না:

sudo "$BASH" -c "$(fc -ln -1)"

নোট করুন যেহেতু কমান্ডটি একটি পৃথক শেল প্রক্রিয়াতে কার্যকর করা হয়, এটি পরিবেশের ভেরিয়েবল (কেবলমাত্র sudoমনের সংরক্ষণ করে) প্রাপ্ত হয়, তবে শেলটি অভ্যন্তরীণ ভেরিয়েবলগুলি নয়। শেল বিকল্পগুলি (উদাঃ kshglob) এবং অন্যান্য সেটিংস ডিফল্ট থেকে শুরু হবে।

একই কমান্ড- zsh এবং ksh- এ কাজ করে, যদিও এটিটি ksh93 এর জন্য উভয় firstএবং lastসংখ্যা উভয়ই fc³ (যা বাশ, zsh এবং pdksh / mksh তেও কাজ করে) পাস করতে হবে :

sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"

$0চলমান শেলটির এক্সিকিউটেবলকে মনোনীত করতে ব্যবহার করা কেবল তখনই কাজ করে যদি শেলটি $ PATH এবং $ PATH- র মাধ্যমে পরিবর্তিত হয় না বা কোনও পরম পথের মধ্য দিয়ে ডাকে।

এখানে zsh এর আরেকটি পদ্ধতি যা সামান্য পরিষ্কার তবে লম্বা:

sudo zsh -c $history[$[HISTCMD-1]]

সতর্কতার একটি চূড়ান্ত শব্দ: sudoসম্ভাব্য বিপজ্জনক আদেশের জন্য। এটি ব্যবহার করা খুব সহজ করবেন না!

The শুরুতে কিছু অতিরিক্ত শ্বেতস্থান রয়েছে এবং কমান্ড প্রতিস্থাপনটি শেষে নতুন লাইনের বাইরে চলে যায়, তবে শেলটির বাক্য গঠনটি সেটির জন্য পাত্তা দেয় না।
² আমি মনে করি না zsh বা ksh এর বাশের মতো কিছু আছে $BASH; $0কেবল তখনই কাজ করে যখন এটি একটি পরম পাথ, বা যখন এতে কোনও স্ল্যাশ না থাকে এবং কমান্ড অনুসন্ধানের পথটি পরিবর্তিত হয় না।
³ জন্য একটি alias হয় এটিটি ksh কিন্তু যে শুধু ভাল হিসাবে আছে। fchist


9

আপনি যদি একই কমান্ডটি সুডোর সাথে আবার করতে চান তবে !! এই মত একটি কমান্ড করার পরে:

echo "something">/path/file

আপনি কমান্ডটি পুনরায় স্মরণ করতে বিশ্বব্যাপী প্রতিস্থাপন বাক্য গঠন ব্যবহার করেন:

!!:gs/>/|sudo tee -a /

-A প্যারামিটারের পরে একটি স্পেস ব্যবহার করুন ।

এটি সুডোর সমতুল্য !! তবে আপনাকে <এবং> এর জন্য সুডোর সীমাবদ্ধতাগুলি বাইপাস করতে সহায়তা করে। কারণ সুডো আপনাকে [<,>] ব্যবহার করার অনুমতি দেয় না।


পুনঃনির্দেশগুলির জন্য সাধারণভাবে সুডোর বিধিনিষেধগুলিকে বাইপাস করতে আপনি এটি ব্যবহার করতে পারেন:

echo "something" | sudo tee myfile

টি কমান্ড আপনাকে স্ট্যান্ডার্ড ইনপুট থেকে পড়তে এবং স্ট্যান্ডার্ড আউটপুট এবং ফাইলগুলিতে লেখার অনুমতি দেবে

আপনি যদি কমান্ডটি পুনরাবৃত্তি করতে চান এবং ফাইলটিতে একটি পাঠ্য যুক্ত করতে চান, টি কমান্ডটিতে সংযোজনের জন্য -a বিকল্প রয়েছে। সুতরাং আপনি কমান্ডটি স্মরণ করতে পারেন

sudo !!

এবং পাঠ্যটি ফাইলটিতে সংযুক্ত করা হবে

উদাহরণ:

echo "something" | sudo tee -a /path/file
sudo !!

দুর্দান্ত সমাধান, তবে মুখস্ত করা কিছুটা শক্ত। কমান্ডের সাহায্যে আমি কীভাবে একটি নাম তৈরি করতে পারি !! শেষ আদেশটি মনে করার জন্য ?
রুবো 77

হয় -aসত্যিই প্রয়োজন? >একটি ফাইল ওভাররাইট tee -aকরবে, সংযোজন হবে, যা হবে>>
15-28 এ রুবো

3

এটি এতটা সহজ বলে মনে হচ্ছে sudo sh -c "!!":

$ cd /
$ echo hello > foo
bash: foo: Permission denied
$ sudo sh -c "!!"
sudo sh -c "echo hello > foo"
$ ls -l foo
-rw-r--r-- 1 root root 6 Jun 20 16:21 foo

3
যদি কমান্ডটি উদ্ধৃতি ব্যবহার করে তবে এটি সমতুল্য নয়। echo "foo bar"কোনটি sh -c "echo "foo bar""কেবল fooপরিবর্তে মুদ্রণ করতে হবে তা বিবেচনা করুন foo bar
গডলিজিক

sudo sh -c '!!'পরিবর্তে আমি চেষ্টা করেছি যদি আপনার আদেশটি কিন্তু এটি কাজ করে না
15-29 এ রুবো

তাহলে যদি আপনার আদেশটি একক এবং ডাবল উভয় উদ্ধৃতি ব্যবহার করে? বা ডাবল উদ্ধৃতি এবং পরিবর্তনশীল বিস্তৃতি? ব্যবহারকারী করেনি এমন: a=bএবং তারপর echo "$a" >fileএবং তারপর sudo sh -c '!!'এটি প্রসারিত হবে sudo sh -c 'echo $a >file'যার পরিবর্তে একটি খালি লাইন প্রিন্ট হবে bমধ্যে file
গডলিজিক

সুতরাং সম্ভবত আরও ভাল সমাধান আছে কি না?
রুবু 77

1
আমি মনে করি না এমন কোনও সমাধান রয়েছে যা আপনার কমান্ডটি পরিবর্তন করার প্রয়োজন ছাড়াই 100% সময় কাজ করবে। sudoএকটি রুট শেল পেতে ব্যবহার করে এবং তারপরে কমান্ডটি অনুলিপি করে আটকানো নিকটতম হতে পারে তবে কমান্ডটি যদি আপনার নন-রুট শেলের মধ্যে নির্ধারিত ভেরিয়েবলগুলি ব্যবহার করার প্রত্যাশা করে তবে ব্যর্থ হয়। sudo sh -c "!!"সাধারণ কমান্ডগুলির জন্য সূক্ষ্মভাবে কাজ করে তবে জটিলগুলির জন্য এটি পরিপূর্ণ। আমি মনে করি যে সেরা পরামর্শটি এমন কিছু কমান্ড রয়েছে যা 100% সময়ের জন্য কাজ করবে এমনটি আশা না করা - কিছু সম্ভাব্য সমাধান শিখুন এবং যখন এটি সবচেয়ে উপযুক্ত হয় তখন প্রতিটি প্রয়োগ করুন।
গডলিজিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.