سؤال كيف يمكنني الحصول على أذونات ملف octal من سطر الأوامر؟


هناك شمود الأمر لتعيين أذونات الملف ، ولكن يمكنني الحصول على أذونات الملف في الوضع الثماني (مثل 755) من سطر الأوامر؟


316
2018-06-17 08:04


الأصل




الأجوبة:


يمكنك المحاولة

stat -c "%a %n" *

يحل محل * مع الدليل ذي الصلة أو اسم الملف المحدد الذي تريد فحصه.

من رجل صفحة من القانون الأساسي،

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

الاستعمال:

  • مع الملفات:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • مع المجلدات:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(مرجع)


450
2018-06-17 08:08



على نظام التشغيل Mac ، استخدم stat -f '%A %a %N' * (ائتمان: geeklog.adamwilson.info/article/58/...) - s2t2
إذا كنت أكثر راحة مع ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
حلقاتusandfriends على إخراج ls هي فكرة سيئة. إذا كنت تريد حقًا استخدام حلقة يمكنك القيام بها for f in *; do stat "%a %n" "$f"; done - Tom Fenech
لماذا على نظام التشغيل mac OS تغير كل شيء قليلاً (حتى في unix iso utils)؟ هل هناك سبب حقيقي لهذا؟ - Vassilis
يرجىhackel ، أخبرنا كيف تشعر حقا. الضحك بصوت مرتفع! - MikeSchinkel


يمكن عرض أذونات الملفات في Linux بتنسيق ثماني باستخدام أمر Linux الأساسي.

فقط اضغط السيطرة+البديل+تي على لوحة المفاتيح الخاصة بك لفتح المحطة الطرفية. عند فتحه ، انتقل إلى الدليل الذي تريد البحث فيه عن أذونات الملفات في الوضع الثنائي.

stat -c '%A %a %n' *

حقوق الوصول في شكل مقروء الإنسان

٪ a حقوق الوصول في ثماني

٪ n اسم الملف

الأعداد الثمانية والأذونات

يمكنك استخدام رقم ثماني لتمثيل الوضع / الإذن:

r: 4
w: 2
x: 1

على سبيل المثال ، بالنسبة لمالك الملف ، يمكنك استخدام الوضع الثماني كما يلي. اقرأ،   كتابة وتنفيذ (كامل) الإذن على ملف في octal هو 0 + r + w + x =   0 + 4 + 2 + 1 = 7

فقط إذن القراءة والكتابة على ملف في octal هو 0 + r + w + x = 0 + 4 + 2 + 0   = 6

فقط قراءة وتنفيذ إذن على ملف في octal هو 0 + r + w + x =   0 + 4 + 0 + 1 = 5

استخدم الطريقة أعلاه لحساب إذن للمجموعة وغيرها. دعنا   لنقل أنك تريد منح إذن كامل للمالك ، وقراءة وتنفيذ   إذن للمجموعة ، وقراءة إذن فقط للآخرين ، فأنت بحاجة   لحساب الإذن كما يلي: User = r + w + x = 0 + 4 + 2 + 1 = 7 Group =   r + w + x = 0 + 4 + 2 + 0 = 6 Others = r + w + x = 0 + 0 + 0 + 1 = 1

الاذن الفعال هو 761.

مصدر: http://kmaiti.blogspot.com/2011/09/umask-concept.html


37
2018-06-17 08:14



يمثل الرقم 0 الأولي جزءًا خاصًا أيضًا: pastebin.com/6ymkFt71 - Braiam


كما هو مفصل في أذونات "755" على النمط "ls" بواسطة آدم كورتمانش على AgileAdam.com، ثستطيع ان تخلق اسم مستعار  lso يعمل مثل ls -l لكن قليلا يعالج الإخراج1 لعرض الأذونات أيضًا في النطاق الثماني. يؤدي ذلك إلى إضافة عمود رئيسي يوضح ثلاثة أرقام2 أذونات ثمانية. كما هو مكتوب ، وهذا يعمل لمعظم الملفات والدلائل ، لكنه لا يعمل بشكل صحيح إذا كان لزج أو setuid / setgid يتم تعيين البتات.3

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

هذا لديه نقص خطير ، على الرغم من ، كما techtonik  يشير الى. أنت لا يستطيع تمرير الحجج الى هذا lso الاسم المستعار كما تفعل ال ls أمرلأنه يتم أخذها كحجج إضافية لـ awk في حين أن. وبالتالي لا يمكنك تشغيل lso على ملف أو دليل معين ، ولا يمكنك تمرير أي خيارات (مثل -Fأو --color) إلى lso.


الإصلاح هو تحديد lso  ك وظيفة بدلا من اسم مستعار.

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

إذا كنت تحاول ذلك بشكل تفاعلي في shell الخاص بك ، قم بتشغيل unalias lso لإزالة الاسم المستعار - يمكنك القيام بذلك إما قبل أو بعد تحديد الوظيفة. إذا كنت تضعه في ملف من مصادر ، مثل ~/.bashrcفقط اخرج alias خط وإضافة تعريف الدالة.

