मुझे एक ही chmod सेट करने की आवश्यकता है, कैसे आरआर-आर - आर-- के लिए नंबर प्राप्त करें ?
chmod
समर्थन करता है --reference
: "- संदर्भ = शख्स मोडे मानों के बजाय रिस्तेर्स मोड का उपयोग करता है" - मैन चामोद।
मुझे एक ही chmod सेट करने की आवश्यकता है, कैसे आरआर-आर - आर-- के लिए नंबर प्राप्त करें ?
chmod
समर्थन करता है --reference
: "- संदर्भ = शख्स मोडे मानों के बजाय रिस्तेर्स मोड का उपयोग करता है" - मैन चामोद।
जवाबों:
कृपया stat
आउटपुट की जांच करें :
# stat .xsession-errors
File: ‘.xsession-errors’
Size: 839123 Blocks: 1648 IO Block: 4096 regular file
Device: 816h/2070d Inode: 3539028 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/ lik) Gid: ( 1000/ lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
Birth: -
stat -c %a /path/to/file
जादू की चाल है जो आपको चाहिए।
पूर्ण अनुमतियाँ मोड संख्या 4-अंकीय ओक्टल संख्या है, हालांकि अधिकांश समय, आप केवल 3 सबसे कम-महत्वपूर्ण अंकों का उपयोग करते हैं। अनुमतियाँ स्ट्रिंग में प्रत्येक समूह को r = 4, w = 2, x = 1 लेते हुए जोड़ें। उदाहरण के लिए:
421421421
-rwxr-xr--
\_/ -- r+w+x = 4+2+1 = 7
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+_ = 4+0+0 = 4 => 0754
अब, कभी-कभी आपको इस तरह से एक अजीब सी चीज़ दिखाई देगी:
-rwsr-xr-T
चौथा अंक x
मॉडरेशन में बिट्स पर ओवरलोड होता है। यदि आप x
वहाँ से इतर एक पत्र देखते हैं , तो इसका मतलब है कि इनमें से एक "विशेष" चौथा-अंक बिट्स सेट है, और यदि पत्र कम है, तो उसके x
लिए भी स्थिति निर्धारित है। तो इस एक के लिए अनुवाद है:
4 2 1
421421421
-rwsr-xr-T
+ + + -- s+_+T = 4+0+1 = 5
\_/ -- r+w+s = 4+2+1 = 7 (s is lowercase, so 1)
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+T = 4+0+0 = 4 (T is uppercase, so 0) => 05754
यह दिखाने के लिए मानक UNIX तरीका है कि एक संख्या ओक्टल है, इसे एक शून्य से शुरू करना है। GNU chmod
मान लेंगे कि आप जो मोड दे रहे हैं वह वैसे भी अष्टाधारी है, लेकिन यह शून्य को रोकने के लिए सबसे सुरक्षित है।
अंत में, यदि आप +
मॉडरेशन के अंत में देखते हैं:
-rwxr-xr-x+
तब इसका मतलब है कि फ़ाइल ने अनुमतियाँ बढ़ा दी हैं, और आपको इससे अधिक की आवश्यकता होगी chmod
। में देखो setfacl
और getfacl
आदेश, शुरुआत के लिए।
अनुमतियाँ केवल एक बाइनरी नंबर का स्ट्रिंग प्रतिनिधित्व हैं। ज्यादातर का प्रतिनिधित्व करती है , बाकी पत्र हैं।0
-
मूल अनुमतियों के लिए:
सभी कन्वर्ट -
और टोपी S
या T
करने के लिए 0
, बाकी का प्रतिनिधित्व करना चाहिए 1
।
जिसके परिणामस्वरूप निर्मित बाइनरी संख्या को ऑक्टल के रूप में मुद्रित किया जाना चाहिए:
$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644
एक पंक्ति में:
$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644
त्रुटि सुधार और अन्य 3 बिट्स का पता लगाने 1000
, 2000
या 4000
कुछ और कोड की आवश्यकता है:
#!/bin/bash
Say (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }
e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"
a=$1
((${#a}>10)) && SayError 1 "$e1"
((${#a}==10)) && { Say "$e2"; a=${a#?}; }
((${#a}<9)) && SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9)) && SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4))
[[ $a =~ [sS]...$ ]] && c=$((c|2))
[[ $a =~ [tT]$ ]] && c=$((c|1))
printf '%04o\n' "$((2#$b|c<<9))"
फ़ाइलों की सूची उनके स्ट्रिंग और हेक्स अनुमति मूल्यों के साथ प्राप्त करें। % N को अंत में रखना ताकि आउटपुट को एक्सेल में आसान बनाया जा सके।
stat -c "%A %a %N" *
-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'
यह एक विशिष्ट हेक्स अनुमति के साथ सभी फ़ाइलों को मिलेगा।
find /tmp1 -user root -perm 644