sudo: উত্স: কমান্ড পাওয়া যায় নি


54

আমি ব্যাশের জন্য কিছু ডিফল্ট প্রোফাইল আপডেট করছি, এবং আমি যে টিউটোরিয়ালগুলি অনুসরণ করেছিলাম তা ব্যবহার করে নতুন পরিবেশের সেটিংস সহ নতুন প্রোফাইলটি পুনরায় লোড করতে পারলাম:

source /etc/bash.bashrc

একমাত্র জিনিস - নতুন পরিবেশের ভেরিয়েবলগুলি কেবলমাত্র আমার বর্তমান ব্যবহারকারীর জন্যই উপলব্ধ ছিল - এবং যখন আমি sudo ব্যবহার করি তখন তা উপেক্ষা করা হত। যখন আমি আমার টার্মিনাল সেশনটি বন্ধ করে দিয়ে আবার যোগ দিলাম তখন সেগুলি কেবল সুডোর জন্য উপলব্ধ ছিল।

যখন আমি ব্যবহার করার চেষ্টা করি:

sudo source /etc/bash.bashrc

আমি ত্রুটি পেয়েছি:

sudo: source: command not found

টার্মিনালটি বন্ধ করে পুনরায় আরম্ভ না করে সুডোর জন্য নতুন বাশ প্রোফাইল সেটিংসে লোড করার কোনও সহজ উপায় আছে?

- প্রথমদিকে, আমি কিছু ইনস্টলার স্ক্রিপ্ট ব্যবহার করছিলাম যা ভেরিয়েবলগুলি রেফার করে। আমি দেখতে পেলাম যে যখন আমি স্ক্রিপ্টগুলি সরাসরি কল করতাম তখন তারা ভেরিয়েবলগুলি অ্যাক্সেস করতে পারে (যদিও এটির মূল ডিরেক্টরি হওয়ার সাথে সাথে ডিরেক্টরি তৈরি করার পরে সমস্যা দেখা দেবে), সুডো ব্যবহার করে ইনস্টল স্ক্রিপ্টগুলি কল করে না।

আমি এই সাধারণ কমান্ড দিয়ে পরীক্ষা করে প্রমাণ করেছি:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

প্রথমটি ভেরিয়েবলের মান আউটপুট করে, তবে দ্বিতীয়টি কোনও কিছুই আউটপুট দেয় না।


আপনি কীভাবে sudo থেকে ভেরিয়েবল ব্যবহার করার চেষ্টা করেছিলেন? দয়া করে মনে রাখবেন যে আপনি যদি "sudo কমান্ড $ ভেরিয়েবল" ব্যবহার করেন তবে এটি আপনার শেল থেকে ভেরিয়েবলটি প্রতিস্থাপন করবে, সুডোর পরিবেশ থেকে নয়।
জোও পিন্টো

উত্তর:


72

সমস্যাটি হ'ল sourceবাশ বিল্ড-ইন কমান্ড (কোনও প্রোগ্রাম নয় - যেমন lsবা grep)। আমি মনে করি যে একটি পদ্ধতির মূল হিসাবে লগইন করা এবং তারপরে উত্স কমান্ড কার্যকর করা।

sudo -s
source /etc/bash.bashrc

3
আপনি ঠিক বলেছেন যে সমস্যাটি হ'ল sourceশেল বিল্টিন। sudo suএটি বলার এক ধরণের অদ্ভুত উপায় - sudo -sএটি সুডোর নিজস্ব উপায় যা বলা ভাল এটি "এই ব্যবহারকারী হিসাবে শেল শুরু করুন"। আপনার এক-লাইন সংস্করণটি কাজ করবে না কারণ এতে প্রতিটি কমান্ডই পৃথক সাবপ্রসেসে প্রধান ব্যবহারকারীর শেল দ্বারা চালিত হয়।
পুলি

1
ঠিক। প্লাস BASH লগইন করার সময় / ইত্যাদি / বাশার্ক পড়ে। সুতরাং আপনি সেই ব্যবহারকারীর পরিবেশ পাওয়ার জন্য -, -l, - - অথবা লগিন স্যুইচ সহ 'সু' ব্যবহার করতে পারেন: 'সুডো সু -' রুট হয়ে উঠতে বা 'ইউ-ইউজারনেম' ব্যবহারকারীর জন্য।

"একটি লাইন" উদাহরণ কাজ করবে না কারণ suএকটি নতুন শেল শুরু হয় এবং এটি শেষ হওয়ার পরে "উত্স" চালানো হয়। প্রথম উদাহরণটি কেবল তখনই কাজ করে যদি রুট শেলের ভিতরে দ্বিতীয় লাইন ব্যবহৃত হয় ।
loevborg

sudo -sএর চেয়ে ভাল আর কিছু নয় sudo su। এটি কোনওভাবেই কোনও প্রভাব ফেলবে না।
লোভবার্গ

1
sudo -sশেল শুরু করার অনুরূপ প্রভাব রয়েছে, তবে আমার কাছে যখন এটি করা হবে তখন দুটি "অন্য ব্যবহারকারী হয়ে উঠুন" কমান্ড স্ট্যাক করা অনুচিত মনে হয়।
পুলি

14

সমস্যাটি sourceশেল বিল্টিন কমান্ড নয়। এটি হ'ল এটি হ'ল আসলে command not foundত্রুটিটি আপনাকে ফেলে দিচ্ছে , তবে এর অর্থ এই নয় যে এটি থাকলে এটি কাজ করবে।

