Sudo ব্যবহার করার সময় কমান্ড পাওয়া যায় নি


146

foo.shআমার হোম ফোল্ডারে আমার কাছে একটি স্ক্রিপ্ট কল আছে ।

আমি যখন এই ফোল্ডারে নেভিগেট করি এবং প্রবেশ ./foo.shকরি তখন আমি পাই

-bash: ./foo.sh: Permission denied

আমি যখন ব্যবহার করি sudo ./foo.sh, আমি পাই

sudo: foo.sh: command not found

কেন এটি ঘটে এবং আমি কীভাবে এটি ঠিক করতে পারি?

উত্তর:


151

অনুমতি অস্বীকৃত

স্ক্রিপ্ট চালানোর জন্য ফাইলের অবশ্যই একটি নির্বাহযোগ্য অনুমতি বিট সেট থাকতে হবে

লিনাক্স ফাইলের অনুমতিগুলি পুরোপুরি বুঝতে আপনি chmodকমান্ডের ডকুমেন্টেশন অধ্যয়ন করতে পারেন । chmod , পরিবর্তন মোডের একটি সংক্ষিপ্তসার , হ'ল কমান্ড যা কোনও ফাইলের অনুমতি সেটিংস পরিবর্তন করতে ব্যবহৃত হয়।

আপনার স্থানীয় সিস্টেমের জন্য chmod ডকুমেন্টেশন পড়তে, চালাতে man chmodবা info chmodকমান্ড লাইন থেকে। একবার পড়া এবং বুঝতে পারলে আপনার চলমান আউটপুট বুঝতে সক্ষম হওয়া উচিত ...

ls -l foo.sh

... যা ফাইলের মালিক, গ্রুপের মালিক এবং ফাইল মালিক নয় এমন ফাইল বা মালিক যে গ্রুপের সদস্য নয় তাদের প্রত্যেকের জন্য READ, WRITE এবং এক্সিকিউটি অনুমতিগুলি তালিকাভুক্ত করবে (শেষ অনুমতি গ্রুপটি মাঝে মাঝে উল্লেখ করা হয়) "বিশ্ব" বা "অন্যান্য" হিসাবে)

আপনার ক্ষেত্রে অনুমতি অস্বীকৃত ত্রুটিটি কীভাবে সমস্যার সমাধান করবেন তার সংক্ষিপ্তসার এখানে দেওয়া আছে ।

$ ls -l foo.sh                    # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
 ^^^ | ^^^   ^^^^^^^ ^^^^^
  |  |  |       |       | 
Owner| World    |       |
     |          |    Name of
   Group        |     Group
             Name of 
              Owner 

মালিক অ্যাক্সেস rw লিখেছেন এবং লিখতে পেরেছেন তবে - ইঙ্গিত দেয় যে কার্যকর করার অনুমতি অনুপস্থিত

chmodকমান্ড সংশোধন করা হয়েছে যে। (গ্রুপ এবং অন্যান্যরা কেবল ফাইলে সেট করার অনুমতি পড়তে পারে, তারা এটিতে লিখতে বা এটি সম্পাদন করতে পারে না)

$ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
   ^  ^  ^

foo.sh লিনাক্স সম্পর্কিত হিসাবে এখন কার্যকর করা যায়।

কমান্ডে সুডো ব্যবহারের ফলাফল পাওয়া যায় নি

আপনি যখন sudo ব্যবহার করে একটি কমান্ড চালাবেন আপনি কার্যকরভাবে এটি সুপারইউসার বা মূল হিসাবে চালাচ্ছেন।

যে কারণে রুট ব্যবহারকারীরা আপনার কমান্ডটি সন্ধান করছে না তার কারণটি সম্ভবত এটি হতে পারে যে PATHরুটের জন্য পরিবেশের ভেরিয়েবলটি যেখানে foo.shঅবস্থিত ডিরেক্টরিটি অন্তর্ভুক্ত করে না । সুতরাং আদেশটি পাওয়া যায় না।

PATH এনভায়রনমেন্ট ভেরিয়েবলের ডিরেক্টরিগুলির একটি তালিকা রয়েছে যা কমান্ডগুলির জন্য অনুসন্ধান করা হয়। প্রতিটি ব্যবহারকারী তাদের প্রয়োজন অনুসারে নিজস্ব PATH ভেরিয়েবল সেট করে। এটি চালানোর জন্য সেট করা আছে তা দেখতে

env | grep ^PATH

উপরের envকমান্ডটি চালানোর কিছু নমুনা আউটপুট এখানে প্রথমে সাধারণ ব্যবহারকারী হিসাবে এবং তারপরে sudo ব্যবহার করে রুট ব্যবহারকারী হিসাবে দেওয়া হয়

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

মনে রাখবেন যে একইরকম হলেও এই ক্ষেত্রে PATH- র মধ্যে থাকা ডিরেক্টরিগুলি অ-সুবিধাযুক্ত ব্যবহারকারী (rkielty) এবং সুপার ব্যবহারকারী এক নয়

যে ডিরেক্টরিটিতে foo.shথাকে সেগুলি মূল ব্যবহারকারীর PATH ভেরিয়েবলের মধ্যে উপস্থিত না, সুতরাং আদেশটি ত্রুটিটি খুঁজে পায় নি


