Linux’ta dosya sahipliği meselesi, görünürde basit ama pratikte sıkça baş ağrıtan konulardan biridir. Özellikle bir web sunucusunda dosya izinleri karıştığında, bir uygulama kendi dizinine yazamaz hale geldiğinde ya da yanlış kullanıcıyla çalışan bir servis kritik dosyalara erişemediğinde, chown komutunu doğru kullanmak hayat kurtarır. Bu yazıda chown komutunu her yönüyle ele alacak, gerçek dünya senaryolarıyla pekiştireceğiz.
chown Nedir ve Neden Önemlidir?
chown, İngilizce “change owner” kelimelerinin kısaltmasıdır. Linux’ta her dosya ve dizinin bir sahibi (owner) ve bir grup sahibi (group) vardır. Bu sahiplik bilgisi, dosyaya kimin okuyabileceğini, yazabileceğini ve çalıştırabileceğini belirleyen izin sistemiyle birlikte çalışır.
Sisteme bir servis kurduğunuzda, dosya yüklediğinizde ya da başka bir kullanıcıdan veri devraldığınızda sahiplik sorunları kaçınılmaz olarak karşınıza çıkar. Mesela bir FTP ile sunucuya yüklenen dosyalar genellikle root ya da FTP kullanıcısı adına oluşur. Ama Apache veya Nginx bu dosyaları www-data ya da nginx kullanıcısı olarak okumaya çalışır. Sahiplik yanlışsa servis çalışmaz, hata logu dolar.
chown komutunun temel sözdizimi şu şekildedir:
chown [seçenekler] kullanici[:grup] dosya
Buradaki köşeli parantezler isteğe bağlı kısmı gösteriyor. Yani sadece kullanıcı adını yazarsanız grup değişmez, :grup eklerseniz her ikisini birden değiştirebilirsiniz.
Temel Kullanım Örnekleri
En basit haliyle bir dosyanın sahibini değiştirmekle başlayalım:
chown ahmet dosya.txt
Bu komut dosya.txt dosyasının sahibini ahmet kullanıcısı yapar. Grup değişmez, olduğu gibi kalır.
Hem kullanıcıyı hem grubu aynı anda değiştirmek istiyorsanız:
chown ahmet:gelistiriciler proje.py
Bu komut dosyanın sahibini ahmet, grubunu da gelistiriciler yapar. İki nokta üst üste (:) ayırıcı olarak kullanılır. Eski Linux belgelerinde nokta (.) da kullanılırdı ama artık standart iki nokta üst üstedir.
Sadece grup sahipliğini değiştirmek istiyorsanız iki yol var. Birincisi chown ile:
chown :gelistiriciler proje.py
İkincisi ise bunun için özel olarak var olan chgrp komutu, ama chown ile de rahatlıkla halledilebilir.
Kullanıcı ve grubu aynı isimde yapmak istiyorsanız, yani kullanıcı adını gruba da uygulamak istiyorsanız:
chown ahmet: dosya.txt
Sondaki iki noktayı koydunuzda ama grup adı yazılmadığında Linux, o kullanıcının ana grubunu otomatik olarak atar. Bu çok kullanışlı bir kısayoldur.
Dizinlere Özyinelemeli Sahiplik Değiştirme
Tek bir dosya değil, tüm bir dizin ağacının sahipliğini değiştirmeniz gerektiğinde -R (recursive) seçeneğini kullanırsınız. Bu sysadmin hayatında en sık kullanılan chown senaryosudur:
chown -R www-data:www-data /var/www/html/sitem
Bu komut /var/www/html/sitem dizininin ve içindeki tüm dosya ve alt dizinlerin sahibini www-data kullanıcısı ve grubu yapar. Web sunucusu kurulumlarında bu komut neredeyse ezberdir.
Dikkat: -R seçeneği güçlüdür. Yanlış bir dizine uygulandığında büyük sorunlar çıkarabilir. Mesela / dizinine yanlışlıkla uygulamak felakete yol açar. Bu yüzden komutu çalıştırmadan önce hedef dizini iki kez kontrol edin.
Önemli Seçenekler
chown komutunun günlük hayatta kullandığınız başlıca seçenekleri şunlardır:
- -R: Dizin ağacını özyinelemeli olarak işler. Alt dizinler ve dosyalar dahil her şeyin sahipliği değişir.
- -v (verbose): Her değiştirilen dosya için bilgi mesajı basar. Neyin değiştiğini takip etmek istediğinizde kullanışlıdır.
- -c (changes): Sadece gerçekten değişiklik yapılan dosyaları raporlar.
-vgibi ama yalnızca değişenler için çıktı üretir. - –from=kullanici:grup: Yalnızca belirtilen sahip/grup kombinasyonuna sahip dosyaları değiştirir. Seçici operasyonlar için idealdir.
- -h: Sembolik linklerin kendisinin sahipliğini değiştirir, işaret ettiği dosyanın değil. Varsayılan davranış sembolik linkin işaret ettiği dosyayı değiştirmektir.
- –preserve-root: Kök dizine (
/)chown -Ruygulanmasını engeller. Güvenlik açısından kritik bir önlemdir. - –reference=dosya: Sahipliği başka bir dosyadan referans alarak ayarlar.
Verbose modunun gerçekte nasıl çalıştığını görmek için:
chown -Rv ahmet:ahmet /home/ahmet/projeler/
Bu komut her dosya için şuna benzer çıktı üretir:
changed ownership of '/home/ahmet/projeler/index.html' from root:root to ahmet:ahmet
changed ownership of '/home/ahmet/projeler/style.css' from root:root to ahmet:ahmet
Sayısal UID ve GID Kullanımı
chown komutunda kullanıcı ve grup adı yerine sayısal kimlikler (UID ve GID) de kullanılabilir. Bu özellikle betikler yazarken ya da kullanıcı adının sistemde tanımlı olmadığı durumlarda işe yarar:
chown 1001:1001 /opt/uygulama/config.yaml
Sisteminizde hangi kullanıcının hangi UID’ye sahip olduğunu görmek için:
id ahmet
Çıktı şuna benzer:
uid=1001(ahmet) gid=1001(ahmet) groups=1001(ahmet),27(sudo),1002(gelistiriciler)
Bu yöntem, Docker container’ları arasında dosya sahipliği senkronizasyonu yaparken çok işe yarar. Container içi UID’ler ile host üzerindeki UID’ler eşleşmeyebilir ve sayısal değerler kullanmak kafa karışıklığını önler.
–reference Seçeneği ile Sahiplik Kopyalama
Bir dosyanın sahipliğini başka bir dosyadan kopyalamak istediğinizde --reference seçeneği hayat kurtarır:
chown --reference=/etc/nginx/nginx.conf /etc/nginx/conf.d/sitem.conf
Bu komut sitem.conf dosyasının sahipliğini nginx.conf dosyasıyla aynı yapacaktır. Hangi kullanıcı ve grubun kullanıldığını tek tek kontrol etmek zorunda kalmadan hızlıca eşitleme yapabilirsiniz. Özellikle çok sayıda konfigürasyon dosyası yönetirken bu yaklaşım zaman kazandırır.
–from ile Seçici Sahiplik Değişimi
Diyelim ki bir dizin içinde bazı dosyalar farklı kullanıcılara ait ve siz yalnızca belirli bir kullanıcıya ait olanları değiştirmek istiyorsunuz. --from seçeneği tam bunun için var:
chown --from=eski_kullanici:eski_grup yeni_kullanici:yeni_grup /var/www/html/
Ya da sadece kullanıcıya göre filtrelemek istiyorsanız:
chown -R --from=deploy www-data /var/www/uygulama/
Bu komut /var/www/uygulama/ altında yalnızca deploy kullanıcısına ait dosyaların sahipliğini www-data olarak değiştirir. Diğer kullanıcılara ait dosyalara dokunmaz. Karma sahiplik yapısı olan dizinlerde bu seçenek çok değerlidir.
Gerçek Dünya Senaryoları
Senaryo 1: Web Uygulaması Kurulumu Sonrası İzin Düzenleme
Yeni bir PHP uygulaması kurduğunuzu ve dosyaları root olarak /var/www/html/uygulama dizinine kopyaladığınızı düşünün. Apache www-data kullanıcısıyla çalışıyor ve dosyaları okuyamıyor:
# Önce mevcut sahipliği kontrol et
ls -la /var/www/html/uygulama/
# Tüm dizinin sahipliğini Apache kullanıcısına ver
chown -R www-data:www-data /var/www/html/uygulama/
# Yazılabilir dizinleri ayrıca ayarla (örn: cache ve uploads)
chown -R www-data:www-data /var/www/html/uygulama/cache/
chown -R www-data:www-data /var/www/html/uygulama/uploads/
Senaryo 2: Kullanıcı Ev Dizini Devri
Şirketten ayrılan bir çalışanın dosyalarını başka bir çalışana devretmeniz gerekiyor:
# eski kullanıcıya ait dosyaları yeni kullanıcıya aktar
chown -Rc yeni_calisan:yeni_calisan /home/eski_calisan/projeler/
# Sahiplik değişikliklerini kontrol et
ls -la /home/eski_calisan/projeler/
-c seçeneği sayesinde sadece değişiklik yapılan dosyalar raporlanır, bu da işlemin sonucunu doğrulamayı kolaylaştırır.
Senaryo 3: Backup Klasöründen Restore Sonrası
Backup’tan geri yüklenen dosyalar yanlış sahiplikle gelebilir. Özellikle tar arşivleri sayısal UID’leri korur ama farklı bir sistemde bu UID’ler başka kullanıcılara karşılık gelebilir:
# Arşivi aç
tar -xzf yedek.tar.gz -C /opt/uygulama/
# Sahipliği düzelt
chown -R uygulama_kullanicisi:uygulama_grubu /opt/uygulama/
# Kritik konfigürasyon dosyalarını root'ta bırak
chown root:root /opt/uygulama/config/production.yaml
chmod 600 /opt/uygulama/config/production.yaml
Senaryo 4: Docker Volume Sahiplik Sorunu
Docker kullanırken host ile container arasında volume paylaşımında sahiplik sorunları çok yaygındır. Container içindeki uygulama genellikle 1000 UID’li bir kullanıcıyla çalışır:
# Host üzerinde volume dizininin sahipliğini ayarla
chown -R 1000:1000 /data/uygulama-volume/
# Sonucu doğrula
ls -lan /data/uygulama-volume/
ls -lan komutundaki n seçeneği isimleri değil sayısal UID/GID değerlerini gösterir, bu da container bağlamında ne olduğunu anlamayı kolaylaştırır.
Sembolik Linkler ve chown
Sembolik linklerle çalışırken dikkatli olmak gerekir. Varsayılan davranışta chown sembolik linkin işaret ettiği dosyanın sahipliğini değiştirir, linkin kendisini değil:
# Bu komut linkin işaret ettiği dosyayı değiştirir
chown ahmet sembolik_link
# Bu komut linkin kendisini değiştirir (-h seçeneği ile)
chown -h ahmet sembolik_link
-R ile birlikte kullanıldığında da dikkatli olun. Dizin yapısındaki sembolik linkler beklenmedik yerlerdeki dosyaların sahipliğini değiştirebilir. Bu durumda -R ile birlikte -H, -L veya -P seçenekleri kullanılabilir:
- -H:
-Rile birlikte, komut satırında verilen sembolik linklerin işaret ettiği yerlere iner ama alt dizinlerdeki linkleri takip etmez. - -L: Tüm sembolik linkleri takip eder.
- -P: Hiçbir sembolik linki takip etmez (varsayılan davranış
-Rile).
Güvenli bir yaklaşım olarak sembolik link içeren dizinlerde genellikle -P veya -h kullanmak önerilir.
Sahiplik Değişikliğini Doğrulama
Komutları çalıştırdıktan sonra değişikliğin gerçekten uygulandığını doğrulamak iyi bir alışkanlıktır:
# Dosya veya dizinin sahipliğini kontrol et
ls -la /var/www/html/uygulama/
# Belirli bir kullanıcıya ait dosyaları bul
find /var/www/html/ -user www-data -type f
# Belirli bir gruba ait dosyaları bul
find /opt/uygulama/ -group gelistiriciler -type f
# Root'a ait ama başkaları tarafından yazılabilir dosyaları bul (güvenlik taraması)
find /etc/ -user root -perm -o+w -type f 2>/dev/null
Bu find komutları özellikle büyük dizin yapılarında belirli bir kullanıcıya ait dosyaları hızlıca bulmak için çok kullanışlıdır.
Güvenlik Notları
chown kullanırken aklınızda bulundurmanız gereken bazı kritik güvenlik noktaları var:
Yetki Gereksinimi: Normal kullanıcılar yalnızca kendi sahip oldukları dosyaları başka bir kullanıcıya devredebilir. Bu aslında bir güvenlik önlemidir. Sahipliği değiştirmek için genellikle root yetkisi gerekir.
SUID Tehlikesi: Bir dosyaya SUID biti ayarlıysa ve siz chown ile sahibini değiştirirseniz, Linux otomatik olarak SUID bitini kaldırır. Bu güvenlik açığını önleyen önemli bir davranıştır.
Kök Dizini Koruması: --preserve-root seçeneğini kritik sistemlerde her zaman kullanmayı düşünün. Hatta bazı sistem yöneticileri bu seçeneği .bashrc ya da alias olarak tanımlar:
# .bashrc veya .bash_aliases dosyasına eklenebilir
alias chown='chown --preserve-root'
Audit Logging: Kritik sistemlerde chown işlemlerini loglamak önemlidir. auditd ile chown system call’larını izleyebilirsiniz.
find ile Kombinasyon
chown tek başına güçlüdür ama find komutuyla kombinasyon oluşturduğunda çok daha esnek hale gelir:
# Belirli bir kullanıcıya ait tüm dosyaları başka kullanıcıya ver
find /opt/projeler/ -user eski_kullanici -exec chown yeni_kullanici:yeni_kullanici {} ;
# Sadece dizinlerin sahipliğini değiştir
find /var/www/ -type d -exec chown www-data:www-data {} ;
# Sadece dosyaların sahipliğini değiştir
find /var/www/ -type f -exec chown www-data:www-data {} ;
find + exec kombinasyonu -R seçeneğinin yapamadığı seçici işlemler yapmanızı sağlar. Mesela sadece .php dosyalarının sahipliğini değiştirmek:
find /var/www/html/ -name "*.php" -exec chown www-data:www-data {} ;
Sık Yapılan Hatalar
Yıllar içinde gözlemlediğim yaygın chown hatalarından bahsetmek gerekiyor:
Yanlış sıralama: chown kullanici:grup dosya yerine chown dosya kullanici:grup yazmak komutun hata vermesine ya da yanlış çalışmasına neden olur.
Büyük/küçük harf: -r yerine -R yazılması gerekir. chown -r tanınmaz veya farklı davranır. Her zaman büyük -R kullanın.
Nokta ile iki nokta karışıklığı: Eski sistemlerde chown kullanici.grup yazımı geçerliydi. Modern sistemlerde iki nokta üst üste kullanın. Betiklerinizde her ikisi de çalışır ama tutarlı olun.
Sistem dizinlerinde dikkat: /etc, /usr, /bin gibi sistem dizinlerinde özyinelemeli sahiplik değişikliği yapmak sistemi bozabilir. Bu dizinlerde çok spesifik hedeflerle çalışın.
Sonuç
chown komutu, Linux sistem yönetiminin temel taşlarından biridir. Basit sözdiziminin arkasında güçlü ve esnek bir araç yatar. Tek bir dosyadan binlerce dosyaya yayılan dizin ağaçlarına kadar sahiplik yönetimi, sistemin güvenli ve doğru çalışması için kritiktir.
Günlük pratikte en çok karşılaştığınız senaryolar web sunucusu izinleri, kullanıcı geçişleri ve yedekten geri yükleme sonrası sahiplik düzeltmeleridir. Bu yazıda ele aldığımız temel ve ileri düzey kullanımları kavradıktan sonra bu senaryoların üstesinden rahatlıkla gelirsiniz.
Son bir hatırlatma: chown komutunu çalıştırmadan önce hedef dizini ve kullanıcı bilgilerini mutlaka kontrol edin. ls -la ve id komutları bu doğrulama için biçilmiş kaftandır. Özellikle -R seçeneğiyle çalışırken acele etmemek, büyük sorunların önüne geçer. Üretim sunucularında değişiklik yapmadan önce bir test ortamında denemek de hiçbir zaman zarar vermez.