Cara mendapatkan nomor izin dengan string: -rw-r - r--

53

Saya perlu mengatur chmod yang sama, bagaimana cara mendapatkan nomor untuk -rw-r - r-- ?

cnd
sumber
2
Secara terprogram atau Anda hanya perlu tahu cara menerjemahkan?
mattdm
Saya malas menerjemahkan :) stat baik-baik saja untuk saya.
cnd
9
Apa yang Anda maksud dengan "mengatur yang sama"? Apakah Anda sudah memiliki file dengan izin -rw-r-r-- dan ingin mengatur file lain dengan izin yang sama? Kemudian lihat apakah chmoddukungan Anda --reference: "--referensi = RFILE gunakan mode RFILE alih-alih nilai MODE" - man chmod.
manatwork
Apa Unix yang Anda gunakan?
Kusalananda

Jawaban:

53

Silakan periksa statoutput:

# stat .xsession-errors 
  File: ‘.xsession-errors’
  Size: 839123          Blocks: 1648       IO Block: 4096   regular file
Device: 816h/2070d      Inode: 3539028     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/     lik)   Gid: ( 1000/     lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
 Birth: -
lik
sumber
11
stat -c %a /path/to/fileadalah trik sulap yang Anda butuhkan.
fromnaboo
dan jawabannya ada di blok Access di atas. File yang dia gunakan dalam contoh memiliki set akses yang berbeda dari yang ada di pertanyaan. yang ada di pertanyaan akan menunjukkan Akses: (0644 / -rw-r - r--)
nycynik
65
r=4
w=2
x=1

di setiap kelompok. Contoh Anda adalah 6 (r + w = ​​4 + 2) 4 (r = 4) 4 (r = 4).

Jan Marek
sumber
26

Nomor mode izin penuh adalah angka oktal 4 digit, meskipun sebagian besar waktu, Anda hanya menggunakan 3 digit paling tidak signifikan. Jumlahkan setiap grup dalam string izin, dengan mengambil r = 4, w = 2, x = 1. Sebagai contoh:

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

Sekarang, kadang-kadang Anda akan melihat kesederhanaan aneh seperti ini:

-rwsr-xr-T

Digit keempat kelebihan beban ke xbit dalam modestring. Jika Anda melihat huruf selain dari xsana, maka itu berarti salah satu dari bit keempat digit "khusus" ini diatur, dan jika hurufnya lebih kecil, maka xuntuk posisi itu juga ditetapkan. Jadi terjemahan untuk yang ini adalah:

   4  2  1
 421421421
-rwsr-xr-T
   +  +  +  -- s+_+T = 4+0+1 = 5  
 \_/        -- r+w+s = 4+2+1 = 7  (s is lowercase, so 1)
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+T = 4+0+0 = 4  (T is uppercase, so 0)   => 05754

Cara UNIX standar untuk menunjukkan bahwa angka adalah oktal adalah memulainya dengan nol. GNU chmodakan menganggap mode yang Anda berikan itu oktal, tetapi paling aman untuk menambahkan nol.

Akhirnya, jika Anda melihat a +di akhir yang sederhana:

-rwxr-xr-x+

maka itu berarti file tersebut telah memperpanjang izin, dan Anda akan membutuhkan lebih dari chmod. Lihatlah ke dalam setfacldan getfaclperintah, untuk pemula.

Jander
sumber
10

Ini mungkin mudah

-bash-3.2$ stat --format=%a sample_file
755
Sridhar
sumber
3

Izin hanyalah representasi string dari angka biner.
Sebagian 0besar diwakili oleh -, sisanya adalah surat.

dasar

Untuk izin dasar:

Konversikan semua -dan tutup Satau Tmenjadi 0, sisanya harus mewakili 1.
Angka biner yang dihasilkan yang dibangun harus dicetak sebagai oktal:

$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

Dalam satu baris:

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

Galat koreksi dan mendeteksi 3 bit lainnya 1000, 2000atau 4000memerlukan beberapa kode lagi:

#!/bin/bash

Say     (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }

e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"

a=$1

((${#a}>10))  &&   SayError 1 "$e1"
((${#a}==10)) && { Say        "$e2"; a=${a#?}; }
((${#a}<9))   &&   SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9))   &&   SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4)) 
[[ $a =~    [sS]...$ ]] && c=$((c|2)) 
[[ $a =~       [tT]$ ]] && c=$((c|1))

printf '%04o\n' "$((2#$b|c<<9))"
Panah
sumber
0

Dapatkan daftar file dengan nilai izin string dan hex mereka. Menempatkan% N di bagian akhir agar hasilnya dapat dimasukkan ke dalam Excel dengan lebih mudah.

stat -c "%A %a %N" *

-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'

Ini akan menemukan semua file dengan izin heks tertentu.

find /tmp1 -user root -perm 644
MacGyver
sumber
-2

Untuk semua file bersamaan dalam Dir

-bash-4.1$ chmod -R 640 *

Untuk semua file

-bash-4.1$ chmod 640 *
shekar
sumber