จะตรวจสอบว่าผู้ใช้สามารถเข้าถึงไฟล์ที่กำหนดได้อย่างไร?


60

* การอนุญาตของผู้ใช้ nix นั้นง่ายมาก แต่สิ่งต่าง ๆ อาจยุ่งเหยิงเมื่อคุณต้องคำนึงถึงการเข้าถึงไดเรกทอรีแม่ทั้งหมดก่อนถึงไฟล์ที่กำหนด ฉันจะตรวจสอบได้อย่างไรว่าผู้ใช้มีสิทธิ์เพียงพอหรือไม่ ถ้าไม่เช่นนั้นไดเรกทอรีใดที่ปฏิเสธการเข้าถึง

ตัวอย่างเช่นสมมติว่าผู้ใช้และไฟล์joe /long/path/to/file.txtแม้ว่าfile.txtchmoded จะอยู่ที่ 777 โจก็ยังต้องสามารถเข้าถึงได้/long/จากนั้น/long/path/และ/long/path/to/ก่อนหน้านี้ สิ่งที่ฉันต้องการคือวิธีตรวจสอบสิ่งนี้โดยอัตโนมัติ หากjoeไม่มีการเข้าถึงฉันก็อยากจะรู้ว่าเขาถูกปฏิเสธที่ไหน บางทีเขาอาจจะสามารถเข้าถึงแต่ไม่/long//long/path/

คำตอบ:


71

คุณสามารถใช้ได้

namei -m /path/to/really/long/directory/with/file/in

ซึ่งจะส่งออกสิทธิ์ทั้งหมดในพา ธ ในรายการแนวตั้ง

หรือ

namei -l /path/to/really/long/directory/with/file/in

เพื่อแสดงรายการเจ้าของทั้งหมดและการอนุญาต


2
นี่ควรเป็นคำตอบที่ถูกต้อง ในความเป็นจริงการใช้namei <path> || exit 1ช่วยให้คุณตรวจพบปัญหาสิทธิ์ได้อย่างง่ายดายในสคริปต์
lorenzog

5
ไม่ตอบโดยตรงว่า joe สามารถเข้าถึงไฟล์ได้หรือไม่
jfs

15

คุณสามารถใช้ bash เพื่อทำสิ่งนี้

$ cat check-permissions.sh
#!/bin/bash
file=$1
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
    path=.
fi
dirname "$file" | tr '/' $'\n' | while read part ; do
    path="$path/$part"
    # Check for execute permissions
    if ! [[ -x "$path" ]] ; then
        echo "'$path' is blocking access."
    fi
done
if ! [[ -r "$file" ]] ; then
    echo "'$file' is not readable."
fi
$ ./check-permissions.sh /long/path/to/file.txt

sudoการตรวจสอบนี้สำหรับผู้ใช้ที่เฉพาะเจาะจงคุณสามารถใช้

sudo -u joe ./check-permissions.sh /long/path/to/file.txt

สคริปต์ sudo -u joe นี่สคริปต์เป็นชื่อของไฟล์สคริปต์ใช่ไหม? งั้นบอกให้ sudo ทำตัวเหมือนโจกำลังโทรหาสคริปท์เหรอ?
tgkprog

แม่นยำ. ฉันได้แก้ไขคำตอบของฉันเพื่อชี้แจงว่า

ฉันทำการปรับเปลี่ยนเล็กน้อยเพื่อสคริปต์ของฉันเพื่อจัดการเส้นทางที่ไม่แน่นอน

@EvanTeitelman ด้วยเส้นทางที่สมบูรณ์คุณหมายถึงการเริ่มต้นpathว่างเปล่าหรือไม่? หรือ/?
Gilles

@Gilles: ฉันหมายถึงมันว่างเปล่า ในตัวอย่างpathตั้งค่า/longเป็นครั้งแรกรอบลูปซึ่งถูกต้อง ฉันควรตั้งpathให้ไม่มีอะไรชัดเจน ( path=)? นอกจากนี้ขอขอบคุณที่ทำให้การใช้งานของฉันง่ายtrขึ้น

3

ตามที่ฉันได้รับจากคำถามของคุณคุณควรตรวจสอบกับผู้ใช้คนอื่น (ไม่ใช่แค่โจ) ดังนั้นในกรณีนี้วิธีที่ง่ายที่สุดคือการตรวจสอบซ้ำผ่าน sudo ดังนี้:

FILE=$1 ; T_USER=$2 ;
if sudo -u $T_USER [ -r "$FILE" ] ; then
    echo "original file $1 is readable for $T_USER"
else
    while sudo -u $T_USER [ ! -x "$FILE" ] ; do FILE=$(dirname "$FILE") ; done
    echo "only $FILE is readable for $T_USER"
fi

ใช้:

./script.sh /long/path/to/file.txt joe

โจต้องการดำเนินการอนุญาตในไดเรกทอรีไม่อ่านสิทธิ์

@EvanTeitelman ใช่คุณพูดถูก แก้ไขแล้ว.
เร่ง

@rush ฉันพยายามที่จะทดสอบได้โดยใช้ไฟล์ต่อไปนี้: /root/test/test.txt (สิทธิ์0755, 0700และ0777) ฉันออกและมันสะท้อน./script.sh /root/test/test.txt joe original file /root/test/test.txt is readable for joeนอกจากนี้ในขณะที่ลองสิ่งนี้ฉันได้ทำการทดสอบผิด dir: ./script.sh /root/tst/test.txt joeและมันก็สะท้อนออกoriginal file /root/tst/test.txt is readable for joeมา ฉันพลาดอะไรไปหรือเปล่า?
Metalcoder

@ Metalcoder ขออภัยมันเป็นความผิดของฉัน มีเครื่องหมายอัศเจรีย์พิเศษหนึ่งครั้ง มันถูกลบออกไปแล้วคุณสามารถลองอีกครั้งมันควรจะทำงานได้ดีในขณะนี้
เร่ง

@ มันเร่งทำงาน! เครื่องหมายอัศเจรีย์พิเศษนั้นขัดแย้งกับผลลัพธ์-r $FILEใช่ไหม
Metalcoder

1

นี่คือความพยายามของฉันที่ให้ฟังก์ชั่นนี้ ฉันเลือกที่จะใช้statเป็นห่วงและwhiledirname

ฉันได้สร้างสคริปต์นี้walkdir.bash:

#/bin/bash

cwd="$1"
while [ "x$cwd" != x/ ]; do
  info=`stat "$cwd" |grep "Access: ("`
  printf "%s : %s\n" "$info" "$cwd"

  cwd=`dirname "$cwd"`;
done

คุณเรียกใช้เช่น:

$ walkdir.bash "/home/saml/blog/vmware_networking_tutorial/url.txt"
Access: (0664/-rw-rw-r--)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial/url.txt
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog
Access: (0700/drwx------)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root) : /home
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.