วิธีการตรวจสอบสิทธิ์กลุ่มของไฟล์


9

ฉันต้องการตรวจสอบการอนุญาตกลุ่มของไฟล์จากสคริปต์ทุบตี โดยเฉพาะฉันต้องตรวจสอบว่าไฟล์มีบิตของกลุ่มที่สามารถเขียนได้หรือไม่

แค่นั้นแหละ. เรียบง่ายเหมือนที่ อย่างไรก็ตาม:

  1. ฉันยังต้องการสิ่งนี้เพื่อพกพา
  2. test -w <file จะไม่บอกฉันว่ามันเป็นกลุ่มที่เขียนได้
  3. ผลลัพธ์ของls -ldดีสำหรับมนุษย์ แต่ไม่แน่ใจเกี่ยวกับสคริปต์ ในทางเทคนิคแล้วฉันสามารถแยกวิเคราะห์เอาต์พุตเช่นdrwxrwxr-xเพื่อแยกบิตกลุ่ม แต่ดูเหมือนจะเปราะ
  4. อินเทอร์เฟซสำหรับstatเข้ากันไม่ได้อย่างสมบูรณ์ระหว่าง OS X และระบบอื่น ๆ
  5. find <file> -perm ... ไม่สามารถเป็นคำตอบได้ใช่ไหม

คุณต้องการตรวจสอบบิตสิทธิ์ของกลุ่มหรือคุณจำเป็นต้องตรวจสอบว่ากลุ่มเฉพาะมีสิทธิ์ในการเขียนหรือไม่? กลุ่ม (หรือผู้ใช้) อาจมีสิทธิ์เขียนผ่าน ACL
Gilles 'หยุดความชั่วร้าย'

เพียงบิตสิทธิ์กลุ่ม ไม่มีกลุ่มเฉพาะที่เกี่ยวข้อง
mislav

คำตอบ:


8

วิธีที่ # 1 - สถิติ

คุณสามารถใช้statคำสั่งเพื่อรับบิตสิทธิ์ statสามารถใช้ได้กับ Unixes ส่วนใหญ่ (OSX, BSD, ไม่ใช่ AIX จากสิ่งที่ฉันสามารถหาได้) สิ่งนี้ควรใช้กับยูนิกซ์ส่วนใหญ่ยกเว้น OSX & BSD จากสิ่งที่ฉันสามารถหาได้

$ 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 และ BSD คุณจะต้องใช้แบบฟอร์มนี้stat, stat -f(หรืออาจจะstat -x) และแยกตาม เนื่องจากตัวเลือกstatต่าง ๆ คุณสามารถรวมคำสั่งนี้ในlsb_release -aคำสั่งและเรียกใช้เวอร์ชันที่เหมาะสมตามระบบปฏิบัติการ ไม่เหมาะ แต่ใช้การได้ ตระหนักว่าlsb_releaseมีให้สำหรับ Linux distrosเท่านั้นดังนั้นจึงจำเป็นต้องมีทางเลือกอื่นสำหรับการทดสอบระบบปฏิบัติการ Unix อื่น ๆ

วิธีที่ # 2 - ค้นหา

ฉันคิดว่าคำสั่งนี้อาจให้บริการคุณดีกว่า ฉันใช้findและprintfสวิตช์

ตัวอย่าง

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

วิธี # 3 - Perl

Perl อาจเป็นวิธีที่พกพาได้มากกว่านี้ขึ้นอยู่กับระบบปฏิบัติการที่คุณพยายามจะครอบคลุม

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

หมายเหตุ:ข้างต้นใช้ประโยชน์จากstat()ฟังก์ชั่นของ Perl เพื่อสอบถามบิตระบบไฟล์

คุณสามารถทำให้ขนาดกะทัดรัดมากขึ้นโดยการใช้อาร์เรย์@pvและจัดการกับผลลัพธ์ของstat()โดยตรง:

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

ฉันคิดว่าคุณพลาดจุดที่ 4 statคำสั่งแตกต่างกันอย่างมากในระบบที่แตกต่างกันและไม่สามารถพกพาได้
jordanm

@ จอร์แดน - ขอบคุณฉันเห็นมันกำลังมองหาทางเลือก ฉันคิดว่าfind . -printfสามารถทำได้ แต่ไม่สามารถระบุได้ว่ามีอยู่ใน OSX หรือไม่
slm

1
ฉันไม่พบว่ามีการอ้างอิงในคู่มือ POSIX2008 เหมือนกันดังนั้นฉันอยากเห็นด้วย ฉันไม่แน่ใจในวิธีการอื่นใด ฉันคิดว่าคุณต้องกัดกระสุนที่นี่และตรวจสอบระบบปฏิบัติการที่และเรียก approp คำสั่งดูเหมือนจะเป็นวิธีที่ดีที่สุด
slm

1
ฉันไม่สามารถนึกวิธีใช้ยูทิลิตี้เชลล์มาตรฐานได้เช่นกัน นั่นเป็นเหตุผลที่คำตอบของฉันใช้ Perl
jordanm

1
@jordanm - จิตใจที่ดี ฉันกำลังแก้ไขปัญหา perl ด้วย 8-)
slm

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ตัวอย่างที่สามารถพบได้ในperldoc สถิติ


1

ฉันสิ้นสุดการlsแยกวิเคราะห์:

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

ฉันขอบคุณสำหรับคำตอบที่กว้างขวางของ @ slm แต่ไม่มีวิธีการอื่นใดที่ตรงไปตรงมา statวิธีการจะต้องให้ผมเขียนอย่างน้อยสองสวดที่แตกต่างกันเพื่อให้ครอบคลุม OS X, และแม้กระทั่งหลังจากนั้นก็จะกลับเป็นตัวแทนฐานแปดซึ่งผมยังคงต้องใช้คณิตศาสตร์เพื่อ วิธี Perl นั้นใช้ได้ แต่ฉันต้องเริ่มล่ามสำหรับงานง่าย ๆ และฉันต้องการให้มันง่ายและใช้เพียง posix utils


2
คุณกำลังใช้ bash ไม่ใช่เพียง POSIX ใน POSIX:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles 'SO- หยุดความชั่วร้าย'

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

เครื่องมือ Unix / Linux มาตรฐานทั้งหมด

ฉันคิดว่ามันเป็นไปได้ที่จะมีกลุ่มเขียน แต่ไม่ใช่กลุ่มอ่าน ในความเป็นไปได้นั้นอาจเป็นได้ทั้งข้อความสั่ง 2 | 3 | 6 | 7) หรือ grep '[2 | 3 | 6 | 7]'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.