SSD Nodes Learn 🎉 VPS dari $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Maksud drwxr-xr-x dalam Linux dan Kebenaran Fail

Ketahui cara membaca kod drwxr-xr-x dan hubungannya dengan nilai oktal 755. Fahami mengapa bit x pada direktori penting dan elakkan penggunaan chmod 777 yang tidak selamat.

Apakah maksud drwxr-xr-x

drwxr-xr-x menerangkan direktori yang boleh diubah oleh pemiliknya, dan setiap pengguna lain boleh membaca serta melaluinya tanpa mengubah apa-apa. Dalam format oktal, mod ini ialah 755. Linux mencetak sepuluh aksara ini pada permulaan setiap baris output ls -l, dan ia sentiasa membawa maksud yang sama dalam urutan yang sama, jadi mempelajari satu rentetan membolehkan anda memahami kesemuanya.

Satu peraturan perlu didahulukan daripada yang lain, kerana ia menentukan sama ada ujian anda sendiri memberikan hasil yang tepat. Pengguna root mengabaikan bit kebenaran. Kernel memberikan keupayaan CAP_DAC_OVERRIDE (tindakan mengatasi kawalan akses budi bicara) kepada root, jadi root boleh membuka fail walaupun mod fail tersebut melarangnya. Setiap contoh pada halaman ini berjaya bagi root, tidak kira apa pun bit yang ditetapkan. Log masuk sebagai pengguna biasa apabila anda ingin melihat peraturan tersebut beroperasi.

Sepuluh aksara, satu demi satu

Cipta direktori dan fail untuk diperiksa. Tiada apa-apa di sini yang menyentuh mana-mana bahagian di luar direktori baharu tersebut.

mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txt

Dengan umask lalai biasa 022, dua baris direktori bermula dengan drwxr-xr-x dan baris fail bermula dengan -rw-r--r--.

Aksara 1 ialah jenis fail, bukan keizinan. d ialah direktori. - ialah fail biasa. l ialah pautan simbolik. c dan b ialah nod peranti aksara dan blok. s ialah soket, dan p ialah paip bernama. Ia berada di luar nilai oktal, itulah sebabnya drwxr-xr-x menjadi 755 dan bukannya sesuatu yang bermula dengan d.

Sembilan aksara selepasnya ialah tiga kumpulan yang terdiri daripada tiga aksara, dan susunannya tidak pernah berubah.

  • Aksara 2 hingga 4 ialah triad pemilik, bit yang terpakai kepada pengguna yang memiliki fail tersebut.
  • Aksara 5 hingga 7 ialah triad kumpulan, bit yang terpakai kepada kumpulan fail tersebut.
  • Aksara 8 hingga 10 ialah triad lain-lain, bit yang terpakai kepada orang lain.

Di dalam triad, slot sentiasa r, kemudian w, kemudian x, dan tanda sengkang bermakna bit tersebut dimatikan. Huruf tidak pernah beralih kedudukan. r-x ialah baca tanpa tulis. -w- ialah tulis tanpa baca, yang sah tetapi jarang berlaku.

Jadi drwxr-xr-x dipecahkan seperti ini: d untuk direktori, kemudian rwx untuk pemilik, kemudian r-x untuk kumpulan, kemudian r-x untuk lain-lain.

Sesetengah sistem mencetak aksara kesebelas. Titik di hujung, drwxr-xr-x., bermakna fail tersebut membawa konteks SELinux (security enhanced Linux), yang dicetak secara lalai oleh pengedaran SELinux seperti Fedora dan Rocky. Tanda tambah di hujung, drwxr-xr-x+, bermakna fail tersebut membawa POSIX ACL (senarai kawalan akses), satu set peraturan tambahan selain daripada sembilan bit ini. Baca peraturan tambahan tersebut dengan getfacl <path>.

r, w dan x mempunyai fungsi berbeza pada direktori

