Komut satırından sekizli dosya izinlerini nasıl alabilirim?

313

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

    
sordu Anwar 17.06.2012 10:04

6 cevap

447

Denemeyi deneyebilirsiniz

stat -c "%a %n" *

* değerini, ilgili dizini veya incelemek istediğiniz tam dosya adı ile değiştirin.

Stat’in insan 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:

  • Dosyalarla:

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

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

(Referans)

    
verilen cevap jokerdino 17.06.2012 10:08
37

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

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

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

İnsanca okunabilir formdaki Erişim hakları A

sekizlik bir Erişim hakları%

% n Dosya adı

  

Sekizli numaralar ve izinler

     

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

r: 4
w: 2
x: 1
     

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

     

Sadece okuma ve yazma izni sekizli bir dosyada 0 + r + w + x = 0 + 4 + 2 + 0   = 6

     

Sadece sekizli bir dosyada okuma ve yürütme izni 0 + r + w + x =   0 + 4 + 0 + 1 = 5

     

Grup ve başkalarının izinlerini hesaplamak için yukarıdaki yöntemi kullanın. Hadi   sahibine tam izin vermek istediğinizi, & amp; gerçekleştirmek   gruplama izni ve sadece başkalarına okuma izni, sonra ihtiyacınız var   izninizi aşağıdaki gibi hesaplamak için: 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

     

Etkin izin 761'dir.

Kaynak: İşte

    
verilen cevap Mitch 17.06.2012 10:14
33

“755” biçimindeki izinler 'ls' ile belirtildiği gibi Adam Courtemanche AgileAdam.com , davranan bir takma ad lso oluşturabilirsiniz ls -l gibi, ancak 1 çıkışını da hafifçe işler ve ayrıca sekizlide de izinleri görüntüler. Bu, üç basamaklı 2 sekizlik izinleri gösteren önde gelen bir sütun ekler. Yazıldığı gibi, bu çoğu dosya ve dizin için çalışır, ancak yapışkan veya setuid/setgid bitleri ayarlandı. 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}'"

Bu, techtonik işaret eder. bu lso takma adına ls komutu , çünkü awk . Böylece, belirli bir dosya veya dizinde lso çalıştırılamaz ve -F 'ye herhangi bir seçenek ( --color veya lso gibi) iletemezsiniz.

Düzeltme lso bir işlev .

lso() { ls -alG "[email protected]" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Bunu etkileşimli olarak kabuğunuzda çalıştırıyorsanız, takma adı kaldırmak için unalias lso dosyasını çalıştırın. Bunu, işlevi tanımladıktan önce veya sonra yapabilirsiniz. Bunu, ~/.bashrc gibi bir kaynağa koyarsanız, alias satırını çıkarmanız ve işlev tanımını eklemeniz yeterlidir.

Bu neden çalışıyor? Diğer adlardan farklı olarak, bash kabuk işlevleri konumsal parametreler alabilir , örneğin, komut satırı argümanları . "[email protected]" , tam argüman listesine genişler ,% co_de'ye argümanlar neden olur lso öğesine geçirilecek% işlevi. (Bir diğer ad tanımından farklı olarak, bir işlev gövdesi aktarılmaz; dolayısıyla ls karakterini \ ve $ öğesinden önce kaldırmak gerekir.)

Bu şekilde bir işlev olarak tanımlandığında seçenekleri " 'ye aktarabildiğinizden, lso ve -a seçeneklerini tanımdan kaldırmak isteyebilirsiniz - bunları istediğiniz durumlarda manuel olarak iletebilirsiniz. . ( Ayrıntılar için -G seçeneği gereklidir hiç görüntülenmeyecek dosya izinleri gibi , bu yüzden onu kaldırmak için herhangi bir faydası yoktur.)

lso() { ls -l "[email protected]" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

techtonik teşekkürler. soruları / 152001 / nasıl-can-i-get-octal-dosya-izinleri-komut satırı-152005 # comment674829_152005 "> -l 'yi bir takma ad olarak tanımlamada sınırlamayı işaret ederek, Bu gönderiyi, bunun yerine bir işlev haline getirme ile ilgili materyallerle genişlet.

1 Bunlardan bir tanesi, genel kural hakkında bilgi vermek gibi görünüyor. çıktıyı lso 'dan ayrıştırmama . ls insan tarafından okunabilir bir çıktı üretir; Bu, diğer komutlar için girdi olarak genel olarak uygun olmayan, kendine özgü kimlikleri ve sınırlamaları getirmektedir. Bu durumda bir eklenen değişiklikimiz hariç ls davranışını tam olarak korumak istediğimizden ls 'ı ayrıştırdık.

2 Aşağıda gösterilen işlev sürümü için de geçerli olan ve bir hata olarak düşünülebilen bu diğer adın bir sınırlaması, yalnızca dördüncü sekizli basamak sıfır olduğunda bile üç sekizlik rakam görüntüler. jfmercer olduğu gibi doğru bir şekilde işaretlendi, sekizlik basamaklar Burada gösteriliyorsa yapışkan bit'i, setuid veya setgid bitlerini yansıtmayın.

3 Yalnızca dördüncü sekizli haneyi göstermektense, bu yöntem ayarlanmadıklarını varsayarlar ve strong> varsa - izin dizesinde ls , t veya s görüyorsanız - bu durumda sekizlik sayıları dikkate almanız gerekir . Bunun nedeni, bitler, yapışkan dizgisi / setgid bitlerini hesaba katmayacak şekilde izin dizesinden çıkar.

    
verilen cevap Eliah Kagan 17.06.2012 10:12
17

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

Basitçe koşabilirsiniz:

stat <path_to_file>

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



Ayrıntılar (stat sürümü ve örnek):

# stat --version
stat (GNU coreutils) 8.4


[[email protected] ~]# touch /tmp/TEST_PERMISSONS

[[email protected] ~]# chmod 644 /tmp/TEST_PERMISSONS

[[email protected] ~]# 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

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

    
verilen cevap Vano 26.08.2015 18:07
6

Taşınabilirlik için perl kullanabilirsiniz:

$ 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 dikkat etmek istiyorsanız, şunu deneyin:

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

find 'yı -printf eylemiyle kullanabilirsiniz.

ls sekizlik izinleri göstermiyor, ancak bu find -baseded geçici çözümünü kullanabilirsiniz:

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

Örneğin, Videolarım dizinini kontrol etmek için:

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

%m biçim belirteci, -printf eylemini sekizlik izinleri yazdırmaya bildirirken, %f biçim belirteci, dosya adını yazdırmasına neden olur.

Birden fazla dosya adını find 'ye geçirebilirsiniz. Hatta globları bile kullanabilirsiniz (ör.% Co_de%).

find * -printf "%m:%f\n" veya -name gibi bir test kullanmanız gerekmez; İlgilendiğiniz dosyaların veya dizinlerin adlarını, -iname 'ye başlangıç ​​noktaları olarak vermek yeterlidir. Yani, adları, yukarıda gösterildiği gibi find kelimesinden hemen sonra argüman olarak sağlayın.

find , çıktıyı nasıl gösterdiği konusunda mükemmel kontrol sağlar. Özellikle yararlı bulabileceğiniz iki değişiklik vardır:

  • Varsayılan olarak, find , find 'ye benzer şekilde alt dizinleri yeniden düzenlemektedir. % Co_de% 'nin kendisine ilettiğiniz başlangıç ​​noktalarının alt dizinlerini ziyaret etmesini istemiyorsanız, ls -R ' yi ekleyebilir (ya da find 'nin ne kadar derine gitmek istediğinizi belirtmek için diğer değerlerle birlikte kullanabilirsiniz).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • -maxdepth 0 yalnızca bir dosya adı gösterir, bu yüzden -maxdepth dosyasının bir dosyaya ulaşmak için tekrarlaması gerekiyorsa, nerede bulunduğunu bilmiyor olabilirsiniz. Dosyanın altında bulunan başlangıç ​​noktasıyla başlayan bir yolu göstermek için, bunun yerine %f 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
    ....

find kullanımı hakkında daha fazla bilgi için %p adresine bakın. komut.

Başka Bir Yöntem ( man find ve find )

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(,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Bu, esas olarak, Adam Courtemanche’ın ls takma adı ile aynı komuttur. Bu bu cevap, sadece tek bir komut olarak çalıştırın. Bunu yalnızca bir kez kullanıyorsanız veya nadiren de kullanıyorsanız, bunu bir takma ad veya kabuk işlevi olarak yazmaktan rahatsızlık duymak istemeyebilirsiniz.

    
verilen cevap Maythux 07.03.2014 08:16

Etiketlerdeki diğer soruları oku