সুডো ব্যবহারের সময় উপাধি পাওয়া যায় না


158

আমি আজ এলিয়াস নিয়ে ঘুরে বেড়াচ্ছিলাম এবং আমি লক্ষ্য করেছি যে ব্যবহারের ক্ষেত্রে অ্যালিয়াসগুলি উপলব্ধ বলে মনে হচ্ছে না sudo:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

ব্যবহারের সময় আপনি এলিয়াস ব্যবহার করতে পারবেন না এমন কোনও কারণ আছে কি sudo?



2
@ লুচিয়ানোফ্যাচেনিলি: সুডোর /root/.bashrcমাধ্যমে কমান্ড চালানোর সময় পড়তে পারা যায় না।
ফ্লিম


@ ফ্লিম: কি হবে sudo -i?
Evi1M4chine

উত্তর:


249

আপনার সাথে নিম্নলিখিত লাইনটি যুক্ত করুন ~/.bashrc:

alias sudo='sudo '

থেকে ব্যাশ ম্যানুয়াল :

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

প্রতিটি সাধারণ কমান্ডের প্রথম শব্দ, যদি উদ্ধৃত না হয়, এটির একটি উলাম আছে কিনা তা পরীক্ষা করা হয় । যদি তা হয় তবে উক্ত শব্দের পরিবর্তে তার নামটি লেখা হবে। '/', '$', '`', '=' অক্ষর এবং উপরের তালিকাভুক্ত শেল মেটাচার্যাক্টর বা উদ্ধৃত অক্ষরগুলির কোনও একটি নামের নাম উপস্থিত নাও হতে পারে। প্রতিস্থাপন পাঠ্যে শেল মেটাচার্যাক্টর সহ কোনও বৈধ শেল ইনপুট থাকতে পারে। প্রতিস্থাপন পাঠ্যের প্রথম শব্দটি এলিয়াসগুলির জন্য পরীক্ষা করা হয়, তবে একটি শব্দ যা একটি উপনামের সাথে সাদৃশ্যপূর্ণ তা প্রসারিত হওয়ার পরে দ্বিতীয়বার প্রসারিত হয় না। এর অর্থ হ'ল উদাহরণস্বরূপ, কোনও ব্যক্তি এলএসকে "ls -F" এ পরিণত করতে পারে এবং বাশ প্রতিস্থাপনের পাঠ্যের পুনরাবৃত্তভাবে প্রসারিত করার চেষ্টা করে না। যদি উলামের মানটির শেষ অক্ষরটি কোনও স্থান বা ট্যাব অক্ষর হয় তবে তারপরের পরবর্তী কমান্ড শব্দটিও ওরফে প্রসারণের জন্য পরীক্ষা করা হয়

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


18
খুব সুন্দর সমাধান।
ulidtko

সুতরাং মূলত ইস্যুটি এই বিষয়টিতে ফোটে যে সুডো কেবল এমনভাবে প্রোগ্রাম করা হয় যে এটি ওরফের পরীক্ষা করে না তাই এলএল খুঁজে পাওয়া যায় না?
কেমরা 102

2
ডকুমেন্টেশনটি
পড়লে

4
যদি আমি একটি সুডো পতাকা ব্যবহার করি তবে কি এই ব্রেক হবে sudo -H ll?
মার্ক ই। হাজেস

1
@ মেহেস হ্যাঁ, আমি চেষ্টা করেছিলাম এবং এটি ভেঙে যায়।
ব্যবহারকারী31389

5

আমি সেই ছায়ার জন্য একটি বাশ ফাংশন লিখেছি sudo

এটি প্রদত্ত কমান্ডটির জন্য আমার একটি উরফ আছে কিনা তা যাচাই করে sudoএবং সেই ক্ষেত্রে আক্ষরিক পরিবর্তে অ্যালিয়াসেড কমান্ড চালায় ।

ওয়ান-লাইনার হিসাবে এখানে আমার ফাংশন:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

বা সুন্দর বিন্যাসিত:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

আপনি এটিকে আপনার .bashrcফাইলে সংযুক্ত করতে পারেন , উত্সটি ভুলে যাবেন না তবে পরিবর্তনগুলি প্রয়োগ করার জন্য আপনার টার্মিনাল সেশনটি পুনরায় চালু করুন।