Ini adalah peraturan pertama yang sering disalah faham oleh pemula. Huruf-huruf tersebut adalah sama bagi fail dan direktori. Namun, kuasa yang diberikan adalah berbeza.

  • r pada fail membolehkan kandungan dibaca. r pada direktori membolehkan nama-nama di dalamnya disenaraikan, iaitu keperluan asas bagi ls.
  • w pada fail membolehkan kandungan diubah. w pada direktori membolehkan entri ditambah dan dibuang. Memadam fail adalah satu perubahan kepada direktori, jadi kebenaran tulis pada direktori adalah penentunya, manakala mod fail itu sendiri tidak memberi kesan.
  • x pada fail membolehkan ia dijalankan sebagai program. x pada direktori membolehkan ia dilalui (traverse), bermakna kernel boleh menyelesaikan satu nama di dalamnya semasa carian laluan.

Melalui (traverse) adalah bahagian yang sering mengejutkan pengguna. x pada direktori tidak melaksanakan apa-apa. Membuka /srv/site/index.html memerlukan x pada /, kemudian x pada /srv, kemudian x pada /srv/site, dan akhirnya r pada fail tersebut. Jika satu direktori dalam rantaian itu tidak mempunyai x untuk anda, carian akan terhenti di situ, dan pemanggil akan diberitahu Permission denied untuk keseluruhan laluan walaupun fail di hujungnya boleh dibaca oleh semua orang. namei -l /srv/site/index.html mencetak setiap langkah rantaian tersebut berserta mod dan pemiliknya, supaya anda boleh melihat pautan mana yang menyebabkannya terhenti.

Direktori dengan r tetapi tanpa x adalah keadaan separuh yang pelik dan perlu dikenali. Pengguna biasa boleh menyenaraikan nama-nama fail kerana penyenaraian adalah apa yang diberikan oleh r, tetapi tidak boleh melakukan stat pada mana-mana entri. Oleh itu, ls -l akan mengisi lajur saiz dan mod dengan tanda soal serta mencetak ls: cannot access ...: Permission denied untuk setiap satu.

Setiap triad ialah nombor tiga bit. r ialah 4, w ialah 2, x ialah 1. Tambahkan bit yang aktif.

  • rwx ialah 4 + 2 + 1 = 7
  • rw- ialah 4 + 2 = 6
  • r-x ialah 4 + 1 = 5
  • r-- ialah 4
  • --- ialah 0

Oleh itu, drwxr-xr-x ialah 7 untuk pemilik, 5 untuk kumpulan dan 5 untuk orang lain: 755. -rw-r--r-- ialah 6, 4, 4: 644. drwxrwxr-x ialah 7, 7, 5: 775, iaitu 755 dengan kebenaran menulis ditambah untuk kumpulan. Anda tidak perlu mengira aksara secara manual kerana stat memaparkan kedua-dua bentuk serentak.

stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt

%A ialah bentuk huruf, %a ialah bentuk oktal, manakala %U dan %G menamakan pengguna pemilik dan kumpulan pemilik.

Rentetan kebenaran yang sering dicari

Ini adalah mod yang anda akan temui pada pelayan sebenar, berserta nilai oktal dan kegunaan setiap satunya.

  • -rw-r--r-- ialah 644. Fail biasa yang hanya dibaca oleh servis, seperti fail konfigurasi atau halaman HTML.
  • -rw------- ialah 600. Rahsia: kunci peribadi SSH, atau fail .env sesuatu aplikasi.
  • -rw-rw-r-- ialah 664. Fail dalam direktori yang dikongsi oleh kumpulan, di mana rakan sepasukan perlu mempunyai kebenaran menulis.
  • -rwxr-xr-x ialah 755. Skrip dan binari, seperti /usr/local/bin/backup.sh dan kebanyakan kandungan /usr/bin.
  • -rwx------ ialah 700. Skrip peribadi yang hanya boleh dijalankan oleh pemiliknya.
  • drwxr-xr-x ialah 755. Hampir setiap direktori sistem, dan punca dokumen (document root) laman web.
  • drwx------ ialah 700. ~/.ssh, dan direktori rumah pada mesin yang dikawal ketat.
  • drwxrwxr-x ialah 775. Direktori yang boleh ditulis oleh kumpulan pemilik.
  • drwxrwsr-x ialah 2775. Sama seperti di atas, ditambah dengan bit setgid, supaya fail baharu di dalamnya mewarisi kumpulan direktori tersebut.
  • drwxrwxrwt ialah 1777. /tmp. t di hujung ialah sticky bit, supaya pengguna hanya boleh memadam fail milik mereka sendiri.
  • -rwsr-xr-x ialah 4755. Binari setuid yang berjalan sebagai pemiliknya, seperti /usr/bin/passwd dan /usr/bin/sudo.
  • -rw-rw-rw- ialah 666, dan drwxrwxrwx ialah 777. Boleh ditulis oleh sesiapa sahaja (world writable), yang pada pelayan hampir selalu merupakan satu kesilapan.
  • lrwxrwxrwx ialah apa yang ditunjukkan oleh setiap pautan simbolik (symbolic link). Linux mengabaikan bit mod pada pautan dan sebaliknya memeriksa sasaran, jadi rentetan ini tidak membawa sebarang makna.

