Pertanyaan Bagaimana saya bisa mendapatkan izin file oktal dari baris perintah?


Ada sebuah chmod perintah untuk mengatur hak akses file, tetapi bisakah saya mendapatkan izin file dalam mode oktal (misalnya 755) dari baris perintah?


316
2018-06-17 08:04


asal




Jawaban:


Anda dapat mencoba

stat -c "%a %n" *

Menggantikan * dengan direktori yang relevan atau nama file yang tepat yang ingin Anda periksa.

Dari halaman manual 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

Pemakaian:

  • Dengan file:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Dengan folder:

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

(Referensi)


450
2018-06-17 08:08



di mac os, gunakan stat -f '%A %a %N' * (kredit: geeklog.adamwilson.info/article/58/…) - s2t2
Jika Anda lebih nyaman dengan ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usdan teman mengulang pada output ls adalah ide yang buruk. Jika Anda benar-benar ingin menggunakan pengulangan, Anda dapat melakukannya for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Mengapa di mac os semuanya sedikit berubah (bahkan di unix iso utils)? Apakah ada alasan sebenarnya dari ini? - Vassilis
Tolong @hackel, beritahu kami bagaimana perasaanmu. lol! - MikeSchinkel


Hak akses file di Linux dapat ditampilkan dalam format oktal menggunakan perintah stat Linux.

Cukup tekan Ctrl+Alt+T di keyboard Anda untuk membuka Terminal. Ketika terbuka, Navigasikan ke direktori tempat Anda ingin mencari izin file dalam mode oktal.

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

% A Hak akses dalam bentuk yang dapat dibaca manusia

% Hak akses dalam oktal

% n Nama file

Angka oktal dan izin

Anda dapat menggunakan nomor oktal untuk merepresentasikan mode / izin:

r: 4
w: 2
x: 1

Misalnya, untuk pemilik file Anda dapat menggunakan mode oktal sebagai berikut. Baca baca,   menulis dan mengeksekusi (penuh) izin pada file dalam oktal adalah 0 + r + w + x =   0 + 4 + 2 + 1 = 7

Hanya Baca dan tulis izin pada file dalam oktal adalah 0 + r + w + x = 0 + 4 + 2 + 0   = 6

Hanya membaca dan mengeksekusi izin pada file dalam oktal adalah 0 + r + w + x =   0 + 4 + 0 + 1 = 5

Gunakan metode di atas untuk menghitung izin untuk grup dan orang lain. Biarkan kami   katakanlah Anda ingin memberikan izin penuh kepada pemilik, membaca & mengeksekusi   izin untuk mengelompokkan, dan hanya membaca izin untuk orang lain, maka Anda perlu   untuk menghitung izin sebagai berikut: Pengguna = r + w + x = 0 + 4 + 2 + 1 = 7 Grup =   r + w + x = 0 + 4 + 2 + 0 = 6 Lainnya = r + w + x = 0 + 0 + 0 + 1 = 1

Izin efektif adalah 761.

Sumber: http://kmaiti.blogspot.com/2011/09/umask-concept.html


37
2018-06-17 08:14



0 awal menunjukkan bit khusus juga: pastebin.com/6ymkFt71 - Braiam


Seperti yang dijelaskan dalam Izin gaya “755” dengan ‘ls’ oleh Adam Courtemanche di AgileAdam.com, Anda dapat membuatnya sebuah alias  lso yang bertindak seperti ls -l tetapi sedikit memproses output1 untuk menampilkan izin juga di oktal. Ini menambahkan kolom terkemuka yang menunjukkan tiga digit2 izin oktal. Seperti yang tertulis, ini berfungsi untuk sebagian besar file dan direktori, tetapi tidak berfungsi dengan benar jika lengket atau setuid / setgid bit ditetapkan.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}'"

Ini memiliki kekurangan yang serius, meskipun, seperti techtonik  menunjukkan. Kamu tidak bisa lewat argumen untuk ini lso alias seperti yang Anda lakukan itu ls perintah, karena mereka dianggap sebagai argumen tambahan awk sebagai gantinya. Dengan demikian Anda tidak bisa berlari lso pada file atau direktori tertentu, Anda juga tidak dapat mengirimkan opsi apa pun (seperti -F, atau --color) ke lso.


Perbaikannya adalah mendefinisikan lso  sebagai fungsi bukannya 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}'; }

Jika Anda mencoba ini secara interaktif di shell Anda, jalankan unalias lso untuk menghapus alias - Anda dapat melakukannya sebelum atau setelah Anda menentukan fungsinya. Jika Anda memasukkannya ke dalam file yang bersumber, seperti ~/.bashrc, keluarkan saja alias garis dan tambahkan definisi fungsi.

Kenapa ini bisa berfungsi? Tidak seperti alias, fungsi shell bash dapat mengambil parameter posisi, yaitu, argumen baris perintah. "$@" meluas ke daftar argumen lengkap, menyebabkan argumen ke lso berfungsi untuk diteruskan ke ls. (Tidak seperti definisi alias, badan fungsi tidak dikutip; oleh karena itu perlu untuk menghapus \karakter sebelumnya $ dan ".)

Karena Anda dapat memberikan opsi kepada lso bila didefinisikan dengan cara ini sebagai fungsi, Anda mungkin ingin menghapus -a dan -G pilihan dari definisi - Anda dapat meneruskannya secara manual jika Anda menginginkannya. (Itu -l opsi diperlukan untuk detail seperti izin file yang akan ditampilkan sama sekali, jadi tidak ada manfaat untuk menghapusnya.)

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

Terimakasih untuk techtonik untuk menunjukkan keterbatasannya dalam mendefinisikan lso sebagai alias, sehingga memotivasi saya untuk memperluas posting ini dengan materi tentang menjadikannya sebuah fungsi sebagai gantinya.


1Orang mungkin mencatat ini tampaknya mencemooh aturan umum tentang tidak mem-parsing output dari ls. ls menghasilkan output yang sangat dapat dibaca manusia; ini memperkenalkan idiosyncrasies dan keterbatasan sehingga umumnya tidak cocok sebagai input untuk perintah lain. Pada kasus ini kita parsing ls sejak kami ingin mempertahankan perilaku yang tepat ls kecuali kami satu menambahkan perubahan.

2Satu batasan dari alias ini, yang juga berlaku untuk versi fungsi yang ditunjukkan di bawahnya, dan yang dapat dianggap sebagai bug, adalah hanya menampilkan tiga digit oktal bahkan ketika digit oktal keempat adalah nol. Sebagai jfmercer punya benar menunjukkan, digit oktal yang ditampilkan di sini tidak mencerminkan bit yang melekat jika ada, atau setuid atau bit setgid.

3Lebih serius daripada sekadar tidak menunjukkan digit oktal keempat adalah metode ini berasumsi mereka tidak diatur, dan jika mereka - jika Anda melihat t, s, atau S dalam string izin - maka Anda harus mengabaikan digit oktal. Ini karena bit disimpulkan dari string izin dengan cara yang tidak memperhitungkan bit setuid / setgid yang lengket.


33
2018-06-17 08:12



tidak berfungsi dengan direktori - awk: read error (Is a directory) - anatoly techtonik
@techtonik Terima kasih telah menunjukkan ini! Saya telah (akhirnya) memperbarui jawaban ini untuk menyertakan perbaikan untuk itu. - Eliah Kagan
Anda dapat menambahkan --color parameter untuk warna acara 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


Hanya memperluas \ menyederhanakan jawaban terkait 'stat' sebelumnya:

Anda cukup menjalankan:

stat <path_to_file>

Output akan berisi izin oktal bersama dengan info lainnya.



Detail (versi stat dan contoh):

# 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

Perhatikan: (0644/ -rw-r - r--)


17
2017-08-26 16:07





Untuk portabilitas, Anda bisa menggunakannya 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

Jika Anda ingin melihat ketika kesalahan terjadi, coba:

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

6
2017-09-21 15:30



Selain menjadi portabel, solusi @ cuonglm menunjukkan empat karakter oktal bukan tiga, sehingga menunjukkan keadaan "bit lengket" yang sering dilupakan. - jfmercer


Kamu dapat memakai find dengan -printf tindakan.

ls tidak menunjukkan izin oktal, tetapi Anda dapat menggunakan ini findsolusi berbasis:

find jalan -printf "%m:%f\n"

Misalnya, untuk memeriksa direktori Video saya:

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

Itu %m penspesifikasi format memberitahu -printf tindakan untuk mencetak izin oktal, sedangkan %f penspesifikasi format menyebabkannya untuk mencetak nama file.

Anda dapat melewati banyak nama file find. Anda bahkan dapat menggunakan globs (misalnya, find * -printf "%m:%f\n").

Anda tidak harus menggunakan tes seperti -name atau -iname; cukup untuk meneruskan nama-nama file atau direktori yang Anda minati sebagai titik awal find. Yaitu, berikan nama mereka sebagai argumen segera setelah kata itu find, seperti yang ditunjukkan di atas.

find memberi Anda kontrol besar atas bagaimana ia menunjukkan output. Ada dua modifikasi khusus yang mungkin berguna bagi Anda:

  • Secara default, find rekursif subdirektori, mirip dengan ls -R. Jika kamu tidak mau find untuk mengunjungi subdirektori titik awal yang Anda lewati, Anda dapat menambahkan -maxdepth 0 (atau gunakan -maxdepth dengan nilai lain untuk menunjukkan seberapa dalam Anda menginginkannya).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f hanya menampilkan nama file, jadi jika find harus recurse untuk mendapatkan file, Anda mungkin tidak tahu di mana ia berada. Untuk menunjukkan jalur, dimulai dengan titik awal mana file itu ditemukan di bawah, gunakan %p sebagai gantinya.

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

Lihat man find untuk informasi lebih lanjut tentang penggunaan find perintah.

Metode Lain (ls dan awk)

Ini dapat digunakan untuk mendaftarkan semua file direktori dengan izinnya:

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

Ini pada dasarnya adalah perintah yang sama seperti pada Adam Courtemanche lso alias, yang mana jawaban itu dikutip, jalankan sebagai satu perintah. Jika Anda hanya menggunakan ini sekali, atau pada kesempatan langka, maka Anda mungkin tidak ingin repot-repot menulisnya sebagai alias atau fungsi shell.


2
2018-03-07 07:16