Command / .zshrc থেকে ফাংশন স্যুড করার সময় "কমান্ড পাওয়া যায় নি"


10

আমার একটি ফাংশন আছে ~/.zshrc:

findPort() {
    lsof -t -i :$1
}

সাধারন প্রার্থনা হ'ল findPort 3306

আমি এটি উন্নত সুবিধাসমূহের সাথে চালাতে চাই। তবে আমি "কমান্ড পাওয়া যায় নি"।

  git 🍔 sudo findPort 3306
sudo: findPort: command not found

আমি অনুমান কারণে যে রুট ব্যবহারকারী হয় একটি নন-ইন্টারেক্টিভ শেল হিসাবে রান (এইভাবে একটি .zshrc পড়ুন না), অথবা একটি বোঝায় বিভিন্ন .zshrc

আমি সম্পর্কিত অনুরূপ প্রশ্নগুলি দেখেছি alias, তবে ব্যবহারকারী-সংজ্ঞায়িত ফাংশন সম্পর্কিত কোনও প্রশ্ন নেই। এই সমস্যার উত্তরগুলির aliasসাথে একটি উপন্যাস যুক্ত করা জড়িত ~/.zshrc:

alias sudo='nocorrect sudo '

অথবা সম্ভবত:

alias sudo='sudo '

আমি এই উভয় সমাধানের চেষ্টা করেছি, এবং সমস্যাটি এখনও বিদ্যমান (হ্যাঁ আমি শেলটি পুনরায় চালু করেছি)।

sudo chshআমার রুট শেলটি নীচে চলেছে তা নিশ্চিত করার জন্য আমি দৌড়ে চেষ্টা করেছি zsh। এই সমাধানগুলির কোনওটিই "কমান্ড পাওয়া যায়নি" সমস্যাটি সরিয়ে দেয়।

সুডোর অধীনে আমার ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলি চালনার কোনও উপায় আছে কি?


আরও দেখুন: unix.stackexchange.com/questions/181414/… (ফ্ল্যাগিং নয় কারণ zsh এর নিজস্ব কৌশল রয়েছে)
মুরু

উত্তর:


13

sudoশেল দিয়ে নয়, সরাসরি কমান্ডগুলি চালায়, এমনকি যদি এটি কমান্ডটি চালানোর জন্য শেলটি চালায় তবে এটি একটি নতুন শেল প্রার্থনা হবে, এবং এটি আপনার পড়তে হবে না ~/.zshrc(এটি যদি ইন্টারেক্টিভ শেলটি শুরু করেও এটি সম্ভবত পড়তে পারে root) ~/.zshrc, আপনি ভেরিয়েবলটি sudoপুনরায় সেট না করার জন্য কনফিগার না করা পর্যন্ত আপনার নয় $HOME)।

এখানে, আপনাকে sudoএকটি নতুন zshশেল শুরু করার জন্য বলতে হবে এবং সেই ফাংশনটি চালানোর আগে zshআপনাকে পড়তে হবে তা বলার দরকার আছে ~/.zshrc:

sudo zsh -c '. $0; "$@"' ~/.zshrc findPort 3306

বা:

sudo zsh -c '. $0; findPort 3306' ~/.zshrc

বা আপনার বর্তমান zsh ফাংশনগুলি নতুন zshদ্বারা আহবান করা সাথে ভাগ করতে sudo:

sudo zsh -c "$(functions); findPort 3306"

যদিও আপনার অনেকগুলি কার্যকারিতা সংজ্ঞায়িত করা থাকলে (যেমন সমাপ্তি সিস্টেমটি ব্যবহার করার সময়) আপনি একটি দীর্ঘ তালিকা ত্রুটি পেতে পারেন get সুতরাং আপনি এটিকে findPortফাংশনে সীমাবদ্ধ করতে চাইতে পারেন (এবং প্রতিটি অন্যান্য ফাংশন এটি যদি থাকে তবে তার উপর নির্ভর করে):

sudo zsh -c "$(functions findPort); findPort 3306"

আপনি এছাড়াও করতে পারেন:

sudo zsh -c "(){$functions[findPort]} 3306"

findPortকোনও বেনামে ফাংশনে কোডটি এম্বেড করার জন্য আপনি 3306 টি আর্গুমেন্টটি পাস করেন। অথবা এমনকি:

sudo zsh -c "$functions[findPort]" findPort 3306

(ইনলাইন স্ক্রিপ্ট প্রেরণ -c হয় ফাংশন শরীরের)।

আপনি যেমন কোনও সহায়ক ফাংশন ব্যবহার করতে পারেন:

zsudo() sudo zsh -c "$functions[$1]" "$@"

ব্যবহার করবেন না:

sdo () {sudo zsh -c "() {$ ফাংশন [$ 1]} $ {@: 2}"}

যেহেতু যুক্তিগুলি sdoশেল পার্সিংয়ের অন্য স্তরের মধ্য দিয়ে যাবে। তুলনা করা:

$ e() echo "$@"
$ sdo e 'tname;uname'
tname
Linux
$ zsudo e 'tname;uname'
tname;uname

টাইপ করার মতো সংক্ষিপ্ত একটি সমাধান আমার দরকার sudo। আমি এটি করতে আপনার বেনামী ফাংশন সমাধানটি মানিয়ে নিতে সক্ষম হয়েছি । আমি আমার সাথে নিম্নলিখিত ফাংশনটি যুক্ত করেছি ~/.zshrc, যা উন্নত সুবিধাগুলি সহ অন্যান্য ফাংশনগুলি পরিচালনা করার জন্য একটি ফাংশন :sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }
বার্চ্ল্যাবস