প্রকৃত সমস্যাটি হল পরিবেশের ভেরিয়েবলগুলি কীভাবে কাজ করে। এবং তারা এটির মতো কাজ করে: প্রতিবার নতুন প্রক্রিয়া শুরু হওয়ার সাথে সাথে যদি কিছু না ঘটে তবে তা তার পিতামাতার পরিবেশের উত্তরাধিকার সূত্রে আসে। এই কারণে, একটি সাবশেল ব্যবহার করা (উদাহরণস্বরূপ ব্যাশের bashউদাহরণের মধ্যে টাইপ করা ) এবং এর আউটপুটটি envদেখলে তার পিতামাতার চেয়ে অনুরূপ ফলাফল দেওয়া উচিত।

তবে, কীভাবে sudoকাজ করে (যেমন তার ম্যানপেজে বলা হয়েছে), সুডো ব্যবহারকারীর পরিবেশ ছিনিয়ে নেওয়ার চেষ্টা করে এবং ব্যবহারকারীর জন্য একটি "ডিফল্ট" পরিবেশ তৈরি করে, যাতে কমান্ড রান চালানো হয় যেন যে এটি ব্যবহারকারী ব্যবহারকারীর ছিল কলিং ব্যবহারকারী (যা প্রত্যাশিত আচরণ), এবং এইভাবে নটিলাস চলছে যেমন sudo nautilusএকটি ফোল্ডার খোলার উচিত /rootফোল্ডার এবং /home/yourusername

তাই:

এর মতো কিছু করা sudo source script.shএবং sudo commandএটি কাজ করা সত্ত্বেও পরবর্তী সময়ে কোনও পরিবর্তনশীল সেট করতে এটি সফল হবে না sudo command

অর্ডার এনভায়রনমেন্ট ভেরিয়েবল পাস করার জন্য, আপনাকে পরিবেশ সংরক্ষণে উবুন্টু বলুন হাসবো পারেন (মাধ্যমে -Eসুইচ এবং তোমাদের sudoers ফাইলে যথাযত অনুমতির থাকার) এবং / অথবা যেমন কমান্ড জন্য এটি সেটিং sudo VAR1=VALUE1 VAR2=VALUE2 command


4

ব্যাশ প্রক্রিয়া বিকল্প ব্যবহার করে আপনি করতে পারেন:

source <(sudo cat /etc/bash.bashrc)

1
এটি কীভাবে নতুন সেটিংসের সাহায্যে একটি রুট শেল শুরু করতে সহায়তা করবে, এটি ওপি যা করছে?
মারু

1
ওপি প্রকৃতপক্ষে জিজ্ঞাসা করছিল যে কীভাবে শেল থেকে "... নতুন ফাইলটি পুনরায় লোড করা যায় ..." যা sudoপ্রোফাইল অ্যাক্সেস করতে ব্যবহার করা প্রয়োজন। sudo: source: command not foundউল্লিখিত সমস্যাটি এড়িয়ে গিয়ে উপরের প্রোফাইল প্রোফাইল আমদানির একটি উপায় সরবরাহ করে ।
টমডটম টম

"একমাত্র বিষয় - নতুন পরিবেশের ভেরিয়েবলগুলি কেবলমাত্র আমার বর্তমান ব্যবহারকারীর জন্যই উপলব্ধ ছিল - এবং যখন আমি সুডো ব্যবহার করি তখন তা উপেক্ষা করা হত।"
মুড়ু

3

মার্কোস যেমন বলেছেন , এখানে আপনার প্রধান সমস্যাটি হ'ল এটি sourceএকটি শেল বিল্টিন কমান্ড যা কেবল চালিত শেল প্রক্রিয়াটিকেই প্রভাবিত করে।

সহজ সমাধানটি হ'ল মূল হিসাবে নতুন শেলটি শুরু করা এবং বাশ /etc/bash.bashrcশুরু হওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে এটি পড়বে । এটা ঠিক যেমন বলা সহজ

sudo bash

2

টার্মিনালটি বন্ধ এবং পুনরায় খোলার ফলে জিনিসগুলি পরিবর্তন করা উচিত নয়। ডিফল্টরূপে, sudo পরিবেশ বিচ্ছিন্ন করে। এটি অক্ষম করতে, sudo- এ যোগ করুন।


2

ত্রুটিটি ঘটেছিল কারণ আপনি যে বাইনারিটি কমান্ড লাইন থেকে কল করার চেষ্টা করছেন সেটি কেবলমাত্র বর্তমান ব্যবহারকারীর PATH ভেরিয়েবলেরই একটি অংশ, তবে রুট ব্যবহারকারীর পাঠের অংশ নয়।

আপনি যে বাইনারিটি অ্যাক্সেস করার চেষ্টা করছেন তার পথ চিহ্নিত করে আপনি এটি যাচাই করতে পারেন। আমার ক্ষেত্রে আমি "বেটারক্যাপ-এনজি" কল করার চেষ্টা করছিলাম। তাই আমি দৌড়েছি,

$ which bettercap-ng
/home/user/work/bin/bettercap`

এই অবস্থানটি আমার মূল ব্যবহারকারীর PATH এর অংশ কিনা তা আমি পরীক্ষা করে দেখেছি।

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

সুতরাং সুডো বাইনারিটি খুঁজে পাচ্ছে না যা আমি কমান্ডলাইন থেকে কল করার চেষ্টা করছি। অতএব ত্রুটি কমান্ড পাওয়া যায়নি ফিরে।

নীচের মত বাইনারি কল করার সময় আপনি বর্তমান ব্যবহারকারীর PATH ব্যবহার করতে sudo নির্দেশনা করতে পারেন।

sudo -E env "PATH=$PATH" [command] [arguments]

প্রকৃতপক্ষে, এটির বাইরে একটির নামকরণ করা যেতে পারে:

alias mysudo='sudo -E env "PATH=$PATH"'

আসল সুডোর পরিবর্তে নিজের নামটির নাম সুডো করাও সম্ভব।

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