Triad mana yang terpakai untuk anda

Ini adalah peraturan kedua yang sering disalah faham oleh pemula. Kernel memilih tepat satu triad dan berhenti di situ.

Jika ID pengguna anda sepadan dengan pemilik fail, anda mendapat triad pemilik, manakala bit kumpulan dan lain-lain tidak akan dirujuk langsung. Jika tidak, sekiranya kumpulan fail tersebut adalah salah satu daripada kumpulan anda, anda mendapat triad kumpulan. Jika tidak, anda mendapat triad lain-lain.

Dua perkara terhasil daripada ini. Triad pemilik terpakai walaupun ia adalah yang paling ketat. Fail dengan mod 0466, yang dipaparkan sebagai -r--rw-rw-, memberikan pemiliknya akses baca sahaja sementara orang lain boleh menulis, kerana semakan pemilik dipadankan terlebih dahulu dan tiada apa-apa selepas itu dibaca. Ini adalah sah, dan ia mengelirukan semua orang pada kali pertama mereka menemuinya.

Triad kumpulan kemudiannya dipilih berdasarkan kumpulan fail tersebut, bukan berdasarkan senarai kumpulan yang anda sertai. ls -l mencetak dua nama pada setiap baris: pemilik, kemudian kumpulan. Hanya kumpulan kedua itu yang mempunyai kuasa ke atas fail tersebut. Menjadi ahli kepada dua puluh kumpulan hanya membantu apabila fail tersebut membawa salah satu daripadanya.

id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txt

id mencetak pengguna anda dan setiap kumpulan yang anda sertai. stat mencetak pemilik dan kumpulan fail tersebut. Bandingkan kedua-duanya dan anda akan tahu triad mana yang akan digunakan oleh kernel untuk anda.

Inilah sebabnya direktori kongsi biasanya diberikan kumpulan dan bit setgid. sudo chmod 2775 /srv/shared dipaparkan sebagai drwxrwsr-x, dan fail yang dicipta di dalamnya kemudian mewarisi kumpulan direktori tersebut dan bukannya kumpulan peribadi pencipta, supaya orang seterusnya masih boleh menulis fail tersebut. Memberikan setiap servis akaunnya sendiri adalah separuh lagi daripada cerita ini, dan ia dibincangkan dalam satu pengguna Linux bagi setiap servis pada VPS.

umask menentukan mod bagi setiap fail baharu

Fail baharu tidak mengambil modnya daripada anda. Ia mengambilnya daripada program yang menciptanya, ditolak dengan bit yang dibersihkan oleh umask anda. umask ialah topeng bit untuk disingkirkan, jadi umask yang lebih besar menghasilkan fail yang lebih peribadi.

Kebanyakan pengedaran (distribution) menggunakan 022. Program yang mencipta fail biasa meminta 0666. Program yang mencipta direktori meminta 0777. umask membersihkan 022 daripada kedua-dua permintaan tersebut, jadi anda mendapat 644 pada fail dan 755 pada direktori. Itulah pasangan tepat yang anda lihat di seluruh VPS yang baharu.

umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdir

umask -S mencetak nilai yang sama sebagai huruf, yang lebih mudah dibaca berbanding 0022. Tetapkan umask 027 dalam ~/.profile untuk tetapan lalai yang lebih ketat: 640 pada fail dan 750 pada direktori, supaya kumpulan anda boleh membaca kerja anda dan orang lain tidak boleh.

Dua had adalah penting. umask hanya boleh membersihkan bit, tidak boleh menambahnya, itulah sebabnya fail yang baru dicipta tidak akan boleh dilaksanakan (executable) walau apa pun yang anda tetapkan. Dan servis systemd tidak pernah membaca profil shell anda, jadi tetapkan nilai tersebut dalam fail unit sebaliknya.

[Service]
UMask=0027

Mengapa fail web ditetapkan kepada 644 dan direktori web kepada 755

Pelayan web berjalan di bawah akaunnya sendiri, www-data pada Debian dan Ubuntu, nginx pada Rocky dan Alma. Proses tersebut memerlukan kebenaran baca pada fail yang dihidangkan dan kebenaran traverse pada direktori di atasnya. Ia tidak mempunyai sebab untuk menulis pada fail tersebut, dan tapak statik tidak seharusnya membenarkannya.

644 pada fail memberikan kebenaran tulis kepada pemilik dan baca kepada semua orang, supaya pengguna deploy boleh menerbitkan kandungan dan pengguna web boleh menghidangkannya. 755 pada direktori memberikan kebenaran tulis kepada pemilik dan traverse kepada semua orang, supaya pengguna web boleh melayari laluan tersebut tanpa keupayaan untuk menambah atau memadam apa-apa. Pepijat dalam aplikasi tidak akan dapat menulis semula halaman yang sedang dihidangkan.

Peraturan traverse sangat penting di sini. Jika tapak tersebut berada dalam /home/deploy/site dan /home/deploy ditetapkan kepada 750, pengguna web tidak boleh memasuki direktori home tersebut sama sekali, dan permintaan akan berakhir sebagai HTTP 403 dengan baris seperti ini dalam /var/log/nginx/error.log:

open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5

13 itu ialah EACCES, iaitu penolakan kebenaran oleh kernel. Tiada masalah dengan rangkaian: port sedang mendengar dan permintaan telah sampai, itulah yang menjadikannya mengelirukan semasa anda masih mempelajari bagaimana port mendengar berfungsi pada Linux. Jalankan namei -l /home/deploy/site/index.html dan baca rantaian tersebut untuk mencari direktori pertama tanpa x untuk other.

Direktori yang ditulis oleh aplikasi, seperti laluan muat naik, adalah pengecualian. Berikan kebenaran itu melalui pemilikan dan bukannya dengan mod yang lebih luas: sudo chown -R www-data:www-data /srv/site/uploads dan kekalkan mod pada 755. Kekalkan akses tulis hanya pada direktori yang memerlukannya.

chmod, tanpa meratakan keseluruhan pepohon

chmod menerima kedua-dua bentuk. Oktal menetapkan kesemua sembilan bit serentak: chmod 644 notes.txt. Simbolik hanya mengubah apa yang anda namakan dan membiarkan yang lain tidak berubah: chmod u+x deploy.sh menambah keizinan laksana (execute) untuk pemilik, dan chmod go-w notes.txt membuang keizinan tulis (write) daripada kumpulan dan lain-lain.

Rekursi adalah punca pepohon fail rosak. chmod -R 755 . menandakan setiap imej dan setiap fail konfigurasi sebagai boleh laksana, kerana chmod tidak dapat membezakan skrip daripada fail JPEG. Gunakan X huruf besar sebaliknya.

chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txt

X huruf besar menggunakan keizinan laksana pada direktori, dan pada fail yang sudah mempunyai bit laksana di mana-mana. Direktori akan menjadi 755, fail biasa akan menjadi 644, dan skrip yang sudah boleh laksana akan kekal sedemikian. Apabila satu fail sudah mempunyai mod yang anda percayai, chmod --reference=good.sh other.sh menyalinnya ke fail lain.