لماذا هذا العمل؟ على عكس الأسماء المستعارة ، يمكن أن تتخذ وظائف قذيفة باش المعلمات الموضعية، على سبيل المثال ، وسائط سطر الأوامر. "$@" يتوسع إلى قائمة الوسيطة الكاملة، مما تسبب في الحجج إلى lso وظيفة ليتم تمريرها إلى ls. (بخلاف تعريف الاسم المستعار ، لا يتم اقتباس هيئة وظيفية ؛ وبالتالي كان من الضروري إزالة \الشخصيات من قبل $ و ".)

حيث يمكنك تمرير الخيارات ل lso عند تعريف هذه الطريقة كدالة ، قد ترغب في إزالة -a و -G خيارات من التعريف - يمكنك تمريرها يدويا في الحالات التي تريدها لهم. (ال -l الخيار مطلوب للحصول على تفاصيل مثل إظهار أذونات الملف على الاطلاق، لذلك ليس هناك فائدة لإزالة ذلك.)

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

شكرا ل techtonik إلى عن على مشيرا إلى الحد في التعريف lso كاسم مستعار ، وبالتالي حفزني على توسيع هذا المنشور باستخدام مادة حول جعله وظيفة بدلاً من ذلك.


1قد يلاحظ المرء أن هذا يبدو مهزومًا القاعدة العامة حول عدم تحليل الإخراج من ls. ls تنتج انتاج قابل للقراءة جدا. هذا يقدم الخصوصيات والقيود مما يجعلها غير مناسبة عموما كإدخال لأوامر أخرى. في هذه الحالة نحن تحليل ls منذ نحن نرغب في الحفاظ على السلوك الدقيق لل ls باستثناء لدينا واحد تغيير مضاف.

2أحد القيود على هذا الاسم المستعار ، والذي ينطبق أيضًا على إصدار الوظيفة الموضح أسفله ، والذي يمكن اعتباره خطأ ، هو أنه يعرض فقط ثلاثة أرقام ثماني حتى عندما يكون الرقم الثماني هو صفر. مثل jfmercer لديها أشار بحقلا تعكس الأرقام الثمانية المعروضة هنا البقعة اللزجة إذا كانت موجودة ، ولا البتات setuid أو setgid.

3أكثر خطورة من مجرد عدم إظهار الرقم الثماني الرابع هو أن هذه الطريقة يفترض لم يتم تعيينها ، و إذا كانوا - إذا رأيت t، sأو S في سلسلة الإذن - ثم يجب عليك تجاهل الأرقام الثمانية. هذا لأنه يتم الاستدلال على البتات من سلسلة الأذونات بطريقة لا حساب لبتات setuid / setgid اللزجة.


33
2018-06-17 08:12



لا يعمل مع الدلائل - awk: read error (Is a directory) - anatoly techtonik
techtonik شكرا لتوجيه هذا! لقد قمت (أخيرا) بتحديث هذه الإجابة لتشمل إصلاحًا لذلك. - Eliah Kagan
يمكنك ان تضيف --color المعلمة لعرض الألوان lso() { ls -alG "$@" --color | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; } - tagplus5


مجرد تمديد \ تبسيط الإجابات السابقة "stat" ذات الصلة:

يمكنك ببساطة تشغيل:

stat <path_to_file>

سيحتوي الإخراج على إذن ثماني مع معلومات أخرى.



التفاصيل (الإصدار الأساسي والمثال):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

لاحظ ال: (0644/ -RW-ص - r--)


17
2017-08-26 16:07





لقابلية الحمل ، يمكنك استخدام perl:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

إذا كنت تريد أن تلاحظ عند حدوث خطأ ، حاول:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

6
2017-09-21 15:30



بالإضافة إلى كونها محمولة ، يظهر حل cuonglm @ أربعة الشخصيات الثمانية بدلا من ثلاثة، مما يدل على حالة "بت لزجة" التي غالبا ما يتم نسيانها. - jfmercer


يمكنك استخدام find مع ال -printf عمل.

ls لا تعرض الأذونات الثمانية ، ولكن يمكنك استخدام هذا findالحل المستند إلى:

find مسار -printf "%m:%f\n"

على سبيل المثال ، للتحقق من دليل مقاطع الفيديو الخاصة بي:

$ find Videos -printf "%m:%f\n"
755:Videos

ال %m محدد التنسيق يخبر -printf إجراء لطباعة الأذونات الثمانية ، في حين أن %f محدد تنسيق يتسبب في طباعة اسم الملف.

يمكنك تمرير أسماء ملفات متعددة إلى find. يمكنك حتى استخدام الكرات (على سبيل المثال ، find * -printf "%m:%f\n").

ليس عليك استخدام اختبار مثل -name أو -iname. يكفي تمرير أسماء الملفات أو الدلائل التي تهمك كنقاط بدء find. بمعنى ، قدم أسمائهم كحجج مباشرة بعد الكلمة find، كما هو مبين أعلاه.

find يمنحك تحكمًا كبيرًا في كيفية إظهار الإخراج. هناك نوعان من التعديلات على وجه الخصوص قد تجدها مفيدة:

  • بشكل افتراضي، find يعيد الأدلة الفرعية ، على غرار ls -R. إذا كنت لا تريد find لزيارة الدلائل الفرعية لنقاط البداية التي تمر بها ، يمكنك إضافة -maxdepth 0 (او استعمل -maxdepth مع القيم الأخرى لتشير إلى مدى رغبتك في الذهاب).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f يظهر فقط اسم الملف ، لذلك إذا find يجب أن تتكرر للوصول إلى ملف ، قد لا تعرف مكانه. لإظهار مسار ، بدءًا من أي نقطة بداية تم العثور على الملف أسفله ، استخدمه %p في حين أن.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

نرى man find لمزيد من المعلومات حول استخدام find أمر.

طريقة اخرى (ls و awk)

يمكن استخدام هذا لسرد كافة ملفات الدليل مع أذوناتهم:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

هذا هو في الأساس نفس الأمر كما في آدم كورتمانش lso الاسم المستعار، التي هذا الجواب استشهد ، مجرد تشغيل كأمر واحد. إذا كنت تستخدم هذا مرة واحدة فقط ، أو في مناسبة نادرة ، فقد لا ترغب في كتابتها كإسم مستعار أو وظيفة shell.


2
2018-03-07 07:16