আমি যখন চালানোর চেষ্টা করি তখন ./script.sh
পেয়েছিলাম Permission denied
তবে যখন আমি চালাই তখন bash script.sh
সবকিছু ঠিক থাকে।
আমি কি ভুল করছি?
আমি যখন চালানোর চেষ্টা করি তখন ./script.sh
পেয়েছিলাম Permission denied
তবে যখন আমি চালাই তখন bash script.sh
সবকিছু ঠিক থাকে।
আমি কি ভুল করছি?
উত্তর:
এর অর্থ আপনার কাছে এক্সিকিউট করার অনুমতি বিট সেট নেই script.sh
। চলমান অবস্থায় bash script.sh
, আপনার কেবল পড়ার অনুমতি দরকার script.sh
। দেখুন "বাশ স্ক্রিপ্ট.শ" এবং "./script.sh" চালানোর মধ্যে পার্থক্য কী? আরও তথ্যের জন্য.
আপনি এটি চালিয়ে যাচাই করতে পারেন ls -l script.sh
।
আপনার এমনকি নতুন বাশ প্রক্রিয়া শুরু করার দরকারও পড়তে পারে না। অনেক ক্ষেত্রে, আপনি কেবল আপনার বর্তমান ইন্টারেক্টিভ শেলটিতে স্ক্রিপ্ট কমান্ড চালাতে source script.sh
বা চালাতে পারেন . script.sh
। আপনি সম্ভবত একটি নতুন বাশ প্রক্রিয়া শুরু করতে চান যদি স্ক্রিপ্টটি বর্তমান ডিরেক্টরি পরিবর্তন করে বা অন্যথায় বর্তমান প্রক্রিয়ার পরিবেশ পরিবর্তন করে।
যদি পসিক্স অনুমতি বিটগুলি সঠিকভাবে সেট করা থাকে তবে অ্যাক্সেস কন্ট্রোল লিস্টটি (এসিএল) আপনাকে বা আপনার গ্রুপটিকে ফাইল চালানো থেকে বিরত রাখতে কনফিগার করা হয়েছে। যেমন POSIX অনুমতিগুলি পরীক্ষা শেল স্ক্রিপ্টটি সম্পাদনযোগ্য কিনা তা নির্দেশ করে।
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
যাইহোক, ফাইল ফলাফল কার্যকর করার চেষ্টা এখানে:
$ ./t.sh
bash: ./t.sh: Permission denied
getfacl
কমান্ড কারণে দেখায়:
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
এই ক্ষেত্রে, আমার প্রাথমিক গোষ্ঠীটি domain users
এসিএলকে সীমাবদ্ধ রেখে বাতিল করা অনুমতিগুলি কার্যকর করেছে sudo setfacl -m 'g:domain\040users:rw-' t.sh
। এই বিধিনিষেধটি নিম্নলিখিত আদেশগুলির মধ্যে যে কোনও একটি দ্বারা উঠানো যেতে পারে:
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
দেখা:
পরিশেষে, স্ক্রিপ্টটি চালাতে না পারার জন্য এই নির্দিষ্ট ক্ষেত্রে কারণটি হ'ল স্ক্রিপ্টটিতে থাকা ফাইল-সিস্টেমটি noexec
বিকল্পটি মাউন্ট করা হয়েছিল । এই বিকল্পটি পজিক্স অনুমতিগুলি ওভাররাইড করে যে ফাইল সিস্টেমের কোনও ফাইল কার্যকর হতে বাধা দেয়।
এটি mount
সমস্ত মাউন্ট করা ফাইল সিস্টেমের তালিকা চালিয়ে চেক করা যেতে পারে ; মাউন্ট অপশনগুলি ফাইল সিস্টেমের সাথে সম্পর্কিত এন্ট্রিগুলিতে প্রথম বন্ধনীতে তালিকাভুক্ত করা হয়, যেমন
/dev/sda3 on /tmp type ext3 (rw,noexec)
আপনি স্ক্রিপ্টটিকে অন্য একটি মাউন্ট করা ফাইল সিস্টেমে স্থানান্তর করতে পারেন বা ফাইলসস্টেমটিকে পুনরায় সঞ্চালনের অনুমতি দিতে পারেন:
sudo mount -o remount,exec /dev/sda3 /tmp
দ্রষ্টব্য: আমি /tmp
এখানে উদাহরণ হিসাবে ব্যবহার করেছি যেহেতু বিকল্পগুলির সেটটি মাউন্ট করার জন্য সুরক্ষার ভাল কারণ রয়েছে ।/tmp
noexec,nodev,nosuid
চেষ্টা
chmod 755 script.sh
এটি ফাইলটি কার্যকর করতে সক্ষম করে। তারপরে চেষ্টা করুন,
./script.sh
আশা করি এটি কার্যকর হবে।
আমার উইন 7 এ অ্যাডমিনের সাথে চলমান সিএমডি; আমার কাছে .sh ফাইলগুলি সাইগউইন /৪ / বিন / ব্যাশের সাথে যুক্ত রয়েছে তবে এটি সেন্টিমিডি দ্বারা অবরুদ্ধ করা হয়েছিল। উপরোক্ত পরামর্শগুলির মধ্যে কোনওটিই সহায়তা করেনি (chmod, setfacl, মাউন্ট)।
নীচের সমাধানটি কাজ করেছে, এটি যখনই ফোল্ডার / ফাইল উইন 7-এ অ্যাডমিনের অ্যাক্সেসযোগ্য হয়ে যায়, যা প্রায়শই থাকে) এটি অ্যাডমিন স্লেজ-হাতুড়ি এসি-ফিক্সার:
Start > run cmd as Admin
c:\> script.sh
Access is denied.
cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
cmd> script.sh
Access is denied.
> assoc .sh
.sh=bash
> ftype bash
bash=C:\cygwin64\bin\bash.exe -- "%1" %*
> bash
$ FILE=c:/cygwin64/bin/bash.exe
$ FILE=${FILE////\\} # s,/,\,g
# Compare these permissions using accesschk by Mark Russinovich 2015
$ accesschk.exe -lq $FILE
$ accesschk.exe -lq c:/windows/system32/cmd.exe
# [large output not shown]
# === Solution: Change windows acl for bash ===
$ takeown /F $FILE /A > /dev/null
$ icacls $FILE /t /q /c /reset
$ icacls $FILE /t /q /c /grant :r Everyone:F
$ icacls $FILE /t /q /c /setowner Administrators
# ====
cmd> script.sh
OK .. invokes bash
getfacl script.sh
?