উত্তর:
অনুমতি অস্বীকৃত
স্ক্রিপ্ট চালানোর জন্য ফাইলের অবশ্যই একটি নির্বাহযোগ্য অনুমতি বিট সেট থাকতে হবে ।
লিনাক্স ফাইলের অনুমতিগুলি পুরোপুরি বুঝতে আপনি 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 ভেরিয়েবলের মধ্যে উপস্থিত না, সুতরাং আদেশটি ত্রুটিটি খুঁজে পায় নি ।
sudo
's PATH
ব্যবহারকারীর হিসাবে একই?
আমি এখন অবধি এখানে অন্যান্য সমাধানগুলি কিছু সিস্টেমের সংজ্ঞার উপর ভিত্তি করে তৈরি করেছি, তবে প্রকৃতপক্ষে সঠিকভাবে প্রার্থনা করার sudo
মাধ্যমে বর্তমান PATH
( env
কমান্ড সহ) এবং / অথবা বাকী পরিবেশ ( -E
বিকল্প সহ) ব্যবহার করা সম্ভব possible :
sudo -E env "PATH=$PATH" <command> [arguments]
প্রকৃতপক্ষে, এটির বাইরে একটির নামকরণ করা যেতে পারে:
alias mysudo='sudo -E env "PATH=$PATH"'
( sudo
মূলটি প্রতিস্থাপন করে নিজের নামটিরও নামকরণ করা সম্ভব sudo
))
command not found
উবুন্টু ডিসট্রোতে সমস্যা সমাধানের জন্য সঠিক এবং সর্বাধিক মান সমাধান । ধন্যবাদ মানুষ.
./bashrc
এটির অধিবেশনগুলির মধ্যে সংরক্ষণের জন্য আপনি নিজের নামটি যুক্ত করতে পারেন
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
/usr/local/bin
সুপার ব্যবহারকারী PATH- র ডিরেক্টরিতে ( উদাহরণস্বরূপ) ডিরেক্টরিগুলির মধ্যে একটিতে আপনি আপনার স্ক্রিপ্টের জন্য একটি নরম লিঙ্ক তৈরি করতে পারেন । এটি তখন সুডোর জন্য উপলব্ধ হবে।
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
কোন ডিরেক্টরিটিতে নরম লিঙ্কটি রাখা উচিত তার একটি ধারণা পেতে এই উত্তরটি দেখুন ।
দেখে মনে হচ্ছে যে লিনাক্স "কমান্ড পাওয়া যায়নি" বলবে এমনকি আপনি ফাইলটি স্পষ্টভাবে পাথ প্রদান করলেও।
[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
এটি কিছুটা বিভ্রান্তিকর ত্রুটি, তবে সম্ভবত এটি প্রযুক্তিগতভাবে সঠিক। কোনও এক্সিকিউটেবল না হওয়া পর্যন্ত কোনও ফাইল কমান্ড নয় এবং এটি খুঁজে পাওয়া যায় না।
ঠিক আছে এটি আমার সমাধান: ~ / .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 প্রতিবারই করতে পারেন।
লক্ষ্য করুন যে আমার প্যাথ সংযোজন করার সময় আমার স্পষ্ট হওয়া দরকার যেহেতু সুপারভাইজারের জন্য হোম / রুট
উপরের গাইডগুলিতে যদি সমস্যা হয় তবে chmod u+x foo.sh
তার পরিবর্তে চেষ্টা করুন chmod +x foo.sh
। অন্যান্য সমাধান যখন না দেয় তখন এটি আমার পক্ষে কাজ করে।