এটি সুডো-এইচ এলএল এর জন্যও কাজ করবে যদি দুর্দান্ত হয়।
uav

3

এলিয়াসগুলি ব্যবহারকারী নির্দিষ্ট - আপনার এগুলি সংজ্ঞায়িত করতে হবে /root/.bashrc


3
তারা ইতিমধ্যে /root/.bashrc এর অধীনে রয়েছে সুতরাং এটি কোনও সমস্যা নয়
কেমরা 102

1
এই উত্তরটি কেবল তখনই সঠিক হবে যখন আপনি শেলটি নিজেই রুট হিসাবে চালাচ্ছেন sudo -sবা যেমন sudo -i(এবং কেবল নিজের দ্বারা চালিত হলে রুট শেল পেতে, কেবল বা ফর্মগুলির সাথে নয় ) বা অথবা , বা পরিস্থিতি যেখানে আপনি রুট লগইন সক্ষম হয়েছে এবং সেভাবে একটি রুট শেল রয়েছে। যখন কোনও নন-রুট ব্যবহারকারী তাদের নিজস্ব শেল থেকে চালায় তবে ওরফ এক্সপেনশনটি তাদের নিজস্ব অ-রুট শেল দ্বারা সম্পন্ন হয়। উপকরণ নিজেই প্রসারিত করে না, সুতরাং প্রশ্নের বর্ণিত পরিস্থিতিতে প্রয়োগ হিসাবে , এই উত্তরটি ভুল। sudo -s command...sudo -i command...sudo bashsudo susudo command...sudo
এলিয়াহ কাগন

3

@ অ্যালভিনের উত্তরটি সবচেয়ে সংক্ষিপ্ততর। কোনো সন্দেহ নেই! :-)

তবে আমি সুডোতে এলিয়াসেড কমান্ড কার্যকর করার জন্য একটি কমান্ড লাইন সমাধানের কথা ভেবেছিলাম যেখানে কমান্ড sudoদিয়ে পুনরায় সংজ্ঞা দেওয়ার দরকার নেই alias

যাদের আগ্রহী তাদের জন্য এখানে আমার প্রস্তাব:

সমাধান

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

উদাহরণ

llকমান্ডের ক্ষেত্রে

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

ব্যাখ্যা

যখন আপনার একটি উপাধি রয়েছে (যেমন ll:) কমান্ডটি type -aঅ্যালিজেড এক্সপ্রেশনটি ফিরিয়ে দেয়:

$type -a ll
ll is aliased to `ls -l'

সঙ্গে grepআপনি অ্যাকসেন্ট `এবং যে ক্ষেত্রে ঊর্ধকমা 'মধ্যে পাঠ্য নির্বাচনls -l

এবং xargsনির্বাচিত পাঠ্যটির ls -lপ্যারামিটার হিসাবে চালিত করে sudo

হ্যাঁ, কিছুটা দীর্ঘ তবে পুরোপুরি পরিষ্কার ;-) sudoউপনাম হিসাবে পুনরায় সংজ্ঞা দেওয়ার দরকার নেই ।


3
আপনি যদি aliasবিল্টিন ব্যবহার করেন তবে এটি আরও সহজ হতে পারে , কারণ এর আউটপুট আরও পরিষ্কার clean alias llআউটপুট alias ll='ls -ahlF'
মুরু

এখানে সংস্করণ @ muru এর পরামর্শ একত্রিত হল: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo
ACK_stoverflow

আমি মনে করি যে আসল প্রশ্নের মূল বিষয়টি আগে কাজ না করে কাজটি সংরক্ষণ করা ছিল sudo -i, এলিয়াসেড কমান্ড চালানো হয়েছিল, তবে সরাসরি এটি করা হয়েছিল। এ জাতীয় জটিল কমান্ড পরাস্ত করে। আপনি কেবল প্রাক্তনটি করতে পারেন এবং আরও দ্রুত হতে পারেন।
Evi1M4chine

1

আমার আরও একটি দুর্দান্ত সমাধান রয়েছে, যা কিছুটা আস্থাও যুক্ত করে:

