Vraag Hoe kan ik octale bestandspermissies krijgen via de opdrachtregel?


Er is een chmod commando om bestandspermissies in te stellen, maar krijg ik bestandspermissies in de octale modus (zoals 755) van de opdrachtregel?


316
2018-06-17 08:04


oorsprong




antwoorden:


Je kan het proberen

stat -c "%a %n" *

Vervangen * met de relevante map of de exacte bestandsnaam die u wilt bekijken.

Van de manpagina van 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

Gebruik:

  • Met bestanden:

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

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

(Referentie)


450
2018-06-17 08:08



op mac os, gebruik stat -f '%A %a %N' * (credit: geeklog.adamwilson.info/article/58/...) - s2t2
Als je meer vertrouwd bent met ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends looping aan de uitgang van ls is een slecht idee. Als je echt een lus wilt gebruiken die je kunt doen for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Waarom is alles op Mac OS iets veranderd (zelfs in Unix ISO-utils)? Is er een echte reden hiervoor? - Vassilis
@Hackel, vertel ons hoe je je echt voelt. lol! - MikeSchinkel


Bestandsrechten in Linux kunnen in octaal formaat worden weergegeven met behulp van de Linux stat-opdracht.

Druk gewoon op Ctrl+alt+T op je toetsenbord om Terminal te openen. Wanneer het wordt geopend, gaat u naar de map waarin u de bestandspermissies in de octaalmodus wilt vinden.

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

% A Toegangsrechten in menselijk leesbare vorm

% a Toegangsrechten in octaal

% n Bestandsnaam

Octale nummers en rechten

U kunt octaal nummer gebruiken om modus / toestemming weer te geven:

r: 4
w: 2
x: 1

Voor de bestandseigenaar kunt u bijvoorbeeld de octaalmodus als volgt gebruiken. Lezen,   schrijf en voer (volledige) toestemming uit voor een bestand in octaal is 0 + r + w + x =   0 + 4 + 2 + 1 = 7

Alleen lees- en schrijfrechten voor een bestand in octaal is 0 + r + w + x = 0 + 4 + 2 + 0   = 6

Alleen de machtiging lezen en uitvoeren op een bestand in octaal is 0 + r + w + x =   0 + 4 + 0 + 1 = 5

Gebruik de bovenstaande methode om de toestemming voor de groep en anderen te berekenen. Laat ons   zeg dat je de volledige toestemming aan de eigenaar wilt geven, lees & voer uit   toestemming om te groeperen en alleen toestemming te lezen voor anderen, dan heb je dat nodig   om de toestemming als volgt te berekenen: Gebruiker = r + w + x = 0 + 4 + 2 + 1 = 7 Groep =   r + w + x = 0 + 4 + 2 + 0 = 6 Andere = r + w + x = 0 + 0 + 0 + 1 = 1

De effectieve toestemming is 761.

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


37
2018-06-17 08:14



De eerste 0 vertegenwoordigen ook een speciaal bit: pastebin.com/6ymkFt71 - Braiam


Zoals beschreven in "755" -achtige rechten met 'ls' door Adam Courtemanche op AgileAdam.com, je kunt creëren een alias  lso dat doet alsof ls -l maar verwerkt de uitvoer lichtjes1 om machtigingen ook in octaal weer te geven. Hiermee wordt een hoofdkolom toegevoegd die uit drie cijfers bestaat2 octale permissies. Zoals geschreven, werkt dit voor de meeste bestanden en mappen, maar het werkt niet correct als het kleverig of setuid / setgid bits zijn ingesteld.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}'"

Dit heeft echter een ernstige tekortkoming Techtonik  wijst erop. U kan geen argumenten doorgeven hieraan lso alias zoals je zou doen de ls opdracht, omdat ze als extra argumenten worden gebruikt awk in plaats daarvan. Je kunt dus niet rennen lso in een specifiek bestand of map, en je kunt ook geen opties doorgeven (zoals -Fof --color) naar lso.


De oplossing is om te definiëren lso  als een functie in plaats van een 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}'; }

Als je dit interactief in je shell probeert, start dan unalias lso om de alias te verwijderen - u kunt dat doen vóór of na het definiëren van de functie. Als je het in een bestand stopt dat afkomstig is, zoals ~/.bashrc, haal gewoon de alias regel en voeg de functiedefinitie toe.

Waarom werkt dit? In tegenstelling tot aliassen, bash-shell-functies kunnen positionele parameters aannemen, d.w.z. opdrachtregelargumenten. "$@" breidt uit naar de volledige lijst met argumenten, waardoor argumenten voor de lso functie waaraan moet worden doorgegeven ls. (Anders dan een aliasdefinitie, wordt een functie-instantie niet geciteerd, daarom was het noodzakelijk om de \karakters voor $ en ".)

Aangezien u opties kunt doorgeven aan lso indien op deze manier gedefinieerd als een functie, wilt u misschien de -a en -G opties uit de definitie - u kunt ze handmatig doorgeven in de gevallen waarin u ze wilt hebben. (De -l optie is vereist voor details zoals bestandspermissies die getoond moeten worden helemaal niet, dus er is geen voordeel aan het verwijderen.)

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

Dankzij Techtonik voor wijzend op de beperking bij het definiëren lso als een alias, dus motiverend voor mij om deze post uit te breiden met materiaal over het in plaats hiervan een functie te maken.


1Men kan opmerken dat dit lijkt te negeren de algemene regel over het ontleden van uitvoer van ls. ls produceert zeer menselijk leesbare uitvoer; dit introduceert eigenaardigheden en beperkingen waardoor het in het algemeen ongeschikt is als invoer voor andere opdrachten. In dit geval we ontleden ls sinds we willen het exacte gedrag van ls behalve onze een toegevoegde verandering.

2Een beperking van deze alias, die ook van toepassing is op de functieversie die hieronder wordt weergegeven en die als een bug kan worden beschouwd, is dat deze alleen drie octale cijfers weergeeft zelfs wanneer het vierde octale cijfer nul is. Als jfmercer heeft terecht opgemerkt, de octale cijfers die hier worden weergegeven, weerspiegelen niet het aanwezige plakkerige bit, noch setuid- of setgid-bits.

3Meer serieus dan alleen het niet tonen van het vierde octale cijfer is dat deze methode gaat uit van ze zijn niet ingesteld, en als ze dat zijn - als je het ziet t, sof S in de toestemmingsstring - dan zou u de octale cijfers moeten negeren. Dit omdat de bits worden afgeleid van de permissies-string op een manier die geen rekening houdt met sticky setuid / setgid-bits.


33
2018-06-17 08:12



werkt niet met mappen - awk: read error (Is a directory) - anatoly techtonik
@techtonik Bedankt voor het wijzen van dit! Ik heb dit antwoord (eindelijk) bijgewerkt met een oplossing hiervoor. - Eliah Kagan
Je kan toevoegen --color parameter voor showkleuren 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


Gewoon uitbreiden \ vereenvoudiging van eerdere 'stat' gerelateerde antwoorden:

Je kunt gewoon rennen:

stat <path_to_file>

De uitvoer bevat octale toestemming samen met andere info.



Details (stat versie en voorbeeld):

# 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

Merk op: (0644/ -rw-r - r--)


17
2017-08-26 16:07





Voor draagbaarheid kunt u gebruiken 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

Als je wilt weten wanneer een fout optreedt, probeer je:

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

6
2017-09-21 15:30



Naast het feit dat ze draagbaar zijn, laat de oplossing van @ cuonglm zien vier octale karakters in plaats van drie, waardoor de staat van het "kleverige bit" wordt getoond dat vaak wordt vergeten. - jfmercer


Je kunt gebruiken find met de -printf actie.

ls toont geen octale permissies, maar u kunt dit gebruiken findop basis van een tijdelijke oplossing:

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

Als u bijvoorbeeld mijn map Video's wilt controleren:

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

De %m format specifier vertelt het -printf actie om octale machtigingen af ​​te drukken, terwijl de %f format specifier zorgt ervoor dat het de bestandsnaam afdrukt.

U kunt meerdere bestandsnamen doorgeven aan find. U kunt zelfs globs gebruiken (bijv. find * -printf "%m:%f\n").

U hoeft een test niet te gebruiken -name of -iname; het is voldoende om de namen van de bestanden of mappen waarin u bent geïnteresseerd door te geven als uitgangspunt find. Dat wil zeggen, lever hun namen als argumenten onmiddellijk na het woord find, zoals hierboven getoond.

find geeft je geweldige controle over hoe het uitvoer toont. Er zijn met name twee wijzigingen die u mogelijk handig vindt:

  • Standaard, find recurses subdirectories, similar to ls -R. Als je niet wilt find om de submappen van de startpunten die u er naartoe bezoekt te bezoeken, kunt u toevoegen -maxdepth 0 (of gebruik -maxdepth met andere waarden om aan te geven hoe diep je wilt dat het gaat).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f toont alleen een bestandsnaam, dus indien find moet recurse om naar een bestand te gaan, je weet misschien niet waar het zich bevindt. Om een ​​pad te tonen, te beginnen met welk startpunt het bestand werd gevonden, gebruik %p in plaats daarvan.

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

Zien man find voor meer informatie over het gebruik van de find opdracht.

Een andere methode (ls en awk)

Dit kan worden gebruikt om alle directorybestanden met hun machtigingen weer te geven:

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

Dit is in essentie hetzelfde commando als in Adam Courtemanche's lso alias, welke dat antwoord geciteerd, voer gewoon uit als een enkele opdracht. Als u dit slechts één keer of in zeldzame gevallen gebruikt, wilt u misschien niet schrijven als een alias of shell-functie.


2
2018-03-07 07:16