1
@ বার্চ্ল্যাবস, সম্পাদনা দেখুন
স্টাফেন

ধন্যবাদ; আপনার প্রস্তাবিত নতুন শর্টকাটটি ব্যবহার করার জন্য আমি আমার উত্তর আপডেট করেছি।
বার্চ্ল্যাবস 20'16

সুডোর মাধ্যমে সম্পাদিত স্ক্রিপ্টটিতে ফাংশন সংজ্ঞা যুক্ত করা স্মার্ট। তবে যথেষ্ট স্মার্ট নয় যদি সেই ফাংশনটি অন্য ফাংশন ব্যবহার করে (স্বয়ংক্রিয়ভাবে চালিত বা না)।
ড্যামিয়েন ফ্ল্যামেন্ট

3

আমার জন্য খুব সহজ সমাধানটি ছিল ইন্টারেক্টিভ শেলটি ব্যবহার করে প্রার্থনা করা sudo -s, যা zsh (5.2) এর আমার ম্যাকোস বান্ডিল সংস্করণে কাজ করে। এটি আমার থেকে ফাংশন সরবরাহ করে ~/.zshrc

সুডো ম্যানপেজ থেকে, যা সত্যই এই আচরণের প্রতি ইঙ্গিত দেয় না:

-s, -
Shell সেট করা থাকলে শেল এনভায়রনমেন্ট ভেরিয়েবলের দ্বারা নির্দিষ্ট শেলটি চালনা করুন বা অনুরোধকারী ব্যবহারকারীর পাসওয়ার্ড ডাটাবেস এন্ট্রি দ্বারা নির্দিষ্ট শেলটি চালান। যদি একটি কমান্ড নির্দিষ্ট করা থাকে, এটি শেলের -c বিকল্পের মাধ্যমে কার্যকর করার জন্য শেলের কাছে প্রেরণ করা হয়। যদি কোনও কমান্ড নির্দিষ্ট না করা থাকে তবে একটি ইন্টারেক্টিভ শেল কার্যকর করা হয়।

আপনার ব্যবহারের ক্ষেত্রে কী তা আমি নিশ্চিত নই, তবে আমি সন্দেহ করি আপনি একটি ইন্টারেক্টিভ সমাধান খুঁজছেন।


এটি আসলে কাজ করে। যদিও এটি আমার মনে থাকা কর্মপ্রবাহের পক্ষে যথেষ্ট নয়। আমার ইচ্ছাটি হ'ল আমার সাধারণ ব্যবহারকারী হিসাবে প্রম্পটে থাকা এবং myFuncটাইপ করে কেবল আমার ব্যবহারকারী-সংজ্ঞায়িত ফাংশনকে উন্নত করে তোলা sudo myFunc- একইভাবে আমি যে কোনও প্রক্রিয়া (যেমন sudo rm -rf .) উন্নত করব । এই সমাধানটি আমার সম্পূর্ণ প্রম্পট এবং ভবিষ্যতের সমস্ত ফাংশনকে উন্নত করে, পাশাপাশি ভবিষ্যতের সমস্ত ক্রিয়াকলাপের জন্য আমার ব্যবহারকারীকে পরিবর্তন করে - যা কিছুটা ওভারকিল।
বার্চ্ল্যাবস

sudo -sকমান্ড সুপার-ইউজার হিসেবে আপনার শেল আরেকটি দৃষ্টান্ত শুরু করবে। যদি আপনি এই আদেশটি ইন্টারেক্টিভভাবে কার্যকর করেন তবে আপনার নতুন শেলটি ইন্টারেক্টিভ হবে। কিন্তু কমান্ডটি আপনার শেলের মধ্যে sudo -s findPort 3306কমান্ডটি findPort 3306সুপার-ইউজার হিসাবে চালিত করবে তারপরে সেই আদেশের স্থিতি কোড সহ প্রস্থান করবে।
ড্যামিয়েন ফ্ল্যামেন্ট

2

স্টাফেন চেজেলাসের উত্তরে বর্ণিত সমাধানগুলির একটির জন্য আমি পুনরায় ব্যবহারযোগ্য শর্টহ্যান্ড তৈরি করতে সক্ষম হয়েছি । [সম্পাদনা করুন: স্টাফেন আমার প্রস্তাবিত মূল শর্টকাটটিতে পুনরাবৃত্তি করেছেন; এখানে বর্ণিত কোডটি তার তৈরির একটি নতুন সংস্করণ]

এটি আপনার মধ্যে রাখুন ~/.zshrc:

sdo() sudo zsh -c "$functions[$1]" "$@"

এখন আপনি sdo" sudoশুধুমাত্র ব্যবহারকারী-সংজ্ঞায়িত ফাংশনগুলির জন্য " হিসাবে ব্যবহার করতে পারেন ।

কাজ করে তা নিশ্চিত করতে sdo: আপনি এটি ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশনটিতে চেষ্টা করে দেখতে পারেন যা আপনার ব্যবহারকারীর নাম মুদ্রণ করে।

 birch@server ~/ 🍔 test() whoami

 birch@server ~/ 🍔 test
birch

 birch@server ~/ 🍔 sdo test
root

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