আপনি যদি সত্যিই কাজ করতে চান তবে আপনি একটি শেল ফাংশনটি সংজ্ঞায়িত করতে পারেন যা এই ভাবে চালানোর সময় একটি নতুন রুট শেল চালায় এবং অন্যথায় কেবল নিয়মিত কমান্ড চালায় ।sudo cd directorybashsudosudo
অন্যান্য উত্তরে যেমন উপস্থাপন করা হয়েছে, বেশিরভাগ ব্যবহারকারীরা এটি করে বিরক্ত করতে চান না , তবে পরিবর্তে এটি করতে চাইবেন:
- চালান
sudo -s, বা sudo -iআপনি লগইন শেল চাইলে (মনে রাখবেন যে এর একটি প্রভাব sudo -iআপনাকে মূলের হোম ডিরেক্টরিতে শুরু করা) বা sudo bashআপনি যদি জোর করতে চান bashবা শেলের বিকল্পগুলি পাস করতে সক্ষম হন।
- নতুন শেল চালান ।
cd directory
- নতুন শেলের মূল হিসাবে গ্রহণের (অন্যান্য) ক্রিয়াগুলি যা করা দরকার তা সম্পাদন করুন।
- একবার হয়ে গেলে
exitনতুন শেলটি ছেড়ে চলে যান। এটি ভুলে যাওয়া গুরুত্বপূর্ণ নয়, কারণ আপনি যতটা ইচ্ছা তত রুট হিসাবে আরও ক্রিয়া সম্পাদন করতে চান না!
সুতরাং, যদি আপনি চান, তবে আপনি শেল ফাংশন (বা একটি স্ক্রিপ্ট) লিখতে পারেন sudoযা অনুসরণ করার পরে সেই দুটি ক্রিয়াকলাপ সম্পাদন করে cdএবং sudoঅন্যথায় সাধারণত চালিত হয়। অন্যথায় কেন সফল হয় না তা শেখার বিকল্প হিসাবে দয়া করে এটি ব্যবহার করবেন না sudo cd , কারণ আপনি যদি বুঝতে না পারছেন যে কী চলছে, তবে আপনি সম্ভবত নতুন শেলের মধ্যে পড়ে খুব বিভ্রান্ত হবেন (এবং আপনি কোনও ত্রুটির বার্তা বুঝতে নাও পারেন) যে ঘটতে পারে)।
এই জাতীয় শেল ফাংশন লেখার জন্য এখানে একটি উপায় রয়েছে, এটি আপনাকে মনে করিয়ে দেয় যে আপনি নতুন শেলটিতে আছেন এবং আপনার কাজ exitশেষ হওয়ার পরে আপনাকে এটিকে বাইরে বের করা উচিত । (এই অনুস্মারক ব্যবহারকারীদের জন্য দরকারী হতে পারে কোনো কারণ না সাধারণত অভ্যস্ত একটি নতুন শেল হচ্ছে যখন এক চালনা করে দক্ষতা স্তর sudoছাড়া -s, -iঅথবা একজন আর্গুমেন্ট হিসাবে প্রকৃত শেলের নাম।)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
আপনি এটি আপনার মধ্যে রাখতে পারেন ~/.bashrc, যদিও এটি ব্যবহার sudoকরার জন্য এটি একটি অদ্ভুত যথেষ্ট উপায় যা আপনি কেবল কখনও কখনও এটি সক্ষম করতে চাইতে পারেন। সেক্ষেত্রে এটি নিজের ফাইলটিতে রাখাই ভাল। যদি আপনি sudo.bashসেই সামগ্রীগুলি সহ আপনার হোম ডিরেক্টরিতে ডাকা একটি ফাইল তৈরি করেন তবে আপনি sudoফাংশনটি উপলভ্য করতে পারেন - যাতে এটি নিয়মিত sudoকমান্ডের পরিবর্তে চালিত হয় . ~/sudo.bash। এটি বর্তমান শেল এবং এর শিশু শেলগুলিতে কার্যকর হয়, তবে অন্য নয়। একই কারণে যে ফাইলগুলি .bashrcএক্সিকিউটেবল নয়, এর sudo.bashসাথে এক্সিকিউটেবলকে চিহ্নিত করবেন না chmod। এটি একটি স্বতন্ত্র শেল স্ক্রিপ্টের চেয়ে সত্যই একটি লাইব্রেরি। আপনি যদি করেনিএটিকে শেল স্ক্রিপ্ট হিসাবে চালান, এটি ফাংশনটি সংজ্ঞায়িত করবে ... তবে কেবল সেই শেলটিতে যা স্ক্রিপ্টটি চালিয়েছিল, কলার হিসাবে আপনার জন্য নয়। (অবশ্যই, আপনি এটির জন্য একটি স্ক্রিপ্ট লিখতে পারেন , আমি যে পদ্ধতিটি এখানে নিয়েছি তা কেবল ঘটে না))
sudoবর্তমানে শেল ফাংশন হিসাবে সংজ্ঞায়িত হয়েছে কিনা তা যাচাই করতে এবং এটির বর্তমান সংজ্ঞাটি যদি একটি হয় তবে তা চালনা করুন type sudo। ফাংশনটি একবার সংজ্ঞায়িত হয়ে গেলে (যেমন, অপরিশোধিত) অক্ষম করতে, চালান unset -f sudo। sudoশেল ফাংশনটি সংজ্ঞায়িত হলেও নিয়মিত কমান্ডটি সরাসরি ম্যানুয়ালি চালাতে , চালান command sudo। মনে রাখবেন, যাইহোক, আপনি না যে আছে , যে কাজ করতে এই কারণে sudoফাংশন আসলে বেশী বা কম দুটি আর্গুমেন্ট অথবা প্রথম আর্গুমেন্ট প্রেরণ পাস নিজেই যখনই আছে এটা কিন্তু কিছু করার নেই cd। এজন্য আপনি এখনও লোকেরা যেভাবে ব্যবহার করেন সেগুলি ব্যবহার করতে পারেন sudo।
উল্লেখ্য এছাড়াও উপরে দেখানো শেল ফাংশন এখনও তোমাকে অন্য আর্গুমেন্ট পাস যে sudo, কিন্তু যে চিকিত্সা আটকাতে পারে cdবিশেষভাবে । বিশেষত দৌড়াদৌড়ি সমর্থিত নয়, যদিও আপনি সেই ক্ষেত্রে সমর্থন করার জন্য শেল ফাংশনটি প্রসারিত করতে পারেন। না হয় । এটি তৈরি করা শেল আপনার সাথে মিলিত হওয়ার মতো । কোডটি আসলে চালায় না , তবে ব্যবহার করে , সুতরাং বিকল্পটি সঠিকভাবে কাজ করে। এটি পাস করার সময় এটি দুটিবার চলে এবং এটির জন্য ডিরেক্টরি আর্গুমেন্ট (এবং অন্যথায় শূন্য বার)। আপনি যখন চালান , প্রথমে এটি আপনি ফাংশনটি চালাচ্ছেন তার থেকে আলাদা বাশ শেলটি কাঁটাচামচ করে দেয় এবং ডিরেক্টরি পরিবর্তন করে। যদি এটি সফল হয়, এটি প্রতিস্থাপন করেsudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo আপনি ব্যবহার করতে পারেন এমন একটি নতুন, ইন্টারেক্টিভ সহ সেই ব্যাশ শেল।
কীভাবে শেলটি স্বয়ংক্রিয়ভাবে "সঠিক কাজ করে" তার একটি উদাহরণ এখানে thing লক্ষ্য করুন যে sudo ls -A /rootসাধারণত আচরণ করে। আমি তখনই যখন cdএকটি ডিরেক্টরিতে চেষ্টা করার চেষ্টা করি কেবল তখনই sudoএকটি নতুন শেল তৈরি হয় এবং আমি কী ঘটছে তা স্পষ্টভাবে মনে করিয়ে দিই।
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
আপনি যদি sudo cdএমন কোনও ডিরেক্টরিতে চেষ্টা করেন যা আপনি রুট হিসাবেও পরিবর্তন করতে পারবেন না, তবে আপনি কেবল একটি ত্রুটি বার্তা পাবেন:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
ডিরেক্টরিটি পরিবর্তন করার চেষ্টা করার আগেsudo -k এটি আপনাকে রুট হিসাবে অনুমোদন করে তা দেখানোর জন্য আমি উপরোক্ত উদাহরণগুলির অনুরোধগুলির মধ্যে ব্যবহার করেছি । তবে আপনাকে আসলে নিজেকে চালানোর দরকার নেই । কারণ শেল ফাংশন বাস্তব জন্য শুধু একটি পাতলা মোড়কের হয় কমান্ড , আপনার শংসাপত্রগুলি এবং অন্যান্য সাধারণ ক্যাশের ব্যবস্থা আচরণে এখনও স্বাভাবিকভাবে কাজ।sudo -ksudosudo
যদিও এটি ভালভাবে কাজ করে এবং একধরনের ঝরঝরে, আমি স্বীকার করি যে sudoএকই নামের ফাংশন দিয়ে আসল কমান্ডের ছায়া দেওয়া খুব অদ্ভুত। অধিকাংশ ব্যবহারকারীদের সম্ভবত ধাপগুলি অনুসরণ করতে চাইবেন sudo -s, নিজেদের। তবে যদি কেউ এটি চায় - এবং এটিও সম্ভব যে এটি প্রদর্শন করতে পারে - এটি সেখানে রয়েছে।cd directory
ls -lডিরেক্টরি নিজেই একটি যোগ করুন ।