কেন সুডো এলিয়াস উপেক্ষা করে?


22

আমি উবুন্টু 10.04 চালাচ্ছি এবং আমি upstartডেমন পরিচালনার জন্য ব্যবহার করি । আমার এন্টারপ্রাইজ অ্যাপ্লিকেশনটি ডেমন হিসাবে চালিত হয় এবং বিভিন্ন সুযোগ-সুবিধার কারণে অবশ্যই রুট হিসাবে চালানো উচিত। উদাহরণ:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

আমি aliasএই আদেশগুলি সংক্ষেপে কিছু হিসাবে সংক্ষেপে একটি উপস্থাপন করতে চাই:

alias startapp='sudo start my-application-long-ID'

এবং এটি হিসাবে চালান startapp কাজ করে এবং এটি কাজ করে তবে আমি ওরফে সুডো না রাখাই পছন্দ করি।

alias startapp='start my-application-long-ID'

ব্যবহার করে চালানো হয় না sudo startappফিরেsudo: startapp: command not found

তবে, আমি যখন উপনামটি যুক্ত করেছি:

alias sudo='sudo '

sudo startapp এখন কাজ করে তবে আমি এখনও কৌতূহল বোধ করি কেন সুডো এলিয়াস উপেক্ষা করে।


আপনার চালানো হয়েছে source ~/.bashrc? এটি .bashrc ফাইল আপডেট করে এবং নতুন উপকরণটি উপলব্ধ করে?
মানু

@ মানু হ্যাঁ, আমি করেছি
উভচর

উত্তর:


35

আমি থেকে নীচের তথ্য দেখুন এখানে

সুডো ব্যবহার করার সময়, উপন্যাসের প্রসারটি ব্যবহার করুন (অন্যথায় সুডো আপনার এলিয়াসগুলি উপেক্ষা করে)

alias sudo='sudo '

এটি কাজ না করার কারণ এখানে ব্যাখ্যা করা হয়েছে

বাশ কেবলমাত্র একটি উপনামের জন্য একটি কমান্ডের প্রথম শব্দটি পরীক্ষা করে, তার পরে কোনও শব্দ চেক করা হয় না। এর অর্থ সুডো এলএল-এর মতো একটি কমান্ডে, কেবলমাত্র প্রথম শব্দটি (সুডো) একটি বাতির দ্বারা বাশ দ্বারা পরীক্ষা করা হয়, ll উপেক্ষা করা হয়। আমরা বাশকে উপনামের পরে পরবর্তী শব্দটি পরীক্ষা করতে বলতে পারি (যার অর্থ সুডো) ওরফে মানটির শেষে একটি স্থান যুক্ত করে।


6

উপকরণ এবং ফাংশন একটি শেল সংজ্ঞায়িত করা হয়। সুডো একটি বাহ্যিক প্রোগ্রাম। সুতরাং সুডো এলিয়াস, ফাংশন বা শেল বিল্টিনগুলি দেখতে পাবে না কেবলমাত্র বাহ্যিক আদেশগুলি।

উপাধিগুলি হ'ল বিকল্প কমান্ডের নাম হিসাবে বোঝানো হয়, সুতরাং শাঁসগুলি কেবল কমান্ড অবস্থানেই তাদের প্রসারিত করে না, যখন তারা কমান্ডের পক্ষে যুক্তি হয়। জেডএস গ্লোবাল এলিয়াসগুলিকে সমর্থন করে, যা কমান্ড লাইনের যে কোনও জায়গায় প্রসারিত হয় এবং খুব সহজেই ব্যবহার করা যায় যেহেতু দুর্ঘটনাক্রমে এগুলি প্রাসঙ্গিক ক্ষেত্রেও প্রসারিত হওয়ার ঝুঁকি রয়েছে যেখানে উলামের অর্থ হয় না।

আপনি শেল ডাকা উবুন্টু বলতে পারেন: sudo sh -c '…shell command here…'। আপনার স্বাভাবিক উপকরণগুলি শেল কমান্ডের মধ্যে পাওয়া যাবে না, যেহেতু তারা সাধারণত কোনও ফাইল যেমন ~/.bashrcবা তে সংরক্ষণ করে~/.zshrc যা শুধুমাত্র ইন্টারেক্টিভ শেল পড়তে দেখা যায়।

alias sudo='sudo ', যেমন রমেশ দ্বারা প্রস্তাবিত , শেল পর alias লেখা প্রসারিত করতে ঘটায় sudo


1
কি alias sudo='sudo 'ZSH জন্য কাজ হিসাবে ভাল?
সিএমসিডিগ্রাগনকাই

2
@ সিএমসিডিগ্রাগনকাই হ্যাঁ
গিলস 'অশুভ হওয়া বন্ধ করুন'

1

Zsh ব্যবহারকারীদের জন্য একটি সমাধান