1
@ নাকিলন যদি আপনি কোনও বিবরণে পুরো বিশদটি দিয়ে থাকেন তবে আমার এটি আরও আপনার জন্য সমস্যা সমাধান করতে সক্ষম হওয়া উচিত। সমস্যাটি সম্ভবত শেলটি (আপনার প্রথম কমান্ড শেল বা সুডো দ্বারা চালিত শেল) মূল্যায়ন করেছে $ পিডাব্লুডি
রব কিয়েলটি

6
@Rob: তাই কিভাবে এক করতে না sudo's PATHব্যবহারকারীর হিসাবে একই?
টম

1
@ রব: এর মধ্যে আমি একটি উপায় খুঁজে পেয়েছি (নীচে আমার উত্তর দেখুন)।
টম

1
আপনি যেভাবে ব্যাখ্যা করেছেন তা আমি পছন্দ করি! ধন্যবাদ :)
কাস্পারভ

1
@ টম আপনি / ইত্যাদি / sudoers এর নিরাপদ_পথটি পরিবর্তন করতে পারেন
ডেনিসলি

98

আমি এখন অবধি এখানে অন্যান্য সমাধানগুলি কিছু সিস্টেমের সংজ্ঞার উপর ভিত্তি করে তৈরি করেছি, তবে প্রকৃতপক্ষে সঠিকভাবে প্রার্থনা করার sudoমাধ্যমে বর্তমান PATH( envকমান্ড সহ) এবং / অথবা বাকী পরিবেশ ( -Eবিকল্প সহ) ব্যবহার করা সম্ভব possible :

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

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

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

( sudoমূলটি প্রতিস্থাপন করে নিজের নামটিরও নামকরণ করা সম্ভব sudo))


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

4
আমি বিশ্বাস করি যে এটি command not foundউবুন্টু ডিসট্রোতে সমস্যা সমাধানের জন্য সঠিক এবং সর্বাধিক মান সমাধান । ধন্যবাদ মানুষ.
ওমর তারিক

./bashrcএটির অধিবেশনগুলির মধ্যে সংরক্ষণের জন্য আপনি নিজের নামটি যুক্ত করতে পারেন
জর্জ

19

Sudo-নিরাপদ_পথের জন্য চেক করুন

[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

যদি $PATHওভাররাইড হয়ে থাকে তবে ব্যবহার visudoএবং সম্পাদনা করুন/etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

ধন্যবাদ! এটি কমান্ডগুলি চালাতে না পেরে সুডোর একটি রহস্য সমাধান করতে সহায়তা করে।
ইভজেনি গোল্ডিন ​​6'14

7
  1. আপনার স্ক্রিপ্টে অনুমতি কার্যকর করেছে কিনা তা পরীক্ষা করে দেখুন। অর্থাতchmod +x foo.sh
  2. পরীক্ষা করে দেখুন যে স্ক্রিপ্টের প্রথম লাইনটি এই জাতীয় #!/bin/shকিছু some
  3. সুডোর জন্য আপনি ভুল ডিরেক্টরিতে রয়েছেন। পরিক্ষা করsudo pwd

5

/usr/local/binসুপার ব্যবহারকারী PATH- র ডিরেক্টরিতে ( উদাহরণস্বরূপ) ডিরেক্টরিগুলির মধ্যে একটিতে আপনি আপনার স্ক্রিপ্টের জন্য একটি নরম লিঙ্ক তৈরি করতে পারেন । এটি তখন সুডোর জন্য উপলব্ধ হবে।

chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo

কোন ডিরেক্টরিটিতে নরম লিঙ্কটি রাখা উচিত তার একটি ধারণা পেতে এই উত্তরটি দেখুন ।


2

দেখে মনে হচ্ছে যে লিনাক্স "কমান্ড পাওয়া যায়নি" বলবে এমনকি আপনি ফাইলটি স্পষ্টভাবে পাথ প্রদান করলেও।

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0

এটি কিছুটা বিভ্রান্তিকর ত্রুটি, তবে সম্ভবত এটি প্রযুক্তিগতভাবে সঠিক। কোনও এক্সিকিউটেবল না হওয়া পর্যন্ত কোনও ফাইল কমান্ড নয় এবং এটি খুঁজে পাওয়া যায় না।


1

ঠিক আছে এটি আমার সমাধান: ~ / .bash_aliases মধ্যে কেবল নিম্নলিখিতটি যুক্ত করুন:

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
   export PATH=$PATH:/home/your_user/bin 
fi

ভাল খবর! এখন আপনি sudo দিয়ে নিজের স্ক্রিপ্টগুলি সম্পাদন করতে পারেন বা রূট হিসাবে সেট না করে PATH = $ PATH: / home / your_user / bin প্রতিবারই করতে পারেন।

লক্ষ্য করুন যে আমার প্যাথ সংযোজন করার সময় আমার স্পষ্ট হওয়া দরকার যেহেতু সুপারভাইজারের জন্য হোম / রুট


1

উপরের গাইডগুলিতে যদি সমস্যা হয় তবে chmod u+x foo.shতার পরিবর্তে চেষ্টা করুন chmod +x foo.sh। অন্যান্য সমাধান যখন না দেয় তখন এটি আমার পক্ষে কাজ করে।


1

উপরে চমৎকার উত্তর আছে। যদি, তাদের চেষ্টা করার পরেও আপনি command not foundপুরো ফাইল পাথ দিয়ে আবার চেষ্টা করতে পারেন:

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