আমি ঘটনাক্রমে ডিরেক্টরিতে chmod -R + x করেছি আমি কীভাবে সঠিক অনুমতিগুলি পুনরুদ্ধার করব?


20

ভাল, নির্দিষ্ট করা, এটি ছিল chmod -R 755। এখন প্রতিটি ফাইল এক্সিকিউটেবল, যা আমি চাই না। আমি ভাবছি যে ফাইলগুলির জন্য প্রতিটি ফাইলের প্রথম দুটি বাইটের দিকে নজর দেওয়া উচিত #!, তবে এটি কি সমস্ত কিছু কভার করবে? আমি কি পরিবর্তে fileসমস্ত কিছুর দিকে তাকাতে এবং আমার সিদ্ধান্তটিকে ভিত্তি করে ব্যবহার করব? অথবা, সম্ভবত আরও কি এটি করার আরও ভাল উপায় আছে?

এক্সিকিউটেবল হতে পারে না এমন ফাইলগুলিতে পুনরাবৃত্তভাবে ডিরেক্টরি এবং সেট-এক্স দিয়ে যাওয়ার পছন্দনীয় উপায় কী?


আপনি এটি /অন্য কোনও ডিরেক্টরিতে করেছেন?
gvkv

1
@gvkv: নয় /, একটি ডিরেক্টরি আমার সম্পূর্ণ মালিকানাধীন।
ল্যারি ওয়াং

1
ভবিষ্যতে @ ল্যারি আপনার সমস্ত অনুমতিতে ধর্ষণ করার পরিবর্তে সম্ভবত + x এর কিছু বৈকল্পিক ব্যবহার করা উচিত এবং সমস্ত ফাইলগুলিতে লেখার কারণ হতে পারে।
xenoterracide

@ এক্সেনোটেরাকাইড: সম্মত। আমি যা চেয়েছিলাম তা হ'ল আমার মতো গ্রুপকেও একই অনুমতি দেওয়া (যা শেষ হয়েছিল!), টাইপ করার আগে আমি যথেষ্ট চিন্তাভাবনা করি নি।
ল্যারি ওয়াং

আমরা কতগুলি ফাইলের কথা বলছি? কতজন কার্যকর হতে হবে? ফাইলের নাম থেকে বলার কোনও উপায় আছে কি?
ডেভিড থর্নলে

উত্তর:


15

এখানে কোন ম্যাজিক বুলেট নেই। অনুমতিগুলি সর্বদা অনর্থক নয় এমন তথ্য বহন করে।

যদি আপনি এটি কোনও সিস্টেম ডিরেক্টরিতে করে থাকেন তবে আপনার সিস্টেমটি খুব খারাপ অবস্থায় থাকবে, কারণ আপনাকে সেটুয়েড এবং সেটগিড বিটগুলি সম্পর্কে, এবং যে ফাইলগুলি বিশ্ব-পঠনযোগ্য নয় এবং ফাইলগুলি সম্পর্কে চিন্তা করতে হবে যেগুলি গ্রুপ-বা বিশ্ব-লিখনযোগ্য বলে মনে করা হয়।

প্রতি ব্যবহারকারী ডিরেক্টরিতে আপনাকে এমন ফাইলগুলি নিয়ে চিন্তিত হতে হবে যা বিশ্ব-পঠনযোগ্য নয়। সেখানে কেউ আপনাকে সাহায্য করতে পারে না।

এক্সিকিউটিবিলিটি হিসাবে, থাম্বের একটি ভাল নিয়ম হ'ল এটি কার্যকর করা যেতে পারে এমন দেখাচ্ছে না এমন কিছুই করা, অযৌক্তিক হতে হবে। কার্নেল স্ক্রিপ্টগুলি সম্পাদন করতে পারে যার প্রথম দুটি বাইট #!, ELF বাইনারি \x7fELFযেখানে প্রথম চার বাইট যেখানে \x7f12 এর মান সহ বাইট এবং কয়েকটি বিরল ফাইল প্রকার (আউটআউট, যার সাথে নিবন্ধীকৃত কিছু binfmt_misc) রয়েছে exec সুতরাং নিম্নলিখিত কমান্ডটি আপনার অনুমতিগুলি একটি যুক্তিসঙ্গত অবস্থায় ফিরিয়ে আনতে হবে (ধরে নেওয়া বাশ 4 বা zsh, অন্যথায় findডিরেক্টরি বৃক্ষটি অতিক্রম করতে ব্যবহার করতে হবে; সতর্কতা, সরাসরি ব্রাউজারে টাইপ করা):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