Mesej yang anda lihat apabila bit tidak betul

bash: ./deploy.sh: Permission denied bermaksud skrip tersebut tidak mempunyai bit x dalam triad yang terpakai kepada anda, atau direktori pada laluannya tidak mempunyai x. chmod u+x deploy.sh membetulkan kes pertama.

bash: ./deploy.sh: cannot execute: required file not found ialah ralat berbeza dengan nama yang mengelirukan. Bit x adalah betul, dan penterjemah yang dinamakan pada baris pertama tiada. Punca biasa ialah format penamat baris Windows, jadi kernel mencari penterjemah bernama /bin/bash\r. Baiki ia dengan sed -i 's/\r$//' deploy.sh.

Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. datang daripada klien SSH, yang enggan menggunakan kunci peribadi yang boleh dibaca oleh akaun lain. Kunci tersebut memerlukan 600 dan ~/.ssh memerlukan 700. Pengendalian kunci secara penuh ada dalam mengurus kunci SSH dan kebenaran failnya.

Authentication refused: bad ownership or modes for directory /home/deploy/.ssh muncul dalam jurnal pelayan apabila direktori rumah atau .ssh miliknya boleh ditulis oleh kumpulan. Tetapan StrictModes sshd menolak kunci tersebut, dan daripada sisi klien ia kelihatan seperti gesaan kata laluan yang tidak dijangka tanpa penjelasan.

sudo: /etc/sudoers is world writable, diikuti oleh sudo: no valid sudoers sources found, quitting, bermaksud sudo menyemak mod konfigurasinya sendiri dan enggan berjalan. Fail tersebut mestilah 0440. Ini adalah kesan klasik daripada chmod rekursif yang meluas, dan ia boleh muncul bersama mesej sshd di atas, yang menjadikan konsol pembekal sebagai satu-satunya cara untuk masuk semula.

Mengapa 777 bukan penyelesaian

777 memberikan akses tulis kepada setiap akaun pada mesin tersebut, dan kepada setiap proses yang berjalan di bawah mana-mana akaun tersebut. Pelayan menjalankan servis di bawah pengguna masing-masing, jadi "semua orang" merangkumi skop yang jauh lebih luas pada VPS berbanding komputer riba. Servis yang terjejas boleh menulis di mana-mana sahaja yang dibenarkan oleh 777.

Di bawah root web, kerosakannya adalah secara langsung. Direktori yang boleh ditulis oleh semua orang (world writable) dan turut dihidangkan oleh pelayan bermakna kelemahan muat naik fail menjadi cara untuk meletakkan skrip dan kemudian memintanya semula.

777 hampir selalu menjadi jawapan yang salah bagi soalan pemilikan. Simptomnya ialah "aplikasi tidak boleh menulis ke direktori ini". Puncanya ialah direktori tersebut dimiliki oleh pengguna yang salah. sudo chown -R appuser:appuser /srv/app/storage dengan mod 755 menyelesaikan masalah ini dan menghalang akaun lain daripada mengaksesnya. Mencipta akaun-akaun tersebut sebelum apa-apa diatur cara adalah sebahagian daripada sepuluh minit pertama pada VPS baharu.

Akses tulis untuk semua (world write) adalah sah di satu tempat yang biasa, /tmp, dan ia dieja sebagai drwxrwxrwt. t di hujungnya ialah sticky bit: direktori tersebut boleh ditulis oleh semua, namun pengguna hanya boleh memadam fail yang mereka miliki sendiri. Tanpa bit tersebut, mana-mana akaun boleh memadam fail sementara milik akaun lain.

Baca mod sebelum anda menukarnya

Perintah-perintah ini hanya membaca status, jadi ia selamat untuk dijalankan di mana-mana sahaja.

id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002

find <path> -perm -0002 menyenaraikan segala-galanya di bawah laluan yang mempunyai bit tulis dunia (world write bit) ditetapkan, yang merupakan cara terpantas untuk mengaudit pelayan selepas seseorang melakukan pembaikan dengan chmod 777.

Untuk bertanya sama ada akaun servis tertentu boleh memasuki direktori, buat pertanyaan sebagai akaun tersebut. sudo -u www-data test -x /srv/site && echo yes || echo no akan mencetak yes apabila pengguna tersebut mempunyai kebenaran melintas (traverse) pada direktori itu, dan no apabila ia tidak mempunyainya. Bertanya sebagai root tidak membuktikan apa-apa, kerana root melangkau semakan tersebut dan jawapannya sentiasa yes.

FAQ

Apakah maksud drwxr-xr-x dalam Linux?

Ia adalah direktori, ditunjukkan oleh d di hadapan, dengan mod 755. Triad pemilik ialah rwx, jadi pemilik mempunyai semua kebenaran ke atasnya. Triad kumpulan ialah r-x dan triad lain ialah r-x, jadi semua orang lain boleh menyenaraikan nama di dalamnya dan melintasi direktori tersebut, manakala tiada sesiapa selain pemilik boleh menambah atau memadam apa-apa. Sahkan mana-mana laluan dengan stat -c '%A %a %U %G %n' <path>, yang mencetak bentuk huruf dan bentuk oktal bersebelahan.

Mengapa fail web 644 dan direktori web 755?

Pelayan web berjalan di bawah akaun yang berbeza, www-data pada Ubuntu. Ia memerlukan kebenaran baca pada fail yang dihidangkan dan kebenaran melintasi pada setiap direktori di atasnya, dan ia tidak mempunyai sebab untuk menulis pada kedua-duanya. 644 memberikan pemilik kebenaran menulis dan orang lain kebenaran membaca. 755 memberikan pemilik kebenaran menulis dan orang lain kebenaran melintasi. Direktori yang aplikasi benar-benar perlu tulis ke dalamnya harus diserahkan dengan chown kepada pengguna aplikasi tersebut, bukannya dengan meluaskan mod untuk semua orang.

Adakah bit x bermaksud saya boleh melaksanakan (execute) direktori?

Tidak. Pada direktori, x bermaksud melintasi, iaitu hak untuk menyelesaikan satu nama di dalamnya semasa kernel menelusuri laluan. cd memerlukannya, begitu juga setiap pembukaan fail di bawahnya. Setiap direktori sepanjang laluan memerlukan x, jadi fail dengan mod 644 masih tidak boleh dicapai apabila direktori di atasnya kekurangan x untuk anda. namei -l /path/to/file mencetak mod setiap direktori dalam rantaian, yang menunjukkan di mana carian terhenti.

Adakah chmod 777 pernah menjadi penyelesaian yang betul?

Hampir tidak pernah pada pelayan. Ia memberikan kebenaran menulis kepada setiap akaun pada mesin tersebut, termasuk akaun yang menjalankan servis, jadi satu servis yang terjejas boleh menulis semula fail tersebut. Apabila aplikasi tidak boleh menulis pada direktori, masalah sebenar biasanya ialah pemilikan: sudo chown -R appuser:appuser /srv/app/storage dengan mod 755 memberikan aplikasi apa yang diperlukan dan mengecualikan orang lain. Pengecualian yang biasa ialah /tmp pada 1777, dan itu hanya berfungsi kerana bit melekit (sticky bit) menghalang pengguna memadam fail pengguna lain.

Mengapa ls mencetak titik atau tanda tambah selepas kebenaran?

Aksara kesebelas itu menerangkan peraturan di luar sembilan bit kebenaran. Titik, seperti dalam drwxr-xr-x., bermaksud konteks keselamatan SELinux dilampirkan, yang merupakan perkara biasa pada Fedora dan Rocky. Tanda tambah, seperti dalam drwxr-xr-x+, bermaksud POSIX ACL (senarai kawalan akses) ditetapkan, jadi sesetengah pengguna atau kumpulan memegang hak yang tidak ditunjukkan oleh tiga triad tersebut. Jalankan getfacl <path> untuk menyenaraikan entri tambahan tersebut.

#permissions#ls#chmod#linux-basics#octal