Memahami izin dan tipe file UNIX

68

Saya tidak pernah benar-benar chmodberhasil sampai hari ini. Saya mengikuti tutorial yang menjelaskan banyak hal kepada saya.

Misalnya, saya pernah membaca bahwa Anda memiliki tiga grup izin berbeda:

  • pemilik ( u)
  • grup ( g)
  • semuanya ( o)

Berdasarkan tiga kelompok ini, saya sekarang tahu bahwa:

  • Jika file tersebut dimiliki oleh pengguna, izin pengguna menentukan akses.
  • Jika grup file sama dengan grup pengguna, izin grup menentukan akses.
  • Jika pengguna bukan pemilik file, dan tidak ada dalam grup, maka izin lainnya digunakan.

Saya juga mengetahui bahwa Anda memiliki izin berikut:

  • baca ( r)
  • tulis ( w)
  • mengeksekusi ( x)

Saya membuat direktori untuk menguji pengetahuan saya yang baru didapat:

mkdir test

Kemudian saya melakukan beberapa tes:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Setelah bermain-main untuk beberapa waktu saya pikir saya akhirnya memahami chmoddan cara Anda mengatur izin menggunakan perintah ini.


Tapi...

Saya masih punya beberapa pertanyaan:

  • Apa yang diperjuangkan ddi awal?
  • Apa nama dan penggunaan slot yang berisi dan nilai-nilai apa yang bisa dimilikinya?
  • Bagaimana saya bisa mengatur dan menghapusnya?
  • Apa nilai untuk ini d? (Karena Anda hanya memiliki 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • Mengapa orang terkadang menggunakan 0777alih-alih 777mengatur izin mereka?

Tetapi karena saya seharusnya tidak mengajukan banyak pertanyaan, saya akan mencoba menanyakannya dalam satu pertanyaan.

Dalam sistem berbasis UNIX seperti semua distribusi Linux, mengenai izin, untuk apa bagian pertama ( d) berdiri dan apa gunanya untuk bagian izin ini?

Peter
sumber
3
Tolong lain kali coba tanyakan hanya satu pertanyaan, banyak pertanyaan yang biasanya buruk untuk referensi dan hampir tidak pernah dibahas pada saat yang sama.
Kiwy
1
@ Kiriw Maaf, saya pikir saya akan melakukannya seperti ini karena menyangkut masalah yang sama. Jika Anda mau, Anda bisa menyarankan judul yang lebih baik untuk pertanyaan saya untuk meningkatkan referensi itu.
Peter
1
Kebetulan, nilai untuk "d" adalah 040000 - ini dapat ditemukan dalam file header di bawah nama S_IFDIR. Anda tidak menggunakannya saat mengatur mode file, tetapi stat()fungsi sebenarnya mengembalikan nilai 040750 untuk drwxr-x---.
Random832
2
@ jamesqf Sebenarnya, sekarang saya mengerti bagaimana peta kode oktal, lebih mudah bagi saya untuk berpikir tentang itu.
HalosGhost
4
@ Peter: tidak ada pertanyaan bodoh - hanya orang bodoh yang tidak belajar karena mereka takut untuk bertanya.
mgarciaisaia

Jawaban:

117

Saya akan menjawab pertanyaan Anda dalam tiga bagian: jenis file, izin, dan kasus penggunaan untuk berbagai bentuk chmod.

Jenis file

Karakter pertama dalam ls -loutput mewakili tipe file; dberarti itu adalah direktori. Itu tidak dapat diatur atau tidak disetel, tergantung pada bagaimana file itu dibuat. Anda dapat menemukan daftar lengkap tipe file dalam dokumentasi ls ; yang mungkin Anda temui adalah

  • -: File "biasa", dibuat dengan program apa pun yang dapat menulis file
  • b: blok file khusus, biasanya perangkat disk atau partisi, dapat dibuat dengan mknod
  • c: file karakter khusus, juga dapat dibuat dengan mknod(lihat /devcontoh)
  • d: direktori, dapat dibuat dengan mkdir
  • l: tautan simbolik, dapat dibuat dengan ln -s
  • p: bernama pipa, dapat dibuat dengan mkfifo
  • s: socket, dapat dibuat dengan nc -U
  • D: door , dibuat oleh beberapa proses server di Solaris / openindiana.

Izin

chmod 0777digunakan untuk mengatur semua izin dalam satu chmodeksekusi, daripada menggabungkan perubahan dengan u+dll. Masing-masing dari empat digit adalah nilai oktal yang mewakili satu set izin:

  • suid, sgiddan "lengket" (lihat di bawah)
  • izin pengguna
  • izin grup
  • Izin "lain"

Nilai oktal dihitung sebagai jumlah dari izin:

  • "Baca" adalah 4
  • "Tulis" adalah 2
  • "Eksekusi" adalah 1

Untuk digit pertama:

  • suidadalah 4; binari dengan bit ini dijalankan sebagai pengguna pemiliknya (umumnya root)
  • sgidadalah 2; biner dengan bit set ini dijalankan sebagai grup pemiliknya (ini digunakan untuk game sehingga skor tinggi dapat dibagikan, tetapi sering kali risiko keamanan saat dikombinasikan dengan kerentanan dalam game), dan file yang dibuat dalam direktori dengan bit ini milik grup pemilik direktori secara default (ini berguna untuk membuat folder bersama)
  • "Lengket" (atau "penghapusan terbatas") adalah 1; file dalam direktori dengan set bit ini hanya dapat dihapus oleh pemiliknya, pemilik direktori, atau root(lihat /tmpuntuk contoh umum ini).

Lihat halaman chmodmanual untuk detailnya. Perhatikan bahwa dalam semua ini saya mengabaikan fitur keamanan lain yang dapat mengubah izin pengguna pada file (SELinux, file ACL ...).

Bit khusus ditangani secara berbeda tergantung pada jenis file (file biasa atau direktori) dan sistem yang mendasarinya. (Ini disebutkan di halaman chmodmanual.) Pada sistem yang saya gunakan untuk menguji ini (dengan coreutils8.23 pada sistem ext4file, menjalankan kernel Linux 3.16.7-ckt2), perilaku adalah sebagai berikut. Untuk file, bit khusus selalu dihapus kecuali ditetapkan secara eksplisit, sehingga chmod 0777setara dengan chmod 777, dan kedua perintah menghapus bit khusus dan memberikan semua orang izin penuh pada file. Untuk direktori, bit khusus tidak pernah sepenuhnya dihapus menggunakan bentuk angka empat digit, sehingga berlaku chmod 0777juga setara denganchmod 777tapi itu menyesatkan karena beberapa bit khusus akan tetap apa adanya. (Versi sebelumnya dari jawaban ini salah.) Untuk menghapus bit khusus pada direktori yang perlu Anda gunakan u-s, g-sdan / atau o-tsecara eksplisit atau tentukan nilai numerik negatif, maka chmod -7000akan menghapus semua bit khusus pada direktori.

Dalam ls -loutput, suid, sgiddan “lengket” muncul di tempat xmasuknya: suidadalah satau Sbukan pengguna x, sgidadalah satau Sbukan kelompok x, dan “lengket” adalah tatau Tbukan orang lain x. Huruf kecil menunjukkan bahwa bit khusus dan bit yang dapat dieksekusi ditetapkan; huruf besar menunjukkan bahwa hanya bit khusus yang disetel.

Berbagai bentuk chmod

Karena perilaku yang dijelaskan di atas, menggunakan empat digit penuh chmoddapat membingungkan (setidaknya ternyata saya bingung). Ini berguna ketika Anda ingin mengatur bit khusus serta bit izin; selain itu bit dihapus jika Anda memanipulasi file, dipertahankan jika Anda memanipulasi direktori. Jadi chmod 2750pastikan Anda akan mendapatkan setidaknya sgiddan tepat u=rwx,g=rx,o=; tetapi chmod 0750tidak akan menghapus bit khusus.

Menggunakan mode numerik alih-alih perintah teks ( [ugo][=+-][rwxXst]) mungkin lebih merupakan kebiasaan dan tujuan dari perintah. Setelah Anda terbiasa menggunakan mode numerik, seringkali lebih mudah untuk hanya menentukan mode penuh seperti itu; dan itu berguna untuk dapat memikirkan izin menggunakan mode numerik, karena banyak perintah lain dapat menggunakannya ( install, mknod...).

Beberapa varian teks bisa berguna: jika Anda hanya ingin memastikan file dapat dieksekusi oleh siapa pun, chmod a+xakan melakukannya, terlepas dari apa pun izin lainnya. Demikian juga, +Xmenambahkan izin eksekusi hanya jika salah satu izin eksekusi sudah ditetapkan atau file tersebut adalah direktori; ini berguna untuk mengembalikan izin secara global tanpa harus ke file kasus khusus v. direktori. Dengan demikian, chmod -R ug=rX,u+w,o=sama dengan menerapkan chmod -R 750ke semua direktori dan file yang dapat dieksekusi dan chmod -R 640ke semua file lainnya.

Stephen Kitt
sumber
Meskipun, jawaban lain cukup bagus, Anda benar-benar menghabiskan waktu untuk menjawab pertanyaan ini. Terima kasih.
Peter
Pada * direktori BSD berperilaku seolah-olah sgidbit mereka selalu ditetapkan, terlepas dari nilai aktualnya. Pada FreeBSD suidbit dapat dikonfigurasi untuk bertindak secara analog sgid(yaitu file dan subdirektori yang dibuat di dalamnya akan memiliki pemilik yang sama dengan direktori), asalkan filesystem yang mendasari mendukung itu, dan sudah terpasang dengan suiddiropsi.
lcd047
" +Xmenambahkan izin eksekusi hanya jika salah satu izin eksekusi sudah disetel atau file tersebut adalah direktori" terima kasih @ stephen-kitt melewatkan dokumentasi "sudah disetel" benar-benar membuat saya loop!
Ryan Fisher
39

Jadi, izin di Linux sangat penting. Saya akan mencoba membuat penjelasan singkat.

Untuk potongan-potongan mode file

Setiap file Unix memiliki serangkaian izin yang menentukan apakah Anda dapat membaca, menulis, atau menjalankan file. Menjalankan ls-l menampilkan izin. Berikut ini contoh tampilan seperti itu:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Saya melampirkan gambar potongan-potongan mode file:

masukkan deskripsi gambar di sini

Jenisnya bisa berbeda. Sebagai contoh:

  • d (direktori)
  • c (perangkat karakter)
  • l (symlink)
  • p (pipa bernama)
  • s (soket)
  • b (blokir perangkat)
  • D (pintu, tidak umum pada sistem Linux, tetapi telah porting)

Jika Anda ingin menetapkan beberapa izin untuk semua direktori Anda dapat menggunakan atribut R, misalnya:

chmod -R 777 /some/directory/

Untuk chmod 777 vs 0777

The chmodPerintah biasanya mengharapkan masukan untuk menjadi bilangan oktal, terkemuka nol mengacu pada nilai lengket / SGID / suid bit triplet. Namun dalam C, itu akan membuat perbedaan, karena 777akan diterjemahkan ke 01411(oktal), sehingga menetapkan bit sticky (lihat chmod(2)halaman manual), membaca izin untuk pemilik dan bit yang dapat dieksekusi untuk grup dan lainnya (yang merupakan kombinasi yang agak aneh) .

EDIT 1

Saya menemukan gambar lain tentang izin Linux dan saya akan melampirkan untuk memahami lebih mudah: Izin file UNIX

ValeriRangelov
sumber
5
Anda salah tentang 777 vs 0777. Keduanya oktal (desimal tidak masuk akal dalam kasus ini), tetapi dalam bentuk empat karakter, digit pertama menetapkan bit khusus (sticky & setuid).
orion
3
@orion Kadang-kadang itu benar, misalnya dalam kode C-like chmod(777)akan sama dengan menjalankan chmod 1411(yaitu chmodperintah dengan argumen 1411).
peterph
2
... yang dalam kasus syscall (atau pembungkusnya) dan biner dengan nama yang sama dapat sedikit membingungkan.
peterph
3
Python Guru Balap memecahkan masalah mundur ini dengan melarang semua "nomor" yang dimulai dengan 0, memaksa pengguna untuk menjadi eksplisit jika mereka ingin apa-apa selain desimal, misalnya hex: 0x1FF, biner: 0b111111111atau oktal: 0o777. PYTHON POWER
Nick T
Sumber gambar?
rugk
10

dberarti itu adalah direktori, jika Anda memiliki file itu -dan jika itu adalah tautan Anda akan menemukan l. Tidak dapat diatur / tidak disetel.

Jika Anda menggunakan 0777 sebagai izin, Anda memberikan kontrol penuh (baca + tulis + eksekusi) untuk setiap pengguna / grup sistem. Ini adalah cara malas untuk menyelesaikan masalah ketika Anda memiliki pengguna / grup yang tidak dapat mengakses direktori / file.

Misalnya, jika Anda mencantumkan konten direktori dan mendapatkan ini:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so adalah file yang dimiliki oleh root pengguna dan root grup. The pemilik telah membaca dan menulis akses, kelompok hanya akses baca dan setiap pengguna lain telah membaca akses. Ini dapat diterjemahkan sebagai 644.

Jika saya mengubahnya ke 777 akan terlihat seperti ini:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so

jcbermu
sumber
7

Setelah menjawab pertanyaan saya di sini dan melakukan penelitian tentang hasilnya saya menemukan sebuah artikel yang menjelaskan semuanya dengan sangat baik. Saya ingin membagikan beberapa bagian dari artikel ini di sini untuk referensi di masa mendatang.

Melihat izin

Agar dapat digunakan chmoduntuk mengubah izin file atau direktori, Anda harus terlebih dahulu tahu apa mode akses saat ini. Anda dapat melihat konten direktori di terminal dengan cdke direktori itu dan kemudian menggunakan:

$ ls -l

The -lswitch penting karena menggunakan lstanpa itu hanya akan menampilkan nama file atau folder dalam direktori.

Di bawah ini adalah contoh penggunaan ls -lpada direktori home saya:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Apa artinya kolom

Kolom pertama adalah jenis setiap file:

  • - menunjukkan file normal.
  • d menunjukkan direktori, yaitu folder yang berisi file atau folder lain.
  • p menunjukkan pipa bernama (alias FIFO).
  • l menunjukkan tautan simbolik.

Surat-surat setelah itu adalah izin, kolom pertama ini adalah yang paling menarik bagi kami. Yang kedua adalah berapa banyak tautan yang ada dalam suatu file, kita dapat mengabaikannya dengan aman. Kolom ketiga memiliki dua nilai / nama: Yang pertama (dalam contoh saya 'peter') adalah nama pengguna yang memiliki file. Nilai kedua ('pengguna' dalam contoh) adalah grup yang menjadi pemiliknya (Baca lebih lanjut tentang grup).

Kolom berikutnya adalah ukuran file atau direktori dalam byte dan informasi setelah itu adalah tanggal dan waktu file atau direktori terakhir dimodifikasi, dan tentu saja nama file atau direktori.

Apa yang dimaksud dengan izin

Tiga huruf pertama, setelah yang pertama -atau d, adalah izin yang dimiliki pemilik. Tiga huruf berikutnya adalah izin yang berlaku untuk grup. Tiga huruf terakhir adalah izin yang berlaku untuk semua orang.

Setiap set terdiri dari tiga huruf terdiri dari r wdan x. rselalu di posisi pertama, wselalu di posisi kedua, dan xselalu di posisi ketiga. radalah izin baca, wadalah izin tulis, dan xmerupakan izin eksekusi. Jika ada tanda hubung ( -) di tempat salah satu dari surat-surat ini itu berarti izin tidak diberikan, dan jika surat itu hadir maka itu diberikan.

Folder

Dalam kasus folder bit mode dapat diartikan sebagai berikut:

  • r (Baca) singkatan dari kemampuan untuk membaca daftar isi direktori yang diberikan,
  • w(write) adalah kemampuan untuk menulis daftar isi direktori yang diberikan (membuat file baru, folder; mengganti nama, menghapus file yang ada, folder) jika dan hanya jika bit eksekusi diatur. Kalau tidak, izin ini tidak ada artinya.
  • x (Eksekusi) singkatan dari kemampuan untuk memasuki direktori yang diberikan dengan perintah cd dan mengakses file, folder di direktori itu.

Mengubah izin menggunakan perintah chmod

chmodadalah perintah di Linux dan sistem operasi mirip Unix lainnya. Ini memungkinkan Anda untuk mengubah izin (atau mode akses) file atau direktori.

Anda dapat mengubah izin dengan dua cara berbeda: - Berbasis teks - Berbasis chmod nomorchmod

Metode teks

Untuk mengubah izin-atau mode akses file, kami menggunakan perintah chmod di terminal. Di bawah ini adalah struktur umum perintah:

chmod who=permissions filename

Di mana Siapa saja dari berbagai surat, dan masing-masing menandakan siapa Anda akan memberikan izin untuk. Mereka adalah sebagai berikut:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Hak akses yang sama seperti yang sudah dibahas ( r, w, dan x).

Perintah chmod memungkinkan kita menambah dan mengurangi izin dari set yang ada menggunakan + atau - alih-alih =. Hal ini berbeda dengan perintah di atas, yang pada dasarnya menulis ulang izin (yaitu untuk mengubah izin dari r--ke rw-, Anda masih perlu menyertakan rserta wsetelah =di chmodperintah. Jika Anda melewatkan keluar r, itu akan menghilangkan rizin sebagai mereka sedang ditulis ulang dengan tanda =. Menggunakan + dan - hindari ini dengan menambahkan atau menghapus set izin saat ini).

Metode angka

chmod juga dapat mengatur izin menggunakan angka.

Menggunakan angka adalah metode lain yang memungkinkan Anda untuk mengedit izin untuk ketiga pemilik, grup, dan lainnya secara bersamaan. Struktur dasar kode ini adalah ini:

chmod xxx file/directory

Di mana xxx adalah angka 3 digit di mana setiap digit dapat berupa apa saja dari 1 hingga 7. Digit pertama berlaku untuk izin untuk pemilik, digit kedua berlaku untuk izin untuk grup, dan digit ketiga berlaku untuk izin untuk semua lainnya.

Dalam notasi angka ini, nilai r, w, dan x memiliki nilai angka sendiri:

r=4
w=2
x=1

Untuk menghasilkan angka tiga digit, Anda perlu mempertimbangkan izin apa yang Anda inginkan untuk dimiliki oleh pemilik, grup, dan pengguna, lalu total nilainya. Sebagai contoh, katakanlah saya ingin memberikan izin kepada pemilik direktori baca-tulis dan eksekusi, dan saya ingin mengelompokkan dan semua orang untuk baru saja membaca dan mengeksekusi izin. Saya akan datang dengan nilai numerik seperti:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Ini sama dengan menggunakan yang berikut ini:

chmod u=rwx filename
chmod go=rx filename

Sebagian besar folder / direktori diatur ke 755 untuk memungkinkan membaca dan menulis dan mengeksekusi kepada pemilik, tetapi menolak menulis kepada semua orang, dan file biasanya 644 untuk memungkinkan membaca dan menulis untuk pemilik tetapi hanya membaca untuk semua orang, merujuk ke yang terakhir perhatikan kurangnya izin x dengan file yang tidak dapat dieksekusi - ini adalah kesepakatan yang sama di sini.

Peter
sumber
Hanya menyalin teks dari artikel lain - setidaknya - kasar. Mungkin juga pelanggaran hak cipta. Jika tidak hanya disalin atau Anda benar-benar menggunakan bagian-bagian kecil (ramah hak cipta berkat penggunaan yang adil) maka harap setidaknya tambahkan tautan ke artikel yang Anda rujuk / kutip.
rugk
0

Untuk pertanyaan d

Ini memberitahu Anda jenis file Unix. Secara default Unix hanya memiliki 3 jenis file. Mereka:

  • - - File biasa
  • d - File direktori
  • File khusus (dengan 5 sub-jenis):
    • b - Blokir file
    • c - File perangkat karakter
    • p - File pipa Bernama atau hanya file pipa
    • l - File tautan simbolik
    • s - File soket

Baca lebih lanjut di sini: Jenis file di Linux / Unix dijelaskan secara rinci

0777 vs. 777

Sticky bit ditentukan atau tidak. Ketika bit sticky direktori diatur, sistem file memperlakukan file dalam direktori tersebut dengan cara khusus sehingga hanya pemilik file, pemilik direktori, atau pengguna root yang dapat mengganti nama atau menghapus file. Tanpa bit sticky yang ditetapkan, setiap pengguna dengan menulis dan mengeksekusi izin untuk direktori dapat mengubah nama atau menghapus file yang terkandung, terlepas dari pemilik file.

0777 menetapkan izin file 777, dan bit lengket ke 0 - tidak ada mode khusus.

777 sedang mengatur 777 izin file, tanpa mengubah bit sticky.

Baca lebih lanjut: bit lengket dan chmod

csny
sumber
2
Lebih baik: tetapi masih belum memberikan jawaban yang belum dicakup jawaban lain ...
jasonwryan
1
(1) Ada tiga jenis file dasar: file biasa, direktori, dan yang lainnya. Apa? Di mana Anda mendapatkan ini? Dalam skema yang hebat, file dan direktori biasa sangat mirip. Pipa yang dinamai dan tautan simbolis lebih seperti file biasa dan direktori daripada seperti file perangkat atau soket. (2) Anda pikir chmod 777tidak menghapus bit setuid, setgid dan sticky? Cobalah.
G-Man
Unix memiliki 7 jenis file, bukan 3.
wjandrea