Setiap berkas yang tersimpan di server Linux membawa satu catatan yang jarang diperhatikan sampai ia menimbulkan masalah, yaitu nama pemiliknya. Catatan itu melekat pada berkasnya, bukan pada isinya, dan berubah mengikuti siapa yang membuatnya. Berkas yang Anda unggah lewat FTP tercatat atas nama akun FTP. Berkas yang Anda buat memakai sudo tercatat atas nama root.

Selisih kecil itu baru terasa ketika ada proses lain yang membutuhkan berkas tersebut. Saat web server hendak menulis ke berkas yang bukan miliknya, yang muncul di layar bukan halaman yang berhasil diperbaiki melainkan pesan gagal. Chown adalah perintah yang membetulkan catatan pemilik tersebut.

Chown Adalah Perintah untuk Mengubah Pemilik Berkas

Chown adalah perintah di Linux dan sistem Unix lainnya yang berfungsi mengubah pemilik (owner) dan grup sebuah berkas atau direktori. Namanya merupakan singkatan dari change owner, dan di dokumentasi berbahasa Inggris ia biasa disebut chown command. Perintah ini tersedia di hampir semua sistem operasi turunan Unix, mulai dari Ubuntu, Debian, dan CentOS, sampai macOS dan BSD.

Yang perlu diperhatikan sejak awal, chown tidak mengatur boleh atau tidaknya seseorang membaca sebuah berkas. Ia hanya mencatat siapa yang memiliki berkas tersebut. Dua urusan itu memang bersebelahan, tetapi dikerjakan oleh dua perintah berbeda. Tertukarnya keduanya adalah sumber kebingungan yang paling sering kami temui pada pengguna server pemula.

Pasangan pemilik dan grup tidak disimpan di dalam isi berkas, melainkan di inode — struktur data kecil yang memuat metadata setiap berkas. Sistem operasi menyimpannya sebagai dua angka, yaitu UID (User ID) dan GID (Group ID). Nama seperti www-data atau andi yang Anda lihat di layar sebenarnya hasil penerjemahan angka tersebut lewat berkas /etc/passwd dan /etc/group.

Melihat Siapa Pemilik Berkas lewat ls -l

Sebelum mengubah kepemilikan, Anda perlu tahu kondisi sekarang. Perintah ls -l menampilkannya di kolom ketiga dan keempat:

Bash
ls -l /var/www/html

Keluarannya kira-kira seperti ini:

TEXT
-rw-r--r-- 1 www-data www-data 1284 Aug 18 09:14 index.php
drwxr-xr-x 2 root     root     4096 Aug 18 09:12 assets

Kolom ketiga adalah pemiliknya dan kolom keempat adalah grupnya. Pada contoh di atas, index.php dimiliki pengguna www-data dan grup www-data, sementara direktori assets masih dimiliki root. Kolom pertama yang berisi sepuluh karakter -rw-r--r-- adalah urusan izin akses, dan itu wilayah perintah lain yang kita bahas sebentar lagi.

Dari kolom ls -l, chown hanya mengubah kolom ketiga (pemilik) dan keempat (grup); kolom pertama milik chmod.Dari kolom ls -l, chown hanya mengubah kolom ketiga (pemilik) dan keempat (grup); kolom pertama milik chmod.

Bila Anda ingin melihat angka aslinya, tambahkan opsi -n:

Bash
ls -n /var/www/html
TEXT
-rw-r--r-- 1 33 33 1284 Aug 18 09:14 index.php
drwxr-xr-x 2  0  0 4096 Aug 18 09:12 assets

Nama www-data ternyata angka 33, dan root ternyata angka 0. Kedua angka itu bukan angka acak, dan artinya akan kita bahas pada bagian tersendiri.

Lima Bentuk Penulisan Perintah chown

Manual GNU Coreutils mendefinisikan lima bentuk penulisan target chown, dan kelimanya ditulis tanpa spasi di antara komponennya. Sintaks umumnya adalah chown [opsi] [pemilik][:[grup]] berkas.