নোট করুন যে লিনাক্সে এবং সম্ভবত এসিএল সমর্থন সহ অন্যান্য ইউনিটগুলিতে ডিরেক্টরি গাছের অনুমতিগুলি ব্যাকআপ ও পুনরুদ্ধার করার একটি সহজ উপায় রয়েছে:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

ধন্যবাদ! ভাগ্যক্রমে, আমি মনে করি সবকিছু এই দুটি বিভাগে পড়ে। এটি যদি কিছু মিস করে তবে আমি এটির সাথে পরে বিষয়টি মোকাবেলা করতে পারি।
ল্যারি ওয়াং 21

মনে রাখবেন যে **/*প্রয়োজন globstar
ক্রিস ডাউন

আমি এই স্ক্রিপ্টে দুটি পরিবর্তন সুপারিশ করব। এক, findগ্লোবস্টারের পরিবর্তে ব্যবহার করুন ; দুটি, মাথার দিকে তাকাতে পরিবর্তে, fileএটি কী তা দেখতে কমান্ডটি ব্যবহার করুন এবং সেখান থেকে শাখা করুন।
শাদুর

@ শাদুর এর findচেয়ে কম নির্ভরযোগ্য globstar, globstarপ্রায় প্রতিটি ক্ষেত্রেই তার চেয়ে ভাল।
ক্রিস ডাউন

1
@ গিলস যেমন "আপনার কাছে থাকে তবে এটি অনেক উচ্চতর" হিসাবে পছন্দনীয়, কেবল এটি দ্রুত নয়, এটি আরও নির্ভরযোগ্য (এবং অপ্রত্যাশিত এসএনএএফইউ নেই)।
ক্রিস ডাউন

6

আমি বিশ্বাস করি তুমি এরকম কিছু চাইবে

find dir -type f -exec chmod ugo-x '{}' +

এটি নিয়মিত সমস্ত ফাইল সন্ধান করে, পুনরাবৃত্তভাবে ডিরে (এটি ডিরেক্টরি এবং ডিভাইসগুলি বাদ দেয়) এবং এক্সিকিউটেবল বিটটি সরিয়ে দেয়।

আমি এখানেই শুরু করব, এবং তারপরে এমন ফাইল তৈরির দিকে কাজ করব যা এক্সিকিউটেবল, এক্সিকিউটেবল হতে পারে।

নীচেরগুলিতে যেমনটি আপনি চেয়েছিলেন ঠিক তেমনভাবে কাজ করা উচিত (এটি সমস্ত নিয়মিত ফাইলগুলি সন্ধান করবে, # এর জন্য গ্রেপ করুন এবং তারপরে x বিটগুলি খুঁজে না পাওয়া সরিয়ে ফেলুন)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

সম্ভবত উপরের একটি ভাল সংস্করণ (কম পাইপ)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

3
এটি grep -L '^#!'অন্তত তৈরি করুন (উদ্ধৃতিগুলি প্রয়োজনীয়, এবং ^লাইনের শুরুতে ম্যাচ করার ক্ষেত্রে সীমাবদ্ধ) তবে এটি যে #!কোনও লাইনের সাথে মেলে তা এখনও খুব অনুমোদিত নয় । xargsশূন্যস্থান বা উদ্ধৃতিচিহ্নযুক্ত ফাইলের নাম ব্যবহার করে ব্যর্থ হবে; ব্যবহার xargs -d '\n'(জিএনইউ প্রয়োজন xargs)।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

0

ভাল, একটি শেবাং লাইন ছাড়া ফাইলটি শেল স্ক্রিপ্ট হিসাবে নামমাত্র সহ চালানো হবে /bin/sh। আপনার ধারণাটি একটি ভাল শুরু এবং এই ধারণাটি অনুসারে যে প্রশ্নে থাকা ডিরেক্টরিতে মিশন-সমালোচনামূলক ফাইল নেই সেখানে কিছু grepএবং chmodকম্বো চালানো খুব বেশি ঝুঁকিপূর্ণ নয় । আপনি মিথ্যা পজিটিভের মুখোমুখি হতে পারেন, অর্থাত্, শেবাং লাইনযুক্ত এমন ফাইল যা তাদের এক্সিকিউটেবল বিট সেট করার উদ্দেশ্যে নয় কিন্তু ডিরেক্টরিতে কী রয়েছে তার উদ্দেশ্য সম্পর্কে আরও তথ্য না জেনে কেবল আপনিই সিদ্ধান্ত নিতে পারেন যে এটির জন্য আপনার কাছে উল্লেখযোগ্য অস্তিত্বের হুমকি রয়েছে কিনা only সিস্টেম এবং / অথবা ডেটা।


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