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 -pgibi). - -b: Hedefte aynı isimde dosya varsa yedek alır.
- -S SUFFIX:
-bile birlikte kullanılan yedek dosya uzantısını belirler. - -s: Binary dosyaları kopyalarken
stripuygular (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:
installdizinleri rekürsif olarak kopyalamaz.-rparametresi yoktur. Dizin içeriğini kopyalamak içinfindile birlikte kullanmanız gerekir.installvarsayılan olarak özel dosyaları (device files, socket’ler) kopyalamaz. Normal dosyalar için tasarlanmıştır.- Hedef dosya mevcutsa
installonu üzerine yazar (yedek parametresi kullanılmadıkça). Bucpile aynı davranıştır. -ove-gparametreleri root yetkisi gerektirir. Normal kullanıcı olarak çalıştırıldığında bu parametreler görmezden gelinmez, hata verir.installkopyaladığı 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.
