Câu hỏi Làm thế nào tôi có thể nhận được quyền truy cập tập tin bát phân từ dòng lệnh?


Đây là một chmod lệnh để đặt quyền truy cập tệp, nhưng tôi có thể nhận quyền truy cập tệp ở chế độ bát phân (chẳng hạn như 755) khỏi dòng lệnh không?


316
2018-06-17 08:04


gốc




Các câu trả lời:


Bạn co thể thử

stat -c "%a %n" *

Thay thế * với thư mục có liên quan hoặc tên tệp chính xác mà bạn muốn kiểm tra.

Từ trang người đàn ông của stat,

-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

Sử dụng:

  • Với tệp:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Với thư mục:

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

(Tài liệu tham khảo)


450
2018-06-17 08:08



trên mac os, sử dụng stat -f '%A %a %N' * (tín dụng: geeklog.adamwilson.info/article/58/…) - s2t2
Nếu bạn cảm thấy thoải mái hơn với ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends looping trên đầu ra của ls là một ý tưởng tồi. Nếu bạn thực sự muốn sử dụng vòng lặp, bạn có thể làm for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Tại sao trên mac os tất cả mọi thứ là hơi thay đổi (ngay cả trong unix uno uto)? Có lý do thực sự nào về điều này không? - Vassilis
Xin vui lòng @hackel, cho chúng tôi biết bạn thực sự cảm thấy như thế nào. lol! - MikeSchinkel


Quyền truy cập tệp trong Linux có thể được hiển thị ở định dạng bát phân khi sử dụng lệnh stat của Linux.

Chỉ cần nhấn Ctrl+Alt+T trên bàn phím để mở Terminal. Khi nó mở ra, điều hướng đến thư mục mà bạn muốn tìm quyền tệp trong chế độ bát phân.

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

% A Quyền truy cập trong biểu mẫu có thể đọc được của con người

% quyền truy cập trong bát phân

% n Tên tệp

Số và quyền Octal

Bạn có thể sử dụng số bát phân để đại diện cho chế độ / quyền:

r: 4
w: 2
x: 1

Ví dụ: đối với chủ sở hữu tệp, bạn có thể sử dụng chế độ bát phân như sau. Đọc,   quyền ghi và thực hiện (đầy đủ) trên một tệp trong bát phân là 0 + r + w + x =   0 + 4 + 2 + 1 = 7

Chỉ quyền Đọc và ghi trên tệp trong bát phân là 0 + r + w + x = 0 + 4 + 2 + 0   = 6

Chỉ đọc và thực thi quyền trên một tệp trong bát phân là 0 + r + w + x =   0 + 4 + 0 + 1 = 5

Sử dụng phương pháp trên để tính toán quyền cho nhóm và những người khác. Hãy để chúng tôi   nói rằng bạn muốn cho phép chủ sở hữu đầy đủ, đọc và thực thi   cho phép nhóm và chỉ đọc quyền cho người khác, sau đó bạn cần   để tính toán quyền như sau: Người dùng = r + w + x = 0 + 4 + 2 + 1 = 7 Nhóm =   r + w + x = 0 + 4 + 2 + 0 = 6 Khác = r + w + x = 0 + 0 + 0 + 1 = 1

Hiệu lực cho phép là 761.

Nguồn: http://kmaiti.blogspot.com/2011/09/umask-concept.html


37
2018-06-17 08:14



0 ban đầu đại diện cho bit đặc biệt quá: pastebin.com/6ymkFt71 - Braiam


Chi tiết trong Quyền “kiểu 755” với ‘ls’ bởi Adam Courtemanche trên AgileAdam.com, bạn có thể tạo bí danh  lso hoạt động như ls -l nhưng hơi xử lý đầu ra1 để hiển thị các quyền cũng trong bát phân. Điều này thêm cột hàng đầu hiển thị ba chữ số2 quyền bát phân. Theo văn bản, điều này làm việc cho hầu hết các tập tin và thư mục, nhưng nó không hoạt động đúng nếu dính hoặc là setuid / setgid bit được đặt.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}'"

Điều này có một thiếu sót nghiêm trọng, mặc dù, như techtonik  chỉ ra. Bạn không thể chuyển đối số này lso bí danh như bạn muốn các ls chỉ huy, bởi vì chúng được lấy làm đối số bổ sung cho awk thay thế. Do đó bạn không thể chạy lso trên một tệp hoặc thư mục cụ thể và bạn cũng không thể chuyển bất kỳ tùy chọn nào (như -F, hoặc là --color) đến lso.


Sửa chữa là xác định lso  như một chức năng chứ không phải là bí danh.

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}'; }

Nếu bạn đang thử điều này một cách tương tác trong trình bao, hãy chạy unalias lso để xóa bí danh - bạn có thể thực hiện điều đó trước hoặc sau khi bạn xác định hàm. Nếu bạn đặt nó vào một tệp có nguồn gốc, chẳng hạn như ~/.bashrc, hãy lấy ra alias và thêm định nghĩa hàm.

Tại sao điều này hoạt động? Không giống như bí danh, các hàm bash shell có thể lấy các tham số vị trí, I E., đối số dòng lệnh. "$@" mở rộng đến danh sách đối số đầy đủ, gây tranh cãi cho lso chức năng được chuyển đến ls. (Không giống như định nghĩa bí danh, một thân hàm không được trích dẫn, do đó cần phải loại bỏ \ký tự trước $ và ".)

Vì bạn có thể chuyển các tùy chọn đến lso khi được xác định theo cách này như một hàm, bạn có thể muốn xóa -a và -G tùy chọn từ định nghĩa - bạn có thể chuyển chúng theo cách thủ công trong trường hợp bạn muốn chúng. (Các -l tùy chọn là bắt buộc để biết các chi tiết như quyền đối với tệp được hiển thị ở tất cả, vì vậy không có lợi ích gì khi xóa nó.)

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}'; }

Nhờ vào techtonik cho chỉ ra giới hạn trong việc xác định lso như một bí danh, do đó thúc đẩy tôi mở rộng bài đăng này bằng tài liệu về việc biến nó thành một hàm thay thế.


1Người ta có thể lưu ý điều này có vẻ như quy tắc chung về việc không phân tích cú pháp đầu ra từ ls. ls tạo ra đầu ra rất dễ đọc; điều này giới thiệu tính đồng nhất và hạn chế khiến cho nó không phù hợp với tư cách là đầu vào cho các lệnh khác. Trong trường hợp này chúng tôi phân tích ls kể từ đó chúng tôi muốn duy trì hành vi chính xác của ls ngoại trừ một thêm thay đổi.

2Một hạn chế của bí danh này, cũng áp dụng cho phiên bản chức năng được hiển thị bên dưới, và có thể được coi là lỗi, là nó chỉ hiển thị ba số bát phân ngay cả khi chữ số bát phân thứ tư bằng không. Như jfmercer có được chỉ ra đúng, các số bát phân được hiển thị ở đây không phản ánh bit dính nếu có, cũng không phải bit setuid hoặc bit setgid.

3Nghiêm trọng hơn là chỉ không hiển thị chữ số bát phân thứ tư là phương pháp này giả định chúng không được thiết lập, và nếu chúng là - nếu bạn thấy t, s, hoặc là S trong chuỗi quyền - sau đó bạn nên bỏ qua các chữ số bát phân. Điều này bởi vì các bit được suy ra từ chuỗi quyền theo cách không tính đến các bit setuid / setgid dính.


33
2018-06-17 08:12



không hoạt động với các thư mục - awk: read error (Is a directory) - anatoly techtonik
@techtonik Cảm ơn bạn đã chỉ ra điều này! Tôi đã (cuối cùng) cập nhật câu trả lời này để bao gồm một sửa chữa cho điều đó. - Eliah Kagan
Bạn có thể thêm --color tham số cho màu sắc hiển thị 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


Chỉ cần mở rộng \ đơn giản hóa các câu trả lời có liên quan 'stat' trước đó:

Bạn có thể chỉ cần chạy:

stat <path_to_file>

Đầu ra sẽ chứa quyền bát phân cùng với thông tin khác.



Chi tiết (phiên bản stat và ví dụ):

# 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

Lưu ý: (0644/ -rw-r - r--)


17
2017-08-26 16:07





Đối với tính di động, bạn có thể sử dụng 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

Nếu bạn muốn thông báo khi có lỗi xảy ra, hãy thử:

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

6
2017-09-21 15:30



Ngoài việc di chuyển, chương trình giải pháp @ cuonglm bốn ký tự bát phân thay vì số ba, do đó cho thấy trạng thái của "bit dính" thường bị lãng quên. - jfmercer


Bạn có thể dùng find với -printf hoạt động.

ls không hiển thị quyền bát phân, nhưng bạn có thể sử dụng findgiải pháp dựa trên cơ sở:

find con đường -printf "%m:%f\n"

Ví dụ: để kiểm tra thư mục Video của tôi:

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

Các %m định dạng specifier nói với -printf hành động để in quyền bát phân, trong khi %f định dạng specifier làm cho nó in tên tập tin.

Bạn có thể chuyển nhiều tên tệp thành find. Bạn thậm chí có thể sử dụng globs (ví dụ: find * -printf "%m:%f\n").

Bạn không phải sử dụng thử nghiệm như -name hoặc là -iname; đủ để chuyển tên của các tệp hoặc thư mục mà bạn quan tâm làm điểm bắt đầu find. Tức là, cung cấp tên của họ làm đối số ngay sau từ find, như được trình bày ở trên.

find cho phép bạn kiểm soát tuyệt vời cách nó hiển thị đầu ra. Có hai sửa đổi đặc biệt mà bạn có thể thấy hữu ích:

  • Theo mặc định, find đệ quy thư mục con, tương tự ls -R. Nếu bạn không muốn find để truy cập vào các thư mục con của các điểm bắt đầu bạn vượt qua, bạn có thể thêm -maxdepth 0 (hoặc dùng -maxdepth với các giá trị khác để chỉ ra mức độ sâu bạn muốn nó đi).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f chỉ hiển thị tên tệp, vì vậy nếu find phải recurse để có được một tập tin, bạn có thể không biết nó nằm ở đâu. Để hiển thị đường dẫn, bắt đầu với bất kỳ điểm bắt đầu nào mà tệp được tìm thấy bên dưới, hãy sử dụng %p thay thế.

    $ 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
    ....

Xem man find để biết thêm thông tin về cách sử dụng find chỉ huy.

Một phương pháp khác (ls và awk)

Điều này có thể được sử dụng để liệt kê tất cả các tệp thư mục có quyền của chúng:

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}'

Đây thực chất là lệnh giống như trong Adam Courtemanche's lso bí danh, cái nào câu trả lời đó trích dẫn, chỉ cần chạy như một lệnh duy nhất. Nếu bạn chỉ sử dụng này một lần, hoặc trong dịp hiếm hoi, thì bạn có thể không muốn bận tâm viết nó như là một bí danh hoặc chức năng vỏ.


2
2018-03-07 07:16