Làm cách nào để kiểm tra đệ quy quyền ngược lại?


25

Có một lệnh, tôi nghĩ rằng nó đi kèm với apache, hoặc bằng cách nào đó có liên quan đến nó, kiểm tra các quyền, tất cả các cách xuống. Vì vậy, nếu tôi có /home/foo/bar/baznó sẽ cho tôi biết những gì có quyền hạn cho baz, bar, foo, và home. Có ai biết lệnh này là gì hoặc cách khác để làm điều này không? Lệnh về cơ bản bắt đầu tại đối số và hoạt động theo cách của nó để /cho bạn biết các quyền là gì để bạn có thể xem bạn có vấn đề về quyền hay không.

Câu trả lời:


28

Tiện ích bạn có thể nghĩ đến là nameilệnh. Theo trang hướng dẫn:

Namei sử dụng các đối số của nó làm tên đường dẫn cho bất kỳ loại tệp Unix nào (symlink, tệp, thư mục, v.v.). Namei sau đó theo từng tên đường dẫn cho đến khi tìm thấy điểm cuối (tệp, thư mục, thiết bị char, v.v.). Nếu nó tìm thấy một liên kết tượng trưng, ​​chúng tôi hiển thị liên kết đó và bắt đầu theo dõi nó, thụt đầu ra để hiển thị bối cảnh.

Đầu ra mà bạn mong muốn có thể được nhận như sau:

$ 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

Các nameilệnh là một phần của linux-util-ng gói phần mềm. Xem trang hướng dẫn để biết thêm chi tiết.


có thể là, dường như nó chỉ làm điều đó cho các liên kết tượng trưng, ​​mặc dù tôi không nhớ những gì tôi đang sử dụng và liệu nó có trên một liên kết tượng trưng không.
xenoterracide

Mặc dù tôi thấy các trang hướng dẫn cũ hơn chỉ đề cập đến các liên kết tượng trưng, ​​như cả ví dụ của tôi và trang man hiển thị, nó có từ cho tất cả các loại tệp và thư mục.
Steven D

không dành cho tôi :( nó dài đưa ra một danh sách dài như thế, đối với tôi, với các liên kết tượng trưng.
xenoterracide

Phiên bản nào bạn đang sử dụng? Tôi đang sử dụng 2.18
xenoterracide

2
một cách hữu ích khác để sử dụng namei cho những người lười biếng. namei -l $PWD/public_html/Từ thư mục hiện tại của bạn, chúng tôi $ PWD để có được danh sách cho phép đến thư mục hiện tại của bạn.
nelaaro

7

Tôi không biết bất kỳ lệnh nào, nhưng viết kịch bản khá dễ:

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

Thí dụ:

$ 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

Làm thế nào về một hàm bash đệ quy cho một giải pháp thú vị:

[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#] 

Đây là yêu thích của tôi vì nó không yêu cầu phụ thuộc. Có thể muốn làm cho nó cd .. >/dev/nullmặc dù đối với những người trong chúng ta có một $CDPATHbộ (khiến cd xuất ra thư mục hiện tại khi nó được sử dụng và gây cản trở đầu ra từ chức năng của bạn.)
beporter

2

Tôi nghĩ rằng lệnh bạn tìm kiếm là:

namei -l `pwd`

mà, khi được thực thi trong / tmp / foo / bar, sẽ cung cấp cho bạn một danh sách như:

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

1

Điều này có thể dễ dàng được thực hiện một lót. Đây không phải là đệ quy và nên là một cách tương đối nhanh để làm điều này trong bash. Gọi pwd trong mỗi vòng lặp không đặc biệt nhanh, vì vậy hãy tránh nếu bạn có thể.

#!/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

Thay thế, một lót cho thư mục hiện tại.

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

Đó có phải là một lót? Tôi đã bỏ lỡ một cái gì đó?
phunehehe

Là một lớp lót cho pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; cho dir bằng $ (pwd); làm stat -c "$ (pwd)% A" .; cd ..; làm xong; IFS = $ OIFS; popd> / dev / null
ewindisch

Tập lệnh của bạn sẽ không hoạt động với tên tệp chứa dấu cách hoặc ký tự toàn cầu.
Gilles 'SO- ngừng trở nên xấu xa'

Gilles, tôi đoán là không. Nó đã có ban đầu, nhưng tôi đã chỉnh sửa nó. Tôi đã xóa xargs và nó sẽ hoạt động bình thường trở lại.
ewindisch

Tại sao sử dụng Pushd và popd? Hoặc eval, cho vấn đề đó? Bạn có thể sử dụng một lớp con (dấu ngoặc đơn) để giữ tất cả các thay đổi cục bộ. Bạn cần dấu ngoặc kép để bảo vệ tên thư mục có dấu cách và set -ftắt tính năng toàn cầu. cd -Ptheo tất cả các liên kết tượng trưng.
Gilles 'SO- ngừng trở nên xấu xa'

1

luân phiên, xem xét sử dụng findvớitac

find /path -printf '%M %u %g %p\n' | tac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.