বাশ এবং zsh উভয় ক্ষেত্রে, কোনও স্থানের সাথে একটি উপাধি শেষ করা শেলটি পরবর্তী শব্দের উপন্যাস-প্রসারিত করবে। এটি নীচের মতো কিছু উপাধি প্রসারিত করতে দেয়myalias

alias 'sudo=sudo '
sudo myalias

দুর্ভাগ্যক্রমে এগুলি তখনই পৃথক হয়ে যায় যখন আপনার ওরফে আরও একটি শব্দ থাকবে (যেমন sudo -u someone। তবে আপনি কমান্ডের যে কোনও জায়গায় ম্যানুয়ালি এলিয়াসগুলি প্রসারিত করতে zsh "গ্লোবাল অ্যালিয়াসস" বৈশিষ্ট্যটি অপব্যবহার করতে পারেন।

alias -g '$= '

এটি একটি গ্লোবাল উপন্যাস তৈরি করে $(যা আপনি চান যে কোনও শব্দ ব্যবহার করতে পারেন) যা একটি স্পেসে শেষ হয়। এটি zsh এর ফলে নিয়মিত কমান্ড ওরফে হিসাবে পরবর্তী শব্দটি প্রসারিত করে। যেহেতু উপনামটি সাদা স্পেসে প্রসারিত হয় এটি আর্গুমেন্ট হিসাবে বিবেচিত হবে না। এটি নিম্নলিখিতগুলিকে কাজ করতে দেয়।

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

এমনকি $যদি আপনার কমান্ড নেস্টিং জটিল হয় তবে আপনি একটি কমান্ড লাইনে একাধিকবার ব্যবহার করতে পারেন। আমি এটি যথেষ্ট দরকারী পেয়েছি যে এটি আমার zshrc এ একটি স্থায়ী জায়গা আছে, তবে আপনার যখন এটি ব্যবহারের প্রয়োজন হবে তখন এটি সংজ্ঞা দিতে যথেষ্ট সহজ।


0

আমি এখানে পুনরায় সংজ্ঞা না দিয়ে একটি বিকল্প উত্তর দিয়েছিsudo সাথে দিয়ে ।

আপনার ক্ষেত্রে এটি হবে:

type -a startapp | grep -o -P "(?<=\`).*(?=')" | xargs sudo 

সমস্তই এক লাইনে, কোনও অতিরিক্ত শেল, কোনও উপরিভাগের নতুন সংজ্ঞা নেই। ;-)


ওহ এক মিনিট অপেক্ষা করুন - আমি তা পেয়েছি - আপনি xargsউদ্ধৃতিগুলি ফালা ব্যবহার করছেন , এবং শীর্ষস্থানটি স্ট্রিপ করার জন্য গ্রেপ করুন =। কিন্ডা চালাক, তবে সম্ভবত অপ্রয়োজনীয়। eval "sudo $(alias aliasname | cut -d= -f2-)"সম্ভবত আরও ভাল - xargsসর্বদা উদ্ধৃতিগুলি সঠিকভাবে পরিচালনা করবে না এবং সেখানে একের বেশি থাকতে পারে =
মাইকজার্ভ

@ মিমকিজার আমি দুঃখিত যে আপনি এটি পেলেন না ;-) xargs উদ্ধৃতিগুলি । এটি গ্রেপ যিনি উদ্ধৃতিগুলির মধ্যে থেকে সমাধান করা আদেশটি গ্রহণ করেন। আপনি কি জানেন type -a alias_nameকিছু ফিরে alias_name is aliased to command_within_quotes। যাইহোক আমি আপনার আদেশ চেষ্টা করেছি এবং আমার উবুন্টু :-( উপর কাজ করে নি তা দিকেই প্রত্যাবর্তন হবে। type -aলিনাক্স সংস্করণের মধ্যে বিভিন্ন (ঝ এটা সন্দেহ)?।
loved.by.Jesus

আমি জানি কি type - ইন bash। আপনি বুঝতে পারছেন, কোটসটি ঠিক দ্বিগুণ ? আপনি কি এমন একটি উপনাম দিয়ে চেষ্টা করেছেন যাতে একক উদ্ধৃতি রয়েছে? যাইহোক, আমার জিনিসটি কাজ করছে না সে সম্পর্কে আপনি ঠিক বলেছেন - আপনার প্রয়োজন হয় eval "sudo sh -c "$(...বা হয় eval "'sudo $(alias alias_name| cut -d\' -f2-)"। জিনিসটি হ'ল aliasমূলত প্রিরিঞ্জার্ড evalএস - aliasইউটিলিটিটি তাদের বিষয়বস্তুগুলি আউটপুট করার জন্য নির্দিষ্ট করা হবে যাতে এটি নিরাপদে শেলের সাথে পুনরায় সংযোগ স্থাপন করতে পারে। আমার ধারণা আপনার xargsসাদা অংশটি সমতল করার জন্য তখন বাস্তবায়ন করা হবে? ঠিক যে সাবধান, ঠিক আছে?
মাইকসার্ভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.