Sekizli dosya izinlerini komut satırından nasıl alabilirim?


373

Dosya izinlerini ayarlamak için bir chmod komutu var, ancak komut satırından sekizli modda (755 gibi) dosya izinleri alabilir miyim?


2
Benim gibi, bu sayfaya yanlışlıkla giren ancak Mac'te bunun nasıl yapılacağını arayanlar için: stackoverflow.com/a/14855227/470749
Ryan

2
stat --format "%A" $FILEsize insan tarafından okunabilir bir drwxr-x---format verir . ki yararlı olabilir veya olmayabilir.
Trevor Boyd Smith

Yanıtlar:


535

Deneyebilirsin

stat -c "%a %n" *

*İlgili dizin veya incelemek istediğiniz tam dosya adı ile değiştirin .

Statın man sayfasından ,

-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

Kullanımı:

  • Dosyaları ile:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Klasörlerle:

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

(Referans)


57
mac os kullanmak stat -f '%A %a %N' *: (kredi geeklog.adamwilson.info/article/58/... )
s2t2

1
lsfor f in $(ls -a); do stat -c "%a %n" $f; done;
Şunlarla

2
@ Çıktısı üzerinde dönen binlerce arkadaş lskötü bir fikirdir. Gerçekten bir döngü kullanmak istiyorsanız, yapabilirsinizfor f in *; do stat "%a %n" "$f"; done
Tom Fenech

1
Neden mac os'ta her şey biraz değişiyor (unix iso utils'de bile)? Bunun gerçek bir nedeni var mı?
Vassilis

2
Lütfen @ hackel, bize gerçekten nasıl hissettiğinizi söyleyin. lol!
MikeSchinkel

44

Linux'ta dosya izinleri, Linux stat komutu kullanılarak sekizli bir biçimde görüntülenebilir.

Terminal'i açmak için klavyenizdeki Ctrl+ Alt+ tuşlarına basın T. Açıldığında, sekizlik modda dosya izinlerini bulmak istediğiniz dizine gidin.

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

İnsan tarafından okunabilir biçimde% A erişim hakkı

% s erişim haklarında

% n Dosya adı

Sekizli sayılar ve izinler

Modu / izni göstermek için sekizli sayıyı kullanabilirsiniz:

r: 4
w: 2
x: 1

Örneğin, dosya sahibi için sekizli modu aşağıdaki gibi kullanabilirsiniz. Sekizli bir dosyada okuma, yazma ve yürütme (dolu) izni 0 + r + w + x = 0 + 4 + 2 + 1 = 7

Sekizlik bir dosya üzerinde sadece okuma ve yazma izni 0 + r + w + x = 0 + 4 + 2 + 0 = 6

Sekizlik bir dosya üzerinde sadece okuma ve yürütme izni 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Grup ve diğerleri için izin hesaplamak için yukarıdaki yöntemi kullanın. Sahibine tam izin vermek, gruba okumak ve yürütmek için izin vermek ve başkalarına salt izin vermek istediğinizi varsayalım, sonra aşağıdaki gibi izinleri hesaplamanız gerekir: Kullanıcı = r + w + x = 0 + 4 + 2 + 1 = 7 Grup = r + w + x = 0 + 4 + 2 + 0 = 6 Diğer = r + w + x = 0 + 0 + 0 + 1 = 1

Etkili izin 761'dir.

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


2
İlk 0 da özel biti temsil eder: pastebin.com/6ymkFt71
Braiam

36

Detaylandırıldığı gibi 'ls' ile “755” tarzı izinleri tarafından Adam Courtemanche üzerinde AgileAdam.com , oluşturabileceğiniz bir takma ad lso gibi davranır ls -lama biraz çıkışını işler 1 de sekizlik ekran izinlerine. Bu, üç basamaklı 2 sekizlik izinlerini gösteren ana bir sütun ekler . Yazıldığı gibi, bu çoğu dosya ve dizin için çalışır, ancak yapışkan veya setuid / setgid bitleri ayarlanmışsa düzgün çalışmaz . 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}'"

Techtonik'in işaret ettiği gibi, bunun ciddi bir eksikliği var . Sen argümanları geçemeyen bu lsosize yaptığınız gibi takma komuta onlar için ek argüman olarak alınır çünkü, bunun yerine. Böylece, belirli bir dosya veya dizinde koşamazsınız ya da herhangi bir seçeneği (gibi veya ) geçiremezsiniz .lsawklso-F--colorlso


Düzeltme, takma ad yerine lso bir işlev tanımlamaktır .

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

Bunu kabuğunuzda etkileşimli olarak deniyorsanız unalias lso, diğer adı kaldırmak için çalıştırın - işlevi tanımlamanızdan önce veya sonra yapabilirsiniz. Eğer böyle bir dosyaya koyuyorsanız, örneğin ~/.bashrc, aliassatırı çıkartın ve fonksiyon tanımını ekleyin.

Bu neden işe yarıyor? Diğer adların aksine, bash shell işlevleri konumsal parametreleri , yani komut satırı argümanlarını alabilir . "$@"tam argüman listesine genişler ve bu , lsoişleve iletilecek argümanlara neden olur ls. (Bir diğer ad tanımından farklı olarak, bir işlev gövdesi alıntılanmaz; bu nedenle ve önceki \karakterleri kaldırmak gerekliydi .)$"

lsoBu şekilde bir işlev olarak tanımlandığında seçenekleri geçebildiğiniz için , -ave -Gseçenekleri tanımdan kaldırmak isteyebilirsiniz - istediğiniz durumlarda el ile iletebilirsiniz. ( Opsiyon gösterilmesini dosya izinleri gibi detaylar için gereklidir hiç , bu yüzden hiçbir yararı çıkarmadan için vardır.)-l

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

Teşekkür etmek techtonik için sınırlama işaret tanımlamada lsobu şekilde bir işlev yerine bunu yapma konusunda malzeme ile bu yayını genişletmek için beni motive, bir takma ad olarak.


1 Biri bunun , çıktının ayrıştırılmamasıyla ilgili genel kuralıls aşağıladığını söyleyebilir . lsçok okunaklı çıktılar üretir; bu, diğer komutlar için girdi olarak genellikle uygun olmadığından, kendi kendine özgüllükler ve sınırlamalar getirmektedir. Bu durumda biz ayrıştırmak lsberi biz tam davranışını korumak isteyenls bizim hariç tek eklendi değişim.

2 Bu takma adın, aşağıda gösterilen işlev sürümüne de uygulanan ve bir hata olarak düşünülebilecek bir sınırlaması , dördüncü sekizlik basamak sıfır olduğunda bile, yalnızca üç sekizlik basamak göstermesidir . Gibi jfmercer etti haklı olarak işaret , burada görüntülenen sekizlik rakam yapışkan bit eğer mevcut, ne de setuid veya setgid bit yansıtmamaktadır.

3 Daha ciddi sadece dördüncü sekizlik rakamı gösterilmiyor daha bu yöntem olmasıdır varsayar onlar ayarlanmaz ve görürseniz - eğer olurlarsa t, sya Sizin dizede - o zaman sekizlik basamak göz ardı edilmelidir . Bunun nedeni, bitlerin izin dizesinden yapışkan setuid / setgid bitlerini hesaba katmayacak şekilde çıkarılmasıdır.


dizinlerle çalışmaz -awk: read error (Is a directory)
anatoly techtonik

@techtonik Bunu işaret ettiğiniz için teşekkür ederiz! Ben (nihayet) bu cevabı bunun için bir düzeltme içerecek şekilde güncelledim.
Eliah Kagan

1
Ekleyebilir --colorgösteri renkler için parametreyilso() { 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

1
Bunu gönderdikten sonra yapışkan setuid / setgid konusuna bir çözüm buldunuz mu?
Silvestris

21

Sadece önceki 'stat' ile ilgili cevapları basitleştirmek \.

Basitçe koşabilirsiniz:

stat <path_to_file>

Çıktı, diğer bilgilerle birlikte sekizli izin içerecektir.



Ayrıntılar (stat versiyonu ve örnek):

# 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

Şunlara dikkat edin: ( 0644 / -rw-r - r--)


6

Taşınabilirlik için şunları kullanabilirsiniz 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

Bir hata oluştuğunda fark etmek istiyorsanız, şunu deneyin:

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

2
Taşınabilir olmasının yanı sıra, @ cuonglm'in çözümü üç yerine dört sekizlik karakter gösterir , böylece genellikle unutulan "yapışkan bit" in durumunu gösterir.
jfmercer

2

Eylem findile kullanabilirsiniz -printf.

lssekizli izinleri göstermiyor, ancak bu findtabanlı geçici çözümü kullanabilirsiniz :

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

Örneğin, Videolar dizini kontrol etmek için:

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

%mBiçim belirteci söyler -printfiken, sekizlik izinleri yazdırmak için harekete %fbiçim belirteci dosya adını yazdırmak için neden olur.

Birden çok dosya adı iletebilirsiniz find. Globları bile kullanabilirsiniz (örneğin, find * -printf "%m:%f\n").

Sen gibi bir test kullanmak zorunda değilsiniz -nameya -iname; İlgilendiğiniz dosya veya dizin isimlerinin başlangıç ​​noktaları olarak aktarılması yeterlidir find. Yani, adlarını kelimeden hemen sonra findyukarıda gösterildiği gibi argümanlar olarak belirtin .

findçıktıyı gösterme konusunda size büyük kontrol sağlar. Özellikle faydalı bulabileceğiniz iki değişiklik var:

  • Varsayılan olarak, findbenzerlerine benzer alt dizinler alır ls -R. findGeçtiğiniz noktaların alt dizinlerini ziyaret etmek istemiyorsanız , ne kadar derine gitmek istediğinizi belirtmek için ekleyebilir -maxdepth 0(veya -maxdepthdiğer değerlerle birlikte kullanabilirsiniz ).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fyalnızca bir dosya adı gösterir, bu nedenle findbir dosyaya ulaşmak için yinelenmek zorunda kalırsa , nerede olduğunu bilmiyor olabilirsiniz. Bir dosyanın yolunu bulmak için, hangi başlangıç ​​noktasından başlandığı ile başlayıp %pyerine kullanın.

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

Komutu man findkullanma hakkında daha fazla bilgi için bkz..find

Başka Bir Yöntem ( lsve awk)

Bu, tüm dizin dosyalarını izinleriyle listelemek için kullanılabilir:

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

Bu esasen Adam Courtemanche'ın lsotakma adı verilen ve sadece tek bir emir gibi verilen emirle aynı emirdir. Bunu yalnızca bir kez veya nadir durumlarda kullanıyorsanız, takma ad veya kabuk işlevi olarak yazmayı istemeyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.