sudoট্যাব টিপে টিপে টিপানোর সময় শব্দগুলি স্বয়ংক্রিয়ভাবে তাদের এলিয়াসগুলির সাথে প্রতিস্থাপন করতে ব্যাশ সমাপ্তি ব্যবহার করুন ।

/etc/bash_completion.d/sudo-alias.bashcompএটি হিসাবে সংরক্ষণ করুন এবং এটি স্বয়ংক্রিয়ভাবে ইন্টারেক্টিভ শেল প্রারম্ভকালে লোড করা উচিত:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

তারপরে একটি নতুন টার্মিনালে লগ ইন করুন এবং আপনার যাওয়া ভাল হবে।



@ মুরু: ধন্যবাদ, তবে এক্ষেত্রে আমার মূল্যগুলি দরকার, কীগুলি নয়। সুতরাং যে নামটি প্রবেশ করানো হয়েছিল তা প্রতিস্থাপন করা হবে। আপনি উপনামটি টাইপ করুন (এর মতো sudo ll) টিপুন, [ট্যাব ↹] টিপুন, এবং স্ক্রিপ্টটি llওরফে অ্যাসাইনমেন্টের তালিকায় খুঁজে পেয়েছে , এটিতে কী বরাদ্দ করা হয়েছে তা কেটে দেয় এবং সন্নিবেশ করায়। (সুতরাং আপনি উদাহরণ পেয়ে sudo ls -lahvF --color=auto --time-style=long-iso
যাবেন

0

আমার একটি পৃথক সমাধান রয়েছে যার মাধ্যমে আপনার sudoকোনও উপ নাম হিসাবে যুক্ত করার দরকার নেই । আমি লিনাক্স মিন্ট 17.3 চালাচ্ছি তবে এটি উবুন্টুর সাথে একই রকম হওয়া উচিত।

আপনি যখন রুট হন তখন .profileতার হোম ডিরেক্টরি থেকে চালানো হয়। মূলের নীচে থাকা হোম ডিরেক্টরিটি কী তা যদি আপনি না জানেন তবে আপনি এটি দিয়ে পরীক্ষা করতে পারেন:

sudo su
echo $HOME

যেহেতু আপনি দেখতে পারেন, বাড়িতে rootহয় /root/। এর সামগ্রীগুলি পরীক্ষা করুন:

cd $HOME
ls -al

একটি .profileফাইল থাকা উচিত । ফাইলটি খুলুন এবং নিম্নলিখিত লাইনগুলি যুক্ত করুন:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

মূলত, এই ব্যাশ স্ক্রিপ্টটি যা করে তা হ'ল একটি ফাইল অনুসন্ধান করা .bash_aliases। যদি ফাইলগুলি উপস্থিত থাকে তবে এটি ফাইলটি কার্যকর করে।

.profileফাইলটি সংরক্ষণ করুন এবং আপনার এলিয়াসগুলি তৈরি করুন .bash_aliases। আপনার যদি ইতিমধ্যে এলিয়াস ফাইল প্রস্তুত থাকে, তবে এই স্থানে ফাইলটি অনুলিপি করুন

টার্মিনালটি পুনরায় চালু করুন এবং আপনি যেতে ভাল!


0

শীর্ষে ভোট দেওয়া উত্তরটি দুর্দান্ত। তবে আপনি যদি টাইপ করেন sudo -iএবং একটি সুডো প্রম্পটে উন্নত করেন ( #) আপনার ব্যবহারের মতো পছন্দসই উপাধি থাকবে না।

#প্রম্পটে আপনার এলিয়াসগুলি (এবং অন্যান্য সমস্ত কিছু) ব্যবহার করতে, ব্যবহার করুন:

sudo cp "$PWD"/.bashrc /root/.bashrc

যেখানে "home পিডাব্লুডি" স্বয়ংক্রিয়ভাবে "/ হোম / YOUR_USER_NAME" এ প্রসারিত হয়েছে


0

@ WinEunuuchs2Unix: $PWD"বর্তমান ওয়ার্কিং ডিরেক্টরি" তে প্রসারিত হয়। আমি মনে করি আপনি চান $HOME

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

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