BentukYang berubahContoh
pemilikPemilik sajachown andi data.txt
pemilik:grupPemilik dan grupchown andi:dev data.txt
pemilik:Pemilik, plus grup login-nyachown andi: data.txt
:grupGrup sajachown :dev data.txt
:Tidak adachown : data.txt

Bentuk ketiga adalah yang paling sering terlewat. Menulis titik dua tanpa nama grup di belakangnya memerintahkan chown mengambil grup login pemilik baru secara otomatis. Anda karena itu tidak perlu mengetik nama grupnya dua kali.

Satu perintah juga boleh menyebut beberapa berkas dan direktori sekaligus. Tulis namanya berurutan setelah pemilik barunya:

Bash
sudo chown andi:dev laporan.txt data.csv arsip/

Anda mungkin pernah melihat penulisan memakai titik, misalnya chown www-data.www-data berkas. Bentuk itu warisan skrip lama. GNU chown masih menerimanya selama tidak menimbulkan ambiguitas, tetapi mengeluarkan peringatan chown: warning: '.' should be ':'. Manualnya menyatakan dukungan tersebut bisa dihapus pada versi mendatang.

Di macOS, penulisan yang sama langsung ditolak dengan illegal user name. Biasakan memakai titik dua.

Kenapa chown Hampir Selalu Meminta sudo

Menjalankan chown tanpa sudo sering berakhir dengan penolakan, dan alasannya bukan sekadar kebiasaan administrator yang berhati-hati. Menurut manual chown(2), hanya proses berhak istimewa — di Linux, proses dengan kapabilitas CAP_CHOWN — yang boleh mengubah pemilik sebuah berkas. Aturan itu berlaku bahkan untuk pemilik berkas itu sendiri.

Kami menguji langsung aturan tersebut pada sebuah berkas yang benar-benar kami miliki:

Bash
chown root a.txt
TEXT
chown: a.txt: Operation not permitted

Anda pemilik berkasnya, tetapi Anda tetap tidak boleh menyerahkannya kepada orang lain. Pembatasan ini disengaja. Tanpanya, seorang pengguna dapat membuat berkas berbahaya lalu mengatasnamakannya pada akun lain. Ia juga dapat melimpahkan berkas raksasa miliknya ke akun orang lain untuk menghindari batas kuota disk.

Ada satu pengecualian yang berguna. Mengubah grup sebuah berkas milik Anda ke grup yang Anda ikuti umumnya masih diizinkan tanpa sudo, meski manual GNU mencatat perilaku ini bergantung pada sistemnya. Jadi perintah berikut sering berhasil dijalankan pengguna biasa:

Bash
chown :dev laporan.txt

Konsekuensi praktisnya, chown menuntut akses root. Di hosting bersama akses itu tidak tersedia, sehingga perbaikan kepemilikan harus diminta ke penyedia layanan. Pekerjaan yang menuntut penataan kepemilikan secara rutin karena itu lebih cocok dijalankan di VPS Indonesia dengan akses root penuh, dan dijangkau lewat SSH.

Mengubah Pemilik Folder dan Seluruh Isinya dengan chown -R

Menjalankan chown pada sebuah direktori hanya mengubah direktori itu sendiri, bukan isinya. Untuk menelusuri seluruh isinya sampai ke lapisan terdalam, tambahkan opsi -R atau --recursive. Opsi ini bekerja secara recursive, yaitu menelusuri isi sebuah direktori beserta seluruh sub-direktori di dalamnya:

Bash
sudo chown -R www-data:www-data /var/www/html

Sekilas perintah ini terlihat sederhana, tetapi ada tiga hal yang membuatnya tidak selalu berjalan seperti dugaan.

Tanda bintang melewatkan berkas tersembunyi. Pola chown -R www-data:www-data /var/www/html/* terlihat wajar, tetapi tanda bintang di ujungnya justru mempersempit jangkauannya. Tanda itu diproses oleh shell, bukan oleh chown. Secara bawaan, shell tidak mencocokkan berkas yang namanya diawali titik, yaitu berkas tersembunyi (hidden files) seperti .htaccess dan .env. Pada pengujian kami dengan sebuah direktori berisi biasa.txt, sub/, .env, dan .htaccess, ekspresi * hanya menghasilkan dua entri pertama. Berkas .env dan .htaccess terlewat begitu saja tanpa pesan apa pun. Tulis nama direktorinya saja tanpa bintang, dan -R akan menyapu semuanya termasuk berkas tersembunyi.

chown -R dengan pola bintang hanya menyapu biasa.txt dan sub/; tanpa bintang, .env dan .htaccess ikut berubah.chown -R dengan pola bintang hanya menyapu biasa.txt dan sub/; tanpa bintang, .env dan .htaccess ikut berubah.

Symbolic link diperlakukan berbeda. Saat tidak bekerja rekursif, chown secara bawaan mengubah berkas yang ditunjuk oleh sebuah symbolic link (symlink), bukan link-nya. Bila yang ingin Anda ubah adalah link itu sendiri, pakai opsi -h atau --no-dereference. Untuk penelusuran rekursif yang aman, gabungkan keduanya seperti pada contoh resmi manual GNU:

Bash
sudo chown -hR andi /home/andi

Mengubah hanya milik pemilik lama. Opsi --from= mengubah kepemilikan sebuah berkas hanya bila pemilik lamanya cocok dengan yang Anda sebutkan. Opsi ini berguna saat memindahkan berkas milik satu akun ke akun lain di direktori yang isinya bercampur:

Bash
sudo chown -hR --from=andi budi /home/proyek

Manual GNU menyarankan --from= sebagai pengganti pola find ... | xargs chown, karena jeda antara saat find memeriksa pemilik berkas dan saat chown benar-benar berjalan bisa dimanfaatkan pihak lain.

Angka di chown Adalah UID, Bukan Kode Izin 777

Ada satu perintah yang sering diketik dan tidak pernah menghasilkan apa yang diharapkan, yaitu chown 777 berkas. Angka bergaya 777, 755, atau 644 adalah kode mode milik perintah chmod, dan chown tidak mengenal kode mode sama sekali. Menuliskan chown 777 berkas hanya membuat chown mencari pengguna ber-UID 777, yang pada sistem normal tidak ada.

Karena itu pula tidak ada kalkulator maupun generator chown. Alat semacam itu memang tersedia untuk chmod, yang angkanya memang dihitung dari tiga huruf izin. Chown tidak menghitung apa pun: ia hanya menerima nama akun atau nomor ID yang sudah terdaftar di sistem.

Namun bukan berarti chown menolak semua angka. Chown justru menerima angka, hanya saja maknanya berbeda: angka pada chown adalah UID dan GID. Perintah berikut sah dan sering dipakai:

Bash
sudo chown 1000:1000 /data/proyek

Angka-angka yang sering Anda temui bukan pilihan acak, melainkan nomor yang dialokasikan distribusi Linux. Debian Policy membagi rentangnya menjadi beberapa kelas. UID 0 sampai 99 dialokasikan secara global dan sama di setiap sistem Debian. UID 100 sampai 999 disediakan untuk akun sistem, sementara UID 1000 ke atas untuk akun pengguna biasa.

chown 777 ditolak karena tidak ada pengguna ber-UID 777, sedangkan chown 1000:1000 diterima sebagai UID dan GID.chown 777 ditolak karena tidak ada pengguna ber-UID 777, sedangkan chown 1000:1000 diterima sebagai UID dan GID.

UIDNama umumDi mana Anda menemuinya
0rootSemua sistem Unix
33www-dataDebian dan Ubuntu
82www-dataContainer Alpine
501pengguna pertamamacOS, dengan GID 20
1000pengguna pertamaHampir semua distro Linux
65534nobodyDebian, Ubuntu, Alpine

Angka yang sama tidak selalu berarti akun yang sama. UID 33 memang www-data di Debian. Namun pada berkas passwd bawaan Alpine angka 33 justru milik akun xfs, sementara www-data di container Alpine memakai angka 82. Inilah sebabnya berkas yang dipindahkan antar-server sering muncul dengan nama pemilik yang aneh. Angkanya terbawa utuh, sementara distro Linux di sisi tujuan menerjemahkannya ke nama yang berbeda.

Cara chown menafsirkan angka juga punya kehalusan yang mudah terlewat. Sesuai POSIX, chown lebih dulu memperlakukan argumen Anda sebagai nama, dan baru mencoba membacanya sebagai angka setelah pencarian nama gagal. Bila kebetulan ada akun bernama 1000, perintah chown 1000 berkas akan mengambil akun itu, bukan UID 1000. GNU menyediakan jalan keluarnya berupa awalan tanda tambah:

Bash
sudo chown +1000:+1000 /data/proyek

Awalan + memaksa angka dibaca sebagai ID dan melewati pencarian nama sepenuhnya.

Beda chown, chgrp, dan chmod

Ketiga perintah ini bekerja pada berkas yang sama dan sering muncul berurutan dalam satu panduan, sehingga wajar bila tertukar. Pembedanya sebenarnya cukup tegas.

PerintahYang diubahSiapa yang boleh
chownPemilik, bisa plus grupRoot, kecuali grup
chgrpGrup sajaPemilik atau root
chmodIzin baca-tulis-eksekusiPemilik atau root

Chgrp sebenarnya bukan perintah yang wajib Anda hafal, karena chown :grup berkas mengerjakan hal yang persis sama. Yang penting dipahami adalah urutan berpikirnya: chown menentukan siapa yang memiliki, chmod menentukan apa yang boleh dilakukan pemilik, grup, dan pengguna lain terhadap berkas itu. Menaikkan izin tanpa membetulkan kepemilikan sering menyelesaikan gejalanya sambil membuka pintu yang tidak perlu terbuka.

Membaca Pesan Error yang Dikeluarkan chown

Chown termasuk perintah yang hemat kata ketika gagal, dan pesannya sering terbaca lebih menakutkan daripada masalah sebenarnya. Setiap pesan diawali chown: lalu nama berkas yang bermasalah, sehingga bagian yang membedakan selalu berada di ujungnya. Bagian ujung itulah yang dikutip di kolom kiri.

Bunyi pesanPenyebab dan perbaikan
Operation not permittedAnda bukan root. Tambahkan sudo. Bila sudah root dan tetap ditolak, lihat catatan partisi di bawah.
invalid user: 'andi'Akun tujuan belum ada. Periksa dengan id andi, lalu buat akunnya atau perbaiki ejaannya.
invalid group: 'dev'Grup tujuan belum ada. Periksa dengan getent group dev.
missing operand after 'index.php'Anda menyebut berkas tetapi lupa menyebut pemilik barunya. Pemilik selalu ditulis lebih dulu.
warning: '.' should be ':'Anda memakai titik sebagai pemisah. Perintahnya berjalan, tetapi ganti ke titik dua.
illegal user namePesan khas macOS dan BSD untuk pemisah titik yang di sana ditolak sama sekali.

Ada satu kasus yang paling membingungkan, yaitu chown gagal walaupun Anda sudah menjadi root. Penyebab yang paling sering adalah berkasnya berada di partisi berformat FAT32, exFAT, atau NTFS. Format tersebut memang tidak menyimpan kepemilikan bergaya Unix, sehingga tidak ada tempat untuk mencatat perubahan Anda. Kepemilikan pada partisi semacam itu ditetapkan sekaligus saat dipasang, lewat opsi uid= dan gid=. Dokumentasi kernel Linux menyebut opsi uid= sebagai penentu pemilik seluruh berkas pada sistem berkas tersebut:

Bash
sudo mount -o uid=1000,gid=1000 /dev/sdb1 /mnt/data

Penyebab kedua yang lebih jarang adalah berkas diberi atribut immutable. Berkas dengan atribut ini menolak hampir semua perubahan metadata sekalipun perintahnya datang dari root. Periksa dengan lsattr, dan cabut atributnya dengan sudo chattr -i sebelum mencoba lagi.

Tiga Situasi di Server yang Menuntut Perbaikan Kepemilikan

Website tidak bisa mengunggah file. Ini keluhan yang paling sering muncul. WordPress dan CMS lain menulis berkas melalui proses web server, yang berjalan sebagai akun tersendiri seperti www-data atau nginx. Bila direktori unggahannya dimiliki root, proses tersebut tidak punya wewenang menulis ke sana. Perbaikannya menyerahkan direktori itu kepada akun web server:

Bash
sudo chown -R www-data:www-data /var/www/html/wp-content/uploads

Periksa lebih dulu nama akun web server di sistem Anda dengan ps aux | grep -E 'nginx|apache2'. Di CentOS namanya apache, dan di beberapa panel hosting namanya mengikuti akun pengguna.

Direktori uploads dimiliki root sehingga proses www-data ditolak menulis; sesudah chown -R, penulisan diizinkan.Direktori uploads dimiliki root sehingga proses www-data ditolak menulis; sesudah chown -R, penulisan diizinkan.

Login SSH dengan kunci tiba-tiba ditolak. Berkas di dalam ~/.ssh yang dibuat memakai sudo akan tercatat atas nama root, sementara yang login adalah akun biasa. SSH menolak memakai berkas yang bukan milik pengguna yang bersangkutan, dan penolakannya sering tanpa pesan yang jelas. Perbaikannya satu baris:

Bash
chown -R $USER:$USER ~/.ssh

Langkah ini merupakan bagian dari pemeriksaan rutin saat memasang SSH key di server baru.

File hasil unggahan FTP tidak bisa disunting aplikasi. Berkas yang masuk lewat FTP tercatat atas nama akun FTP, sementara skrip PHP berjalan sebagai akun lain. Akibatnya aplikasi dapat membaca berkas itu tetapi gagal menulis ulang. Solusinya menyeragamkan kepemilikan, atau menempatkan kedua akun dalam satu grup lalu menyerahkan grupnya:

Bash
sudo chown -R :www-data /home/andi/public_html

Hal yang Perlu Anda Pertimbangkan Sebelum Menjalankan chown

Chown termasuk perintah yang bekerja diam-diam dan cepat, dan justru di situ letak risikonya.

  1. Tidak ada penjaga saat Anda menjalankannya pada direktori root. Perintah rm menolak bekerja pada / secara bawaan, tetapi chown tidak. Manual GNU bahkan menyebut chown lebih berbahaya daripada rm bila dijalankan rekursif pada /. Alasannya, chown bekerja jauh lebih cepat, sehingga lebih banyak berkas rusak sebelum Anda sempat menekan Ctrl+C. Tersedia opsi --preserve-root yang menolak perintah semacam itu, tetapi opsi tersebut bukan perilaku bawaan. Memasangnya sebagai alias di .bashrc adalah kebiasaan yang murah dan menolong.
  2. Chown membersihkan bit SetUID dan SetGID. Ketika kepemilikan sebuah program diubah oleh pengguna tanpa hak istimewa, sistem menghapus kedua bit tersebut demi keamanan. Program yang mengandalkan bit itu akan berhenti bekerja sebagaimana mestinya setelah kepemilikannya Anda ubah.
  3. Tidak ada tombol undo. Chown tidak menyimpan riwayat. Sebelum menjalankan perintah rekursif pada direktori penting, catat dulu kondisi sekarang dengan ls -lnR /path > /root/kepemilikan-sebelum.txt. Menjalankannya dengan -v (--verbose) atau -c (--changes) juga menolong, karena keduanya mencetak daftar berkas yang tersentuh sehingga jangkauan perintah terlihat sebelum Anda menyesalinya. Untuk kasus yang lebih sederhana, opsi --reference=berkas-contoh menyalin kepemilikan dari berkas lain sehingga Anda tidak perlu menebak.
  4. Kepemilikan yang benar tidak menjamin masalah selesai. Bila izin berkasnya sendiri terlalu ketat, memperbaiki pemilik tidak mengubah apa pun. Periksa kedua sisi bersamaan, dan naikkan izin hanya sebesar yang benar-benar dibutuhkan.

Pertanyaan yang Sering Diajukan

Chown singkatan dari apa dan dibaca bagaimana? Chown berasal dari change owner. Pengucapan yang lazim di kalangan pengguna Unix adalah dua suku kata, "ch-own". Pola penamaannya sama dengan chmod dari change mode dan chgrp dari change group.

Apakah Windows punya perintah seperti chown? Tidak persis sama, karena Windows memakai model kepemilikan dan daftar kendali akses yang berbeda. Padanan terdekatnya ada dua. Perintah takeown /f namaberkas mengambil alih kepemilikan berkas untuk akun yang sedang login, dengan tambahan /r untuk bekerja rekursif. Untuk menyerahkan kepemilikan ke akun tertentu, gunakan icacls namaberkas /setowner NamaPengguna /T. Keduanya membutuhkan hak administrator.

Apakah chown di Ubuntu, Debian, dan CentOS sama? Sama. Ketiganya memakai chown dari paket GNU Coreutils, sehingga opsi dan pesan errornya identik. Yang berbeda antar-distribusi adalah nama akun sistemnya, misalnya akun web server bernama www-data di Ubuntu dan Debian tetapi apache di CentOS.

Kenapa chown di macOS menolak opsi --recursive? Karena macOS memakai chown versi BSD, bukan GNU. Versi BSD hanya menyediakan opsi pendek. Pada pengujian kami, -R dan -h berfungsi normal, sementara --recursive, --reference, dan --from sama-sama ditolak dengan pesan chown: illegal option -- -. Skrip yang ditulis untuk server Linux karena itu tidak selalu berjalan apa adanya di Mac.

Bisakah satu file dimiliki dua pengguna sekaligus? Tidak bisa. Setiap berkas hanya menyimpan satu UID pemilik dan satu GID grup. Bila dua akun memang harus sama-sama menulis, masukkan keduanya ke satu grup lalu serahkan grup berkasnya ke grup tersebut. Untuk kebutuhan yang lebih rinci lagi, gunakan ACL (Access Control List) lewat perintah setfacl.

Kenapa chown 1000:1000 sering muncul di panduan Docker? Karena container dan host berbagi angka UID yang sama meski nama akunnya berbeda. Berkas yang ditulis proses di dalam container muncul di host dengan UID apa adanya, dan sering tampil sebagai milik akun yang tidak dikenal. Menyamakan angkanya dengan UID akun Anda di host, yang pada kebanyakan sistem adalah 1000, membuat berkas hasil container tetap dapat Anda sunting.

Kesimpulan

Chown mengubah kepemilikan file, bukan izin aksesnya. Ia menerima angka, tetapi angkanya adalah UID dan GID seperti 0, 33, atau 1000, bukan kode mode seperti 755 atau 777. Dan ia hampir selalu menuntut akses root, karena POSIX melarang siapa pun menyerahkan berkasnya kepada akun lain — termasuk pemilik berkas itu sendiri.

Untuk pekerjaan sehari-hari, tiga bentuk sudah menutup hampir semua kebutuhan. Pakai chown pemilik:grup berkas untuk satu berkas, chown -R pemilik:grup direktori untuk satu direktori beserta isinya, dan chown :grup berkas bila hanya grupnya yang keliru. Bila setelah kepemilikan dibetulkan masalahnya belum juga hilang, pemeriksaan berikutnya ada di sisi izin akses, bukan di chown. Semoga artikel ini membantu.