ฉันจะตรวจสอบการอนุญาตซ้ำ ๆ ย้อนกลับได้อย่างไร


25

มีคำสั่งฉันคิดว่ามันมาพร้อมกับ apache หรือเกี่ยวข้องกับมันอย่างใดอย่างหนึ่งที่ตรวจสอบสิทธิ์ตลอดทางลง ดังนั้นถ้ามี/home/foo/bar/bazก็จะบอกฉันว่าสิทธิ์ที่มีการbaz, bar, และfoo homeไม่มีใครรู้ว่าคำสั่งนี้หรือวิธีการทำเช่นนี้? โดยพื้นฐานแล้วคำสั่งเริ่มต้นที่อาร์กิวเมนต์และทำงานเป็นวิธีขึ้นเพื่อ/แจ้งให้คุณทราบว่ามีการอนุญาตไปพร้อมกันเพื่อให้คุณสามารถดูว่าคุณมีปัญหาการอนุญาต

คำตอบ:


28

ยูทิลิตี้ที่คุณอาจคิดว่าเป็นnameiคำสั่ง ตามคู่มือหน้า:

Namei ใช้อาร์กิวเมนต์เป็นชื่อพา ธ ของไฟล์ Unix ทุกประเภท (symlink, ไฟล์, ไดเรกทอรีและอื่น ๆ ) จากนั้น Namei จะติดตามแต่ละชื่อพา ธ จนกระทั่งพบจุดเทอร์มินัล (ไฟล์ไดเรกทอรีอุปกรณ์ถ่าน ฯลฯ ) หากพบลิงก์สัญลักษณ์เราจะแสดงลิงค์นั้นและเริ่มติดตามลิงก์โดยเยื้องเอาต์พุตเพื่อแสดงบริบท

ผลลัพธ์ที่คุณต้องการสามารถรับได้ดังนี้:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

nameiคำสั่งเป็นส่วนหนึ่งของลินุกซ์ util-ngแพคเกจซอฟต์แวร์ ดู หน้าคู่มือสำหรับรายละเอียดเพิ่มเติม


อาจดูเหมือนว่าใช้สำหรับ symlink เท่านั้นแม้ว่าฉันจะไม่จดจำสิ่งที่ฉันใช้และไม่ว่าจะเป็น symlink ก็ตาม
xenoterracide

ในขณะที่ฉันเห็นหน้าคู่มือเก่าที่กล่าวถึง symlink เท่านั้นทั้งในตัวอย่างของฉันและ man page แสดงเป็นคำสำหรับไฟล์และไดเรกทอรีทุกประเภท
Steven D

ไม่ใช่สำหรับฉัน :( มันให้รายชื่อยาว ๆ แบบนั้นสำหรับฉันด้วย symlinks
xenoterracide

คุณใช้เวอร์ชั่นอะไร ฉันใช้2.18
xenoterracide

2
อีกวิธีที่มีประโยชน์ในการใช้ namei สำหรับผู้ที่ขี้เกียจ namei -l $PWD/public_html/จาก dir ปัจจุบันของคุณให้เรา $ PWD เพื่อรับรายการ perms จนถึง dir ปัจจุบันของคุณ
nelaaro

7

ฉันไม่ทราบคำสั่งใด ๆ แต่มันค่อนข้างง่ายในการเขียนสคริปต์:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG=`dirname -- "$ARG"`      
done

ตัวอย่าง:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp

2

วิธีการเกี่ยวกับฟังก์ชั่นทุบตีซ้ำเพื่อความสนุก

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 

นี่คือสิ่งที่ฉันชอบเพราะมันไม่จำเป็นต้องพึ่งพา อาจต้องการที่จะทำให้มันcd .. >/dev/nullสำหรับพวกเราด้วย$CDPATHชุด (ซึ่งทำให้ซีดีเพื่อส่งออก dir ปัจจุบันเมื่อมีการใช้งานและที่รบกวนกับเอาท์พุทจากฟังก์ชั่นของคุณ.)
beporter

2

ฉันคิดว่าคำสั่งที่คุณมองหาคือ:

namei -l `pwd`

ซึ่งเมื่อดำเนินการใน / tmp / foo / bar จะให้รายชื่อดังนี้:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar

1

สิ่งนี้สามารถทำให้เป็นหนึ่งซับได้อย่างง่ายดาย นี่ไม่ใช่การเรียกซ้ำและควรเป็นวิธีที่รวดเร็วในการทุบตี การโทรpwdในแต่ละวงนั้นไม่เร็วนักดังนั้นควรหลีกเลี่ยงถ้าทำได้

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

ทางเลือกหนึ่งซับสำหรับไดเร็กทอรีปัจจุบัน

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)

นั่นเป็นหนึ่งซับหรือเปล่า ฉันพลาดอะไรไปหรือเปล่า?
phunehehe

เป็นหนึ่งซับในสำหรับ pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; ไอเอฟเอ = "/"; สำหรับ dir เป็น $ (pwd); ทำ stat -c "$ (pwd)% A".; cd .. ; ทำ; ไอเอฟเอ = $ OIFS; ป๊อป> / dev / null
ewindisch

สคริปต์ของคุณจะไม่ทำงานกับชื่อไฟล์ที่มีช่องว่างหรือตัวอักษรกลม
Gilles 'หยุดความชั่วร้าย'

กิลล์ฉันเดาไม่ได้ ตอนแรกมันมี แต่ฉัน mucked ขึ้นในการแก้ไข ฉันลบ xargs ออกแล้วและควรทำงานอย่างถูกต้องอีกครั้ง
ewindisch

ทำไมต้องใช้ pushd และ popd หรือ eval สำหรับเรื่องนั้น? คุณสามารถใช้ subshell (วงเล็บ) เพื่อให้การเปลี่ยนแปลงทั้งหมดอยู่ในเครื่อง คุณต้องใช้เครื่องหมายอัญประกาศคู่เพื่อป้องกันชื่อไดเรกทอรีด้วยช่องว่างและset -fปิด globbing cd -Pติดตาม symlink ทั้งหมด
Gilles 'หยุดความชั่วร้าย'

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