কোনও ফাইলের গোষ্ঠী অনুমতিগুলি কীভাবে পরীক্ষা করবেন to


9

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

এটাই. যে হিসাবে সহজ। যাহোক:

  1. আমারও এটি পোর্টেবল হওয়ার দরকার।
  2. test -w <file এটি গ্রুপ লিখনযোগ্য কিনা তা আমাকে বলবে না।
  3. মানুষের আউটপুট ls -ldমানুষের পক্ষে দুর্দান্ত, তবে স্ক্রিপ্টগুলি সম্পর্কে নিশ্চিত নয়। প্রযুক্তিগতভাবে আমি আউটপুটকে পার্স করতে পারি যেমন drwxrwxr-xগ্রুপ বিটগুলি বের করতে, তবে এটি ভঙ্গুর বলে মনে হয়।
  4. এর জন্য ইন্টারফেস statওএস এক্স এবং অন্যান্য সিস্টেমের মধ্যে সম্পূর্ণ বেমানান।
  5. find <file> -perm ... সম্ভবত উত্তর হতে পারে না?

আপনার কি গোষ্ঠী অনুমতি বিট পরীক্ষা করা দরকার, বা আপনার কোনও নির্দিষ্ট গোষ্ঠীর লেখার অনুমতি আছে কিনা তা খতিয়ে দেখার দরকার? গোষ্ঠীটি (বা ব্যবহারকারী) একটি এসিএল মাধ্যমে লেখার অনুমতি পেতে পারে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

শুধু গ্রুপ অনুমতি বিট। কোনও নির্দিষ্ট গোষ্ঠী প্রাসঙ্গিক নয়।
মিসলাভ

উত্তর:


8

পদ্ধতি # 1 - স্ট্যাটাস

statঅনুমতি বিট পেতে আপনি কমান্ডটি ব্যবহার করতে পারেন । statবেশিরভাগ ইউনিক্সে উপলব্ধ (ওএসএক্স, বিএসডি, আমি যা খুঁজে পেতে পারি তা থেকে নয়) not ওএসএক্স এবং বিএসডি বাদে বেশিরভাগ ইউনিক্সে এটি কাজ করা উচিত যা আমি খুঁজে পেতে পারি।

$ stat -c "%a" <file>

উদাহরণ

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

এই আদেশটি ব্যবহার করুন:

$ stat -c "%a" afile.txt
664

এবং grepগোষ্ঠীগুলির অনুমতিগুলির মোডটি 6 বা 7 হয় কিনা তা দেখতে একটি সাধারণ ব্যবহার করুন।

$ stat -c "%a" afile.txt | grep ".[67]."

জন্য OSX ও বাসদ তোমাদের এই ফর্ম ব্যবহার প্রয়োজন চাই stat, stat -f(অথবা হয়ত stat -x), এবং সেই অনুযায়ী বিশ্লেষণ। বিকল্পগুলি statপৃথক হওয়ার কারণে আপনি এই আদেশটি কোনও lsb_release -aকমান্ডে মুড়িয়ে রাখতে পারেন এবং ওএসের ভিত্তিতে উপযুক্ত সংস্করণটি কল করতে পারেন। আদর্শ নয় তবে কার্যক্ষম। বুঝতে পারেন যে lsb_releaseএটি কেবল লিনাক্স ডিস্ট্রোজের জন্য উপলভ্য তাই অন্যান্য ইউনিক্স ওএস পরীক্ষার জন্য অন্য বিকল্পের পরিকল্পনা করা দরকার।

পদ্ধতি # 2 - সন্ধান করুন

আমি মনে করি যদিও এই আদেশটি আপনাকে আরও ভালভাবে পরিবেশন করতে পারে। আমি findএবং printfসুইচ ব্যবহার করে ।

উদাহরণ

$ find a -prune -printf '%m\n'
664

পদ্ধতি # 3 - পার্ল

পার্ল হ'ল আপনি যে ওএসগুলি কভার করার চেষ্টা করছেন তার উপর নির্ভর করে এটি করার আরও পোর্টেবল উপায়।

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

দ্রষ্টব্য: উপরেরগুলি stat()ফাইল সিস্টেম বিটগুলি অনুসন্ধান করার জন্য পার্লের ফাংশনটি ব্যবহার করে।

আপনি অ্যারে ব্যবহার না করে @pv, এবং stat()সরাসরি আউটপুট নিয়ে কাজ করে আরও জটিল করে তুলতে পারেন :

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

আমি মনে করি আপনি তাঁর পয়েন্ট 4 মিস করেছেন The statবিভিন্ন সিস্টেমে কমান্ডটি বিভিন্নভাবে পরিবর্তিত হয় এবং বহনযোগ্য নয়।
জর্ডানম

@ জর্ডানম - ধন্যবাদ আমি এটি দেখেছি, একটি বিকল্প খুঁজছিলাম। আমি মনে find . -printfকরি এটি করতে পারে তবে এটি OSX 'অনুসন্ধানে পাওয়া যায় কিনা তা নির্ধারণ করতে পারে না।
slm

1
আমি এটি POSIX2008 গাইডে রেফারেন্স পাইনি, সুতরাং আমি রাজি হতে আগ্রহী। আমি অন্য কোন পদ্ধতি সম্পর্কে নিশ্চিত নই। আমি মনে করি আপনাকে এখানে বুলেটটি কামড়তে হবে এবং কোন ওএসটি সনাক্ত করতে হবে এবং অ্যাপ্রপকে কল করতে হবে। কমান্ড, সেরা পদ্ধতির বলে মনে হবে।
slm

1
আমি কোনও স্ট্যান্ডার্ড শেল ইউটিলিটি ব্যবহার করে কোনও পদ্ধতির কথা ভাবতে পারি না। সে কারণেই আমার উত্তরটি পার্ল ব্যবহার করে।
জর্ডানম

1
@ জোর্ডানম - দুর্দান্ত মন আমি খুব 8-) পার্ল সমাধানে কাজ করছিলাম
স্ল্যাম

1

একটি বিকল্প ব্যবহার করা হয় perl, যা পোর্টেবল হবে সর্বত্র perlউপলব্ধ। এটি ছাড়া একটি ইউনিক্স সিস্টেম খুঁজে পাওয়া শক্ত। এটি কীভাবে শেল স্ক্রিপ্টে সংহত করা যায় তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

অনুরূপ perlউদাহরণ স্ট্যাট পার্লডোকে পাওয়া যাবে ।


1

আমি lsপার্সিং শেষ করেছি:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

আমি @ স্ল্যামের বিস্তৃত উত্তরের জন্য কৃতজ্ঞ, তবে অন্য কোনও পদ্ধতির কোনওটিই সোজা নয়। statপদ্ধতি আবরণ OS X এর অন্তত দুটি ভিন্ন আমন্ত্রণ লিখতে আমাকে প্রয়োজন, এবং হবে এমনকি পরে এটি অকট্যাল উপস্থাপনা যা আমি এখনও গাণিতিক আবেদন করতে হবে ফেরৎ। পার্ল পদ্ধতিটি ঠিক আছে তবে আমাকে এ জাতীয় সাধারণ কাজের জন্য একজন দোভাষী চালু করতে হবে এবং আমি এটিকে সহজ এবং কেবল প্যাসিক্স ব্যবহারগুলি ব্যবহার করে রাখতে চাই।


2
আপনি ব্যাশ ব্যবহার করছেন, কেবল পসিক্স নয়। perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
পজিক্সে

0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

সমস্ত মানক ইউনিক্স / লিনাক্স সরঞ্জাম।

আমি মনে করি এটি গ্রুপ লেখার পক্ষে পোষ্য, তবে গ্রুপ পঠিত নয়। সেই সম্ভাবনায়, এটি হয় কেস স্টেটমেন্ট 2 | 3 | 6 | 7) বা গ্রেপ '[2 | 3 | 6 | 7]'

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