install Komutu ile Dosya Kopyalama, İzin ve Sahiplik Atama İşlemlerini Tek Adımda Gerçekleştirme

Bir script yazarken ya da deployment pipeline’ı kurarken şu sahneyle kaç kez karşılaştınız: önce cp ile dosyayı kopyalıyorsunuz, ardından chmod ile izinleri ayarlıyorsunuz, sonra chown ile sahibini değiştiriyorsunuz. Üç komut, üç satır, üç hata yapma fırsatı. Oysa Linux’ta bu işin çok daha temiz bir yolu var: install komutu.

install komutu, adından da anlaşılacağı gibi aslında yazılım kurulum scriptlerinin omurgası olarak tasarlanmış. GNU coreutils’in bir parçası olan bu araç, dosyaları kopyalarken aynı anda izinleri, sahipliği ve hatta zaman damgasını tek bir komutla ayarlamanıza olanak tanıyor. Ama garip bir şekilde pek çok sistem yöneticisi bunu ya hiç bilmiyor ya da salt yazılım kurulumuna özgü bir komut olduğunu sanıyor. Bu yazıda install komutunun tüm yeteneklerini, gerçek dünya senaryolarıyla birlikte ele alacağız.

install Komutu Nedir ve Neden Önemlidir?

install komutu, temel olarak cp, chmod ve chown komutlarının işlevlerini tek bir araçta birleştiriyor. Makefile’larda, RPM/DEB paket spec dosyalarında ve deployment scriptlerinde sıklıkla karşınıza çıkar. Ama bunun ötesinde, günlük sysadmin işlerinde de son derece kullanışlıdır.

Neden üç ayrı komut yerine install kullanmalısınız? Birkaç önemli nedeni var:

  • Atomiklik: Dosyayı geçici bir konuma kopyalayıp ardından taşıdığı için işlem yarıda kesilse bile hedef dosya tutarsız bir durumda kalmaz.
  • Okunabilirlik: Scriptleriniz daha temiz görünür, niyetiniz açıktır.
  • Hata azaltma: Üç komut yerine bir komut, bir hata noktası demektir.
  • Şerit ve yedekleme: Bazı senaryolarda binary dosyalardan debug sembollerini otomatik olarak çıkarabilir.

Şimdi gelin bu komutun anatomisini inceleyelim.

Temel Kullanım Sözdizimi

install [SEÇENEKLER] KAYNAK HEDEF
install [SEÇENEKLER] KAYNAK... DİZİN
install -d [SEÇENEKLER] DİZİN...

En basit kullanım biçimiyle, bir dosyayı kopyalamak ve izin atamak:

install -m 755 myscript.sh /usr/local/bin/myscript.sh

Bu komut, myscript.sh dosyasını /usr/local/bin/ altına kopyalar ve izinlerini rwxr-xr-x olarak ayarlar. Tek satır, temiz iş.

Temel Parametreler

install komutunun sıkça kullanılan parametrelerini şöyle özetleyebilirim:

  • -m MODE: Hedef dosyanın izin bitlerini ayarlar. Octal veya sembolik gösterim kullanılabilir.
  • -o OWNER: Hedef dosyanın sahibini belirler (root yetkisi gerektirir).
  • -g GROUP: Hedef dosyanın grup sahipliğini belirler.
  • -d: Dizin oluşturur, dosya kopyalamaz. Gerekli ara dizinleri de otomatik oluşturur.
  • -D: Hedef dosyanın yolundaki eksik dizinleri otomatik oluşturur.
  • -p: Kaynak dosyanın zaman damgasını korur (cp -p gibi).
  • -b: Hedefte aynı isimde dosya varsa yedek alır.
  • -S SUFFIX: -b ile birlikte kullanılan yedek dosya uzantısını belirler.
  • -s: Binary dosyaları kopyalarken strip uygular (debug sembollerini siler).
  • -v: Verbose mod, yapılan işlemleri ekrana yazdırır.
  • -t DİZİN: Hedef dizini bu parametreyle de belirtebilirsiniz (xargs ile kullanım için kullanışlı).
  • -T: Hedefin kesinlikle bir dosya olduğunu belirtir, dizin değil.
  • -c: Uyumluluk için var, artık bir işlevi yok ama bazı eski scriptlerde görebilirsiniz.
  • –backup=CONTROL: Yedekleme yöntemini belirler: none, off, numbered, t, existing, nil, simple, never.

Gerçek Dünya Senaryoları

Senaryo 1: Uygulama Binary’sini Deploy Etmek

Diyelim ki Go ile yazılmış bir monitoring agent binary’si derlediniz ve bunu birkaç sunucuya dağıtmanız gerekiyor. Klasik yöntem:

cp monitoring-agent /usr/local/bin/monitoring-agent
chmod 755 /usr/local/bin/monitoring-agent
chown root:root /usr/local/bin/monitoring-agent

install ile aynı iş:

install -m 755 -o root -g root monitoring-agent /usr/local/bin/monitoring-agent

Hem daha temiz, hem de daha güvenilir. Bir Ansible playbook içinde ya da deployment script’inde bu farkı görünce install‘a olan sevginiz artacak.

Senaryo 2: Yapılandırma Dosyalarını Yerleştirmek

Web sunucusu için hazırladığınız Nginx konfigürasyon dosyasını yerine koymak istiyorsunuz. Konfigürasyon dosyaları genellikle root sahibinde ama www-data grubundan okunabilir olmalı:

install -m 640 -o root -g www-data nginx-site.conf /etc/nginx/sites-available/myapp.conf

640 izniyle root okuyup yazabilir, www-data grubu sadece okuyabilir, diğerleri erişemez. Bu tek satır, üç komutun işini görüyor ve hem daha okunabilir hem de niyeti açık biçimde ifade ediyor.

Senaryo 3: Dizin Yapısı Oluşturmak

-d parametresi, mkdir -p‘nin sahip ve izin ayarlama özelliğiyle zenginleştirilmiş halidir. Bir uygulama için dizin hiyerarşisi kurarken:

install -d -m 755 -o appuser -g appgroup /opt/myapp
install -d -m 750 -o appuser -g appgroup /opt/myapp/config
install -d -m 700 -o appuser -g appgroup /opt/myapp/secrets
install -d -m 755 -o appuser -g appgroup /opt/myapp/logs

Bu dört satır, uygulamanın ihtiyaç duyduğu tüm dizin yapısını doğru izinlerle oluşturuyor. secrets dizini kasıtlı olarak 700 verildi, yani yalnızca appuser erişebilir.

Senaryo 4: -D ile Hedef Yolunu Otomatik Oluşturmak

Çoğu zaman dosyayı kopyalamadan önce hedef dizinin var olduğundan emin olmak gerekir. -D parametresi bu sorunu çözüyor:

install -D -m 644 -o root -g root 
    configs/app.conf 
    /etc/myapp/conf.d/app.conf

/etc/myapp/conf.d/ dizini yoksa bile install -D bu yolu otomatik olarak oluşturur ve ardından dosyayı kopyalar. Deployment scriptlerinde mkdir -p + install kombinasyonundan kurtulmuş olursunuz.

Senaryo 5: Birden Fazla Dosyayı Tek Seferde Kopyalamak

Birden fazla dosyayı aynı anda aynı dizine kopyalamak da mümkün. Son argüman dizin olmak zorunda:

install -m 755 -o root -g root 
    bin/agent 
    bin/agent-cli 
    bin/agent-helper 
    /usr/local/bin/

Bu kullanım biçimi özellikle paket kurulum scriptlerinde çok yaygın. RPM spec dosyalarındaki %install bölümünde bu paterni sıklıkla görürsünüz.

Senaryo 6: Yedekleme Alarak Kopyalamak

Production ortamında var olan bir konfigürasyon dosyasını değiştirirken yedek almak kritik önem taşır. install bunu da yapabiliyor:

install -m 644 -o root -g root -b -S .bak 
    new-httpd.conf 
    /etc/httpd/conf/httpd.conf

Bu komut çalıştırıldığında, /etc/httpd/conf/httpd.conf dosyası önce /etc/httpd/conf/httpd.conf.bak olarak yedeklenir, ardından yeni dosya yerine kopyalanır. Hem güvenli hem de pratik.

Numbered yedekleme kullanmak isterseniz:

install -m 644 -o root -g root --backup=numbered 
    new-httpd.conf 
    /etc/httpd/conf/httpd.conf

Bu durumda httpd.conf.~1~, httpd.conf.~2~ şeklinde ardışık yedekler oluşturulur.

Senaryo 7: Makefile Entegrasyonu

install komutunun esas evinde hissettiği yer Makefile’lardır. Tipik bir make install hedefi şöyle görünür:

PREFIX ?= /usr/local
BINDIR = $(PREFIX)/bin
SYSCONFDIR = /etc
DATADIR = $(PREFIX)/share/myapp

install:
	install -d -m 755 $(BINDIR)
	install -d -m 755 $(DATADIR)
	install -d -m 755 $(SYSCONFDIR)/myapp
	install -m 755 -o root -g root myapp $(BINDIR)/myapp
	install -m 644 -o root -g root myapp.conf $(SYSCONFDIR)/myapp/myapp.conf
	install -m 644 -o root -g root share/myapp.1 $(DATADIR)/myapp.1

Bu yapı, hem kaynak koddan derleme yapanlar hem de paket yöneticileri için standart bir arayüz sunuyor. Autotools, CMake ve Meson gibi build sistemleri de arka planda benzer install çağrıları üretiyor.

strip Özelliği: Debug Sembollerini Temizlemek

-s parametresi, binary dosyaları deploy ederken oldukça kullanışlıdır. ELF binary’lerinden debug sembollerini kaldırarak dosya boyutunu önemli ölçüde küçültür:

# Debug sembollerini içeren binary boyutu: 45MB
# strip edilmiş binary boyutu: ~8MB

install -s -m 755 -o root -g root myapp-debug /usr/local/bin/myapp

Arka planda strip komutunu çağırdığı için sistemde strip aracının kurulu olması gerekir. Production ortamlarında bu özellik hem disk alanından tasarruf ettirir hem de binary analizi yapılmasını güçleştirir.

Symlink’leri Ele Almak

install komutu varsayılan olarak symlink’leri dereference eder, yani symlink’in işaret ettiği gerçek dosyayı kopyalar. Bu davranış çoğu zaman istenen şeydir:

ls -la config.conf
# config.conf -> /opt/configs/production.conf

install -m 644 config.conf /etc/myapp/config.conf
# Kopyalanan: production.conf'un içeriği, symlink değil

Bu özellik, yanlışlıkla symlink kopyalayıp hedef sistemde kırık bağlantı bırakma hatasını önler.

xargs ve find ile Birlikte Kullanım

-t parametresi, xargs ile kullanım için özellikle tasarlanmış gibidir:

find ./configs -name "*.conf" | 
    xargs install -m 644 -o root -g root -t /etc/myapp/conf.d/

Bu komut, ./configs dizinindeki tüm .conf dosyalarını /etc/myapp/conf.d/ altına kopyalar ve her birine 644 izni ile root:root sahipliği atar. find + install kombinasyonu, özellikle büyük dosya kümelerini deploy ederken çok güçlüdür.

Ansible ve Shell Script’lerde install Kullanımı

Ansible’ın copy modülü çoğu ihtiyacı karşılasa da bazen shell task içinde install kullanmak daha pratiktir:

- name: Deploy application binaries
  ansible.builtin.shell: |
    install -m 755 -o root -g root 
      {{ build_dir }}/bin/myapp 
      /usr/local/bin/myapp
  args:
    creates: /usr/local/bin/myapp

Saf shell script’lerde ise bir deployment fonksiyonu olarak:

#!/bin/bash

DEPLOY_USER="appuser"
DEPLOY_GROUP="appgroup"
APP_DIR="/opt/myapp"

deploy_app() {
    local src_dir="$1"
    local version="$2"

    echo "[INFO] Deploying version ${version}..."

    # Dizin yapısını oluştur
    install -d -m 755 -o "${DEPLOY_USER}" -g "${DEPLOY_GROUP}" 
        "${APP_DIR}/releases/${version}"
    install -d -m 750 -o "${DEPLOY_USER}" -g "${DEPLOY_GROUP}" 
        "${APP_DIR}/releases/${version}/config"
    install -d -m 700 -o "${DEPLOY_USER}" -g "${DEPLOY_GROUP}" 
        "${APP_DIR}/releases/${version}/secrets"

    # Binary'leri deploy et
    install -m 755 -o "${DEPLOY_USER}" -g "${DEPLOY_GROUP}" 
        "${src_dir}/bin/myapp" 
        "${APP_DIR}/releases/${version}/myapp"

    # Konfigürasyonları deploy et
    install -m 640 -o "${DEPLOY_USER}" -g "${DEPLOY_GROUP}" 
        "${src_dir}/config/app.conf" 
        "${APP_DIR}/releases/${version}/config/app.conf"

    echo "[INFO] Deploy tamamlandi: ${version}"
}

deploy_app "./build" "2.1.4"

Bu script, install komutunu kullanarak tüm dizin oluşturma, kopyalama ve izin atama işlemlerini tek bir tutarlı araç üzerinden yapıyor. Bakımı kolay, okunması net.

cp’den Farklı Olarak Bilmeniz Gerekenler

install ile cp arasındaki bazı önemli farkları bilmek, yanlış kullanımdan sizi korur:

  • install dizinleri rekürsif olarak kopyalamaz. -r parametresi yoktur. Dizin içeriğini kopyalamak için find ile birlikte kullanmanız gerekir.
  • install varsayılan olarak özel dosyaları (device files, socket’ler) kopyalamaz. Normal dosyalar için tasarlanmıştır.
  • Hedef dosya mevcutsa install onu üzerine yazar (yedek parametresi kullanılmadıkça). Bu cp ile aynı davranıştır.
  • -o ve -g parametreleri root yetkisi gerektirir. Normal kullanıcı olarak çalıştırıldığında bu parametreler görmezden gelinmez, hata verir.
  • install kopyaladığı dosyanın içeriğini doğrulamaz. Checksum kontrolü için ek adımlar gereklidir.

Pratik İpuçları ve Dikkat Edilecekler

Yıllarca production ortamlarında install kullandıktan sonra edindiğim bazı pratik notlar:

Öncelikle, install -v kullanarak verbose modu açın. Özellikle script geliştirirken hangi dosyanın nereye kopyalandığını görmek hata ayıklamada büyük kolaylık sağlar.

CI/CD pipeline’larınızda install kullanırken, komutun başarısız olup olmadığını kontrol edin. set -e içeren script’lerde sorun olmaz ama -o ve -g kullanırken root yetkisinin olup olmadığını doğrulayın.

Konfigürasyon dosyaları için genellikle 644 veya 640, binary’ler için 755, secret içerikli dosyalar için 600 veya 400 iyi bir başlangıç noktasıdır. Bu değerleri her ortam için gözden geçirin.

Sistemdeki install sürümünü kontrol etmek isterseniz:

install --version
# install (GNU coreutils) 8.32

macOS’ta install komutu BSD kökenlidir ve bazı parametreler farklı davranır. Cross-platform script yazıyorsanız bu farka dikkat edin. macOS’ta -D parametresi yoktur, bunun yerine dizini önceden oluşturmanız gerekir. GNU coreutils’i Homebrew ile kurarak macOS’ta da ginstall adıyla GNU sürümünü kullanabilirsiniz.

Sonuç

install komutu, Linux sistem yönetiminde haksız yere göz ardı edilen ama son derece güçlü bir araçtır. Dosya kopyalama, izin ve sahiplik atama işlemlerini tek bir atomik adımda gerçekleştirmesi, scriptlerinizi hem daha temiz hem de daha güvenilir hale getirir. Üç ayrı komut yerine bir komut kullanmak; okunabilirliği artırır, hata yapma olasılığını azaltır ve niyetinizi açıkça ifade eder.

Özellikle Makefile’lar, deployment scriptleri ve CI/CD pipeline’larında install komutunu benimsemek, uzun vadede bakım yükünüzü belirgin biçimde azaltacak. Bir sonraki deployment scriptini yazarken cp + chmod + chown üçlüsüne uzanmadan önce install‘ı düşünün. Büyük ihtimalle ihtiyacınız olan her şey tek satırda çözüme kavuşacak.

Günlük sysadmin işlerinde küçük ama etkili araçları tanımak ve doğru yerde kullanmak, iyi bir sistem yöneticisini mükemmelden ayıran şeylerin başında geliyor. install komutu da tam olarak bu kategoride: küçük, odaklı, ve işini tertemiz yapıyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir