লক করা ফাইল থাকা বৃহত্তর ডিরেক্টরিতে কীভাবে গ্রুপের মালিককে পরিবর্তন করতে হয়


1

গোটা ডিরেক্টরিতে গ্রুপের মালিককে পরিবর্তন করার আদেশটি হ'ল:

chgrp -R newgroup dir_name

উদাহরণ স্বরূপ:

chgrp -R staff .

তবে যখন লক করা ফাইল বা ডিরেক্টরি dir_nameথাকে তখন এই কমান্ডটি ব্যর্থ হবে:

chgrp -R staff .
chgrp: ./file.txt: Operation not permitted

আপনি যদি সুপার ব্যবহারকারীর সুবিধাসমূহ দিয়ে কমান্ডটি চালনা করেন তবে এটিও ব্যর্থ হবে:

/usr/bin/sudo chgrp -R staff .
Password:
chgrp: ./file.txt: Operation not permitted

লক করা ফাইলগুলির সংখ্যা যদি কম হয় তবে কমান্ডটি ব্যবহারের মাধ্যমে একটি ম্যানুয়াল কাজ করতে হবে chflags

একটি নির্দিষ্ট uchgলক করা ফাইলের সাথে সম্পর্কিত একটি নির্দিষ্ট পতাকা ( ) রয়েছে কিনা তা পরীক্ষা করে দেখুন :

ls -@delO file.txt 
-rw-r--r--  1 bob  staff  uchg 32 Aug  8 11:38 file.txt

সাময়িকভাবে uchgপতাকা সরান :

chflags nouchg file.txt

পুনরাবৃত্তভাবে গ্রুপ পরিবর্তন করুন:

chgrp -R admin .

প্রাথমিক uchgপতাকাটি পুনরায় সেট করুন :

chflags uchg file.txt

তবে এই পদ্ধতিটি কয়েকশ লক করা ফাইল সহ একটি বিশাল ডিরেক্টরি কাঠামোর সাথে মানিয়ে নিতে পারে না। এই রেসিপিটি মোটেই স্কেল করে না।


লক করা ফাইলগুলি সমেত একটি সম্পূর্ণ ডিরেক্টরি কাঠামোর গোষ্ঠীর মালিককে পরিবর্তন করার জন্য সাধারণ সহজ পদ্ধতিটি কী?

লকড ফাইলযুক্ত ডিরেক্টরি পরিচালনা করার জন্য অনেক কমান্ডের সাথে একই সমস্যা দেখা দেয় তবে আমি এখানে ব্যবহারিক এবং সাধারণ ক্ষেত্রে ফোকাস করেছি।

উত্তর:


1

লক করা ফাইলগুলির সাথে সমস্যাযুক্ত একটি টার্গেট ডিরেক্টরিতে কাজ করার জন্য কমান্ডের জন্য একটি মোড়ক স্ক্রিপ্ট তৈরি করে আমি কীভাবে বিষয়টিটির সাথে একত্রীকরণ করব তার উদাহরণ নীচে দেওয়া হল ।chgrp

নামের একটি বাশ স্ক্রিপ্ট ব্যবহার করে chgrpld, আমি এটি একই কমান্ড লাইন আর্গুমেন্ট ( বিকল্পগুলি , অপারেন্ড এবং ডিরেক্টরি ) পাস করব যদি আমি chgrpকোনও ডিরেক্টরিতে এক্সিকিউট করি । মনে রাখবেন যে, আমার নামকরণ সম্মেলন অক্ষর যোগ করার জন্য কেবল ছিল ldপ্রতিনিধিত্বমূলক এটি লক ডিরেক্টরির মধ্যে এটি কাজ করে ডিরেক্টরি যে লক , বা না, এবং অথবা ধারণকারী ফাইল / ডিরেক্টরি যে লক খুব। সুতরাং যেখানে আমি সাধারণত ব্যবহার করি, উদাহরণস্বরূপ chgrp -R staff foo, যেখানে fooএকটি ডিরেক্টরি আছে , আমি তার chgrpld -R staff fooপরিবর্তে ব্যবহার করব । লিপিলক করা হয়নি এমন একটি ডিরেক্টরিতেও কাজ করার জন্য কোডিং করা হয়েছে এবং পাশাপাশি লক করা ফাইল সিস্টেমের অবজেক্টগুলিও নেই , সুতরাং ডিরেক্টরিকে লক্ষ্য করার সময় নিয়মিত প্রতিস্থাপন হিসাবে ব্যবহারের অনুমতি দিন , যদি আমি লকড ফাইল সিস্টেমের জিনিসগুলি পরীক্ষা করতে না চাই প্রথমে বা প্রথমে ব্যর্থ হয়েছে তবে যাইহোক ব্যবহার করতে হবে।chgrpldchgrpchgrpchgrpld

দ্রষ্টব্য: এই স্ক্রিপ্টটিতে সীমিত পরিমাণে ত্রুটি পরীক্ষার নিয়োগ দেওয়া হয়েছে, সীমিত পরীক্ষার শর্তে কাজ করার জন্য এটি যথেষ্ট। এটা তোলে নয় একটি ফাইল সিস্টেম বস্তুর নামে একটি এমবেডেড সম্পর্কে newline, যা আইএমও প্রথমে সেখানে অন্তর্গত নয় হ্যান্ডেল করতে কোডেড! প্রয়োজন হিসাবে সংশোধন করতে নির্দ্বিধায় / আপনার প্রয়োজনের স্যুট করতে চেয়েছিলেন, / যখন চেয়েছিলেন / প্রয়োজন হলে অতিরিক্ত ত্রুটি পরীক্ষা করে adding

পরীক্ষার পরিবেশটি অস্থায়ী ডিরেক্টরিতে ওএস এক্স 10.11.5 ছিল , নীচের তালিকায় দেখানো হয়েছে যে দুটি ডিরেক্টরি রয়েছে যার মধ্যে একটিতে একটি ফাইল রয়েছে এবং একটি ফাইল লক হয়েছে। এক ডিরেক্টরিটি / ফাইল সেট হয় admin গ্রুপ এবং অন্যান্য সেট হয় staff গ্রুপ এবং আমি হতে সবকিছু অনুপস্থিত করছি staff গ্রুপ । (অতিরিক্ত পরীক্ষার তথ্যের জন্য উত্তরের শেষে পরীক্ষার নোটটি দেখুন See)

টার্মিনাল আউটপুট দেখায়:

  • একটি পুনরাবৃত্ত ডিরেক্টরি ডিরেক্টরি।
  • ব্যবহারের চেষ্টা chgrp, এর ত্রুটি আউটপুট দেখাচ্ছে।
  • ব্যবহার করে chgrpld, ত্রুটি ছাড়াই কার্যকর করা হচ্ছে।
  • গ্রুপটি পরিবর্তিত হয়েছে তা দেখানোর জন্য আরেকটি পুনরাবৃত্ত ডিরেক্টরি ডিরেক্টরি ।

$ ls -lRO
total 0
drwxr-xr-x  3 user  staff  - 102 Aug  9 2:00 bar
drwxr-xr-x  3 user  admin  - 102 Aug  9 2:00 foo

./bar:
total 0
-rw-r--r--  1 user  staff  - 0 Aug  9 2:00 foo

./foo:
total 0
-rw-r--r--  1 user  admin  uchg 0 Aug  9 2:00 bar
$ chgrp -R staff foo
chgrp: foo/bar: Operation not permitted
$ chgrpld -R staff foo
$ ls -lRO
total 0
drwxr-xr-x  3 user  staff  - 102 Aug  9 2:00 bar
drwxr-xr-x  3 user  staff  - 102 Aug  9 2:00 foo

./bar:
total 0
-rw-r--r--  1 user  staff  - 0 Aug  9 2:00 foo

./foo:
total 0
-rw-r--r--  1 user  staff  uchg 0 Aug  9 2:00 bar
$ 

chgrpld বাশ স্ক্রিপ্ট তৈরি করতে এবং এটি কমান্ড প্রম্পটে উপলভ্য করতে :

টার্মিনালে:

  • টাইপ করুন, touch chgrpldএবং টিপুন enter
  • টাইপ করুন, open chgrpldএবং টিপুন enter

ব্রাউজার থেকে:

  • কপি এবং পেস্ট করুন, কোড খোলা নিচের chgrpldফাইল এবং এটি সংরক্ষণ করুন, তারপর ফাইলটি বন্ধ করুন।

টার্মিনালে ফিরে:

  • টাইপ করুন, chmod +x chgrpldএবং টিপুন enter
  • টাইপ করুন, sudo mkdir -p /usr/local/binএবং টিপুন enter। মনে রাখবেন যে ওএস এক্স 10.11.5 এর একটি পরিষ্কার ইনস্টল-এ binডিরেক্টরিটি /usr/localইতিমধ্যে এটিতে থাকা সত্ত্বেও এটি বিদ্যমান ছিল না PATH
    • পাসওয়ার্ড টাইপ করুন এবং টিপুন enter
  • টাইপ sudo cp chgrpld /usr/local/binএবং টিপুন enter
    • পাসওয়ার্ড টাইপ করুন এবং টিপুন enter। (যদি প্রয়োজন হয় তাহলে.)
  • chgrpldchgrp কমান্ডের মতো এখনই ব্যবহারের জন্য উপলব্ধ হওয়া উচিত ।

উত্স কোড জন্য chgrpld:

#!/bin/bash

o="${@:1:$(($#-1))}"
d="${@: -1}"
if [ -d "$d" ]; then
    f=".locked_files_list_$(date "+%s")"
    find "$d" -flags uchg > "$f" 2>/dev/null
    if [ -s "$f" ]; then
        while read -r l; do
            chflags nouchg "$l"
        done<"$f"
            $(chgrp $o "$d")
        while read -r l; do
            chflags uchg "$l"
        done<"$f"
        rm "$f"
    else
        rm "$f"
        $(chgrp $o "$d")
    fi
else
    echo "  \"$d\" is not a directory!..."
    exit 1
fi
exit 0

সারমর্ম: chgrpld [−fhv][−R[−H | −L | −P]] group directory

  • বিকল্পগুলি এবং অপারেন্ডগুলিরman chgrp বিবরণের জন্য টার্মিনালে দেখুন ।group

  • directoryহয় নাম / পথনাম লক্ষ্য ডিরেক্টরির যে লক , বা না, এবং অথবা ধারণকারী ফাইল / ডিরেক্টরি যে লক খুব। মনে রাখবেন যে এর বিপরীতে chgrpকোন একাধিক অবজেক্টকে উদাহরণস্বরূপ group file ...কাজ করতে অনুমতি দেওয়া হয়, chgrpldএটি একটি টার্গেট ডিরেক্টরিতে কাজ করতে কোডড হয় এবং একসাথে -R অপশনটির সাথে পুনরাবৃত্তি করে ।

  • দ্রষ্টব্য: ব্যবহারকারী chgrpld প্রার্থী নির্দিষ্ট গ্রুপের অন্তর্ভুক্ত এবং ডিরেক্টরি এবং লক করা ফাইল সিস্টেম বস্তুর মালিক হতে হবে বা অতি ব্যবহারকারী হতে হবে ।

  • ওএসের এসআইপি সংস্করণে যেমন প্রত্যাশা করা হয়েছে, এসআইপি সক্ষম করা থাকলে এটি এসআইপি সুরক্ষিত ফাইল-সিস্টেম বস্তুর উপর কাজ করবে না ।


নিচের ছবিটি এর সিনট্যাক্স হাইলাইট দেখায় কোড সহজ পড়ার জন্য ব্যবধানযুক্ত এবং ইন্ডেন্টযুক্ত মন্তব্য সাহায্য করার জন্য কি সম্পর্কে সামান্য ব্যাখ্যা কোড করছে।

কোডের চিত্র


পরীক্ষার দ্রষ্টব্য: নোট করুন যে উপরে প্রদর্শিত টেস্টিং পরিবেশটি সীমাবদ্ধ তবুও আমি আরও জটিল লন্ডিত ডিরেক্টরি কাঠামোর অধীনে এটিকে পরীক্ষা করেছিলাম আরও অনেকগুলি লকড নেস্টেড ডিরেক্টরি এবং ফাইল সহ ফাঁকা জায়গা, এবং ফাইল নামের মধ্যে বা ব্যাকস্ল্যাশগুলি, ইস্যু ছাড়াই। স্পষ্টতই বিক্ষোভের উদ্দেশ্যে, আমি কেবল ধারণার প্রমাণের জন্য একটি খালি ন্যূনতম কাঠামো দেখছি। আবার, উপরে উল্লিখিত হিসাবে, " এটি কোনও ফাইল-সিস্টেমের নামে এমবেড করা নিউলাইন হ্যান্ডেল করার কোড কোড নয় , যা আইএমও সেখানে প্রথমে অন্তর্ভুক্ত নয়! " !


সহজ এবং পরিষ্কার কোড! নিউলাইনগুলি সম্পর্কে সীমাবদ্ধতার সতর্কতার জন্য দুর্দান্ত;)।
ডান

যদি কোনও "ফাইল" এর একাধিক পতাকা থাকে যেমন hidden,uchgবা schg,uchg? আপনার স্ক্রিপ্টে ভাল মন্তব্য।
fd0

@ fd0, আমি আগেই বলেছি যে " আমি কীভাবে সমস্যাটি সমাধান করব " উদাহরণস্বরূপ, "ফাইল সিস্টেমের অবজেক্টটি লক হওয়ার পরিস্থিতি এবং" আপনার প্রয়োজন অনুসারে সংশোধন করতে পারেন / স্যুট করতে চেয়েছিলেন " এর উদাহরণটি অন্তর্ভুক্ত করে দিয়েছি তার উদাহরণ দিয়ে বলি: দরকার "যা একই সাথে লক এবং লুকানো হচ্ছে covers আমি যা উপস্থাপন করেছি তা হ'ল একটি টেম্পলেট হিসাবে ব্যবহার করার জন্য কার্যবিধির মোড়ক স্ক্রিপ্টের একটি উদাহরণ। হ্যাঁ, আপনি চাইলে uchg,hiddenপতাকাগুলির জন্য একটি চেক যুক্ত করা এবং পরিচালনা করা সহজ। কোড মন্তব্য করার পরিপূরকটির জন্য ধন্যবাদ, আমি 6 ম এ ফিরে দেখতে চাই। এবং কীভাবে এবং কেন আমি সেভাবে লিখেছিলাম তা জানুন। :)
user3439894

@ fd0, নিষ্ক্রিয় কৌতূহলের বাইরে আমি একটি প্রোগ্রাম লিখেছিলাম যা মূল হিসাবে চালিত হয়েছিল এবং সাম্প্রতিক এবং সুন্দর পরিষ্কারের উপর ফ্ল্যাগগুলি বিশ্লেষণ করেছি, কয়েকটি ব্যবহারকারীর প্রোগ্রাম যুক্ত হয়েছে, ওএস এক্স 10.11.5 ইনস্টল করা আছে এবং সেখানে কেবলমাত্র 1 টি ফাইল ছিল ঠিক uchgপতাকা পতাকা সেট সহ এবং uchg,hiddenসেট সহ 0 তবে, প্রতিটি পৃথক এবং সম্মিলিত পতাকা (গুলি) এর জন্য মোট ফাইলগুলি সেট করা হয়েছে: 35270 সংকুচিত; 80 লুকানো; 242946 সীমাবদ্ধ; 268419 সীমাবদ্ধ, সংকুচিত; 20 সীমাবদ্ধ, লুকানো; 3 সীমাবদ্ধ, রোদে; 1 সীমাবদ্ধ, uchg; 467 রোদে; 6 রোদে, লুকানো; 1 uchg। আমি জানি সঠিকভাবে মৃত্যুদন্ড কার্যকর করা থেকে hiddenবিরত chgrpথাকতে পারে, অন্যদের পরীক্ষা করেনি।
ব্যবহারকারী 3439894

ঠিক আছে, এটি অদ্ভুত বলে মনে হচ্ছে hiddenবা এই বিষয়টির জন্য compressed, opaque, nodump, archiveকোনও ফাইল পরিবর্তন করে effect
fd0

0

2 শাঁস সমাধান

অবশেষে অনেক চেষ্টার পরে আমি একটি 2 ছোট শেল স্ক্রিপ্ট সমাধান তৈরি করেছিলাম।

একটি সুন্দর মৌলিক যা এটি করবে:

chflags, chgrp, chflags

আরও একটি গুরুতর যা ডিরেক্টরি কাঠামোর ট্র্যাভারসাল করবে:

find ... do the chgrp correctly

ছোট শেল: chflags, chgrp, chflags

এখানে chgrpld1.shঠিক আছে 2 টি যুক্তি দিয়ে সাধারণত যা কাজ করা হবে তার সামগ্রীগুলি এখানে রয়েছে ।

#!/bin/sh
# shell script to chgrp a file or directory
# when there exists a lock flags (uchg)

_cn=`basename $0`

USAGE="Usage: ${_cn} group file"

case $# in
2)
        _group=$1
        _file="$2"
        ;;
*)
        echo "$USAGE" >&2
        exit 2
        ;;
esac

chflags nouchg "${_file}"
chgrp ${_group} "${_file}"
chflags uchg "${_file}"

বড় শেল: সন্ধান করুন ... সঠিকভাবে chgrp করুন

chgrpld.shডিরেক্টরিগুলির কাঠামোগুলি অনুসন্ধানের জন্য এটি তৈরি করা বিষয়বস্তু এখানে রয়েছে এবং যতটা সম্ভব ত্রুটি শর্ত আগেই এড়ানো হবে।

#!/bin/sh
# shell script to recursively chgrp a file or directory
# when there exists files which are locked

_cn=`basename $0`

USAGE="Usage: ${_cn} group file..."

case $# in
0|1)
        echo "$USAGE" >&2
        exit 2
        ;;
*)
        _group=$1
        shift
        _file_list="$@"
        ;;
esac

TMPDIR=/tmp
_file_flags_list=`mktemp -t ${_cn}`

clean() { rm -f ${_file_flags_list} ; }

trap clean 0 1 2 3

# first check if we don't have any sort of flags thus blocking this
# script

find "${_file_list}" -flags +sappnd,schg,uappend -exec ls -@delO "{}" \; >${_file_flags_list}

if [ -s ${_file_flags_list} ] ; then
        echo "${_cn}: can't run because of other flags set:"
        cat ${_file_flags_list}
        exit 1
fi

# if flag present then call chgrpld1, else plain chgrp

find "${_file_list}" \( -flags uchg -exec chgrpld1 ${_group} "{}" \; \) -or \( -exec chgrp ${_group} "{}" \; \)

ইনস্টল করুন

এই 2 টি শেল একসাথে কাজ করতে, এটি দুটিতে স্থানীয় ডিরেক্টরিতে ইনস্টল করা প্রয়োজন PATH। আমার ক্ষেত্রে আমি /local/binসিস্টেমের PATH উপাদানগুলির বাইরে এবং প্যাকেজ ব্যবস্থাপকগণ ( port, brew…) দ্বারা ব্যবহৃত সামগ্রীর বাইরে থাকি ।

চয়েসেন ডিরেক্টরিতে 2 পূর্ববর্তী ফাইলগুলি অনুলিপি করুন:

chgrpld1.sh
chgrpld.sh

make chgrpld1 chgrpld

cp chgrpld1 chgrpld /local/bin

পরীক্ষা

এই শেলটি প্রতিটি ক্ষেত্রে সঠিকভাবে চলতে পারে তা প্রমাণ করার জন্য, আমি পতাকাগুলির সংমিশ্রণে একটি পরীক্ষা ডিরেক্টরি তৈরি করেছিলাম যার মধ্যে এটির ত্রুটি ছাড়াই মোকাবেলা করা উচিত সমস্ত অসম্ভব ফাইল নামগুলির মুখোমুখি হতে পারে।

dir-okআমার স্ক্রিপ্টটি সফল হওয়া উচিত সেই ভয়াবহতা সহ এমন উপ-ডিরেক্টরিটি হ'ল এটি dir-failহ'ল যে ক্ষেত্রে এটি ব্যর্থ হওয়া উচিত all

% ls -blOR
total 0
drwxr-xr-x  2 bob  admin          - 204 Aug 16 16:50 dir-fail
drwxr-xr-x  3 bob  localaccounts  - 238 Aug 16 16:55 dir-ok

./dir-fail:
total 0
-rw-r--r--  1 bob  admin  schg,uchg 0 Aug  9 18:59 file-multi-flags
-rw-r--r--  1 bob  admin  sappnd    0 Aug 16 16:13 file-sappnd
-rw-r--r--  1 bob  admin  schg      0 Aug 16 16:11 file-schg
-rw-r--r--  1 bob  admin  uappnd    0 Aug 16 16:12 file-uappend

./dir-ok:
total 0
-rw-r--r--  1 bob  localaccounts  -      0 Aug 16 16:07 a\nb
-rw-r--r--  1 bob  localaccounts  -      0 Aug  9 19:34 a b
-rw-r--r--  1 bob  localaccounts  -      0 Aug  9 19:34 a'b
-rw-r--r--  1 bob  localaccounts  -      0 Aug 16 16:46 a\\b
drwxr-xr-x  2 bob  localaccounts  uchg 272 Aug 16 16:39 subdir

./dir-ok/subdir:
total 0
-rw-r--r--  1 bob  localaccounts  -      0 Aug 16 16:08 file
-rw-r--r--  1 bob  localaccounts  arch   0 Aug 16 16:12 file-arch
-rw-r--r--@ 1 bob  localaccounts  hidden 0 Aug 16 16:10 file-hidden
-rw-r--r--  1 bob  localaccounts  nodump 0 Aug 16 16:11 file-nodump
-rw-r--r--  1 bob  localaccounts  opaque 0 Aug 16 16:10 file-opaque
-rw-r--r--  1 bob  localaccounts  uchg   0 Aug 16 16:08 file-uchg
  • চালানো dir-ok

    $ chgrpld staff dir-ok
    $ ls -blOR dir-ok
    total 0
    -rw-r--r--  1 bob  staff  -      0 Aug 16 16:07 a\nb
    -rw-r--r--  1 bob  staff  -      0 Aug  9 19:34 a b
    -rw-r--r--  1 bob  staff  -      0 Aug  9 19:34 a'b
    -rw-r--r--  1 bob  staff  -      0 Aug 16 16:46 a\\b
    drwxr-xr-x  2 bob  staff  uchg 272 Aug 16 16:39 subdir
    
    dir-ok/subdir:
    total 0
    -rw-r--r--  1 bob  staff  -      0 Aug 16 16:08 file
    -rw-r--r--  1 bob  staff  arch   0 Aug 16 16:12 file-arch
    -rw-r--r--@ 1 bob  staff  hidden 0 Aug 16 16:10 file-hidden
    -rw-r--r--  1 bob  staff  nodump 0 Aug 16 16:11 file-nodump
    -rw-r--r--  1 bob  staff  opaque 0 Aug 16 16:10 file-opaque
    -rw-r--r--  1 bob  staff  uchg   0 Aug 16 16:08 file-uchg
    $
  • চালানো dir-fail

    $ chgrpld staff dir-fail/file-multi-flags 
    chgrpld: can't run because of other flags set:
    -rw-r--r--  1 bob  admin  schg,uchg 0 Aug  9 18:59 dir-fail/file-multi-flags
    
    $ chgrpld staff dir-fail/file-sappnd      
    chgrpld: can't run because of other flags set:
    -rw-r--r--  1 bob  admin  sappnd 0 Aug 16 16:13 dir-fail/file-sappnd
    
    $ chgrpld staff dir-fail/file-schg  
    chgrpld: can't run because of other flags set:
    -rw-r--r--  1 bob  admin  schg 0 Aug 16 16:11 dir-fail/file-schg
    
    $ chgrpld staff dir-fail/file-uappend
    chgrpld: can't run because of other flags set:
    -rw-r--r--  1 bob  admin  uappnd 0 Aug 16 16:12 dir-fail/file-uappend
    $
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.