Shell Scripting: Temel Bilgiler ve Örnekler

Şubat 15, 2024
Shell Scripting: Temel Bilgiler ve Örnekler

Shell scripting, bilgisayar sistemlerini otomatize eden güçlü bir programlama biçimidir. Siber güvenlik uzmanları için Unix shell kullanarak shell scripting yapmak, zaman alıcı ve tekrarlayan görevlerin otomatize edilmesini sağlayarak, güvenlik süreçlerini daha verimli bir hale getirme potansiyeline sahiptir. Kompleks atak senaryolarının simülasyonundan, günlük log analizlerine kadar pek çok işlem, shell scriptler aracılığıyla gerçekleştirilebilir.

Shell’in gücü elinizde.

Kabuk kodlaması; Linux, Unix, macOS ve Ubuntu gibi Unix-tabanlı işletim sistemlerinde oldukça yaygındır. Çünkü bu işletim sistemleri, doğal olarak shell scripting’i destekler ve güçlendirir.

Kabuk Betiğine Giriş

Kabuk betiği (shell script), işletim sisteminin kabuk (shell) arayüzü üzerinde otomatik komut dizilerini çalıştırarak görevleri basitleştiren betik dilidir. Betikler, tekrarlanabilir işlemleri otomatize etme atılımı sunar.

Bu tekrar eden komutlardan karmaşık yazılım dağıtımlarına kadar geniş bir yelpazede, shell betikleri bir dizi işlemi tek bir komut dosyasına bağlayarak verimliliği artırmak için kullanılır. Bu da sistem yöneticilerine ve geliştiricilere zaman kazandırmakla kalmayıp, hataları en aza indirir.

Shell scriptler, Linux ve Unix sistemlerinde sıkça tercih edilir çünkü bu sistemleri temel komut seti ile güçlü kılma potansiyeline sahiptirler.

Temel Komutlar ve Sözdizimi

Shell scripting, bash gibi komut satırı kabuklarında kullanılan basit ama güçlü komutlar koleksiyonuna dayanır. Bu komutlar dosya işlemleri, kullanıcı etkileşimi ve işlem kontrolü gibi temel operasyonları kapsar. Her komut, belirli bir görevi yerine getirir ve ardışık olarak bir betikte kullanılabilir.

Özelleştirilebilir yapıları sayesinde, if-then-else, for, while, ve case döngüleri ile koşullu ifadeler ve döngüler oluşturarak, betikler karmaşık iş akışlarına adapte edilebilir. Bu sürecin en önemli parçası ise komutların ve döngülerin doğru bir şekilde sözdizimine uygun yazılmasıdır, böylelikle beklenen performans ve sonuçlar elde edilir.

Shell betiklerindeki hatalar, beklenmedik sistem durumlarına neden olabilir.

Komutların ve kontrol yapılarının azami güvenilirlikte kullanılabilmesi için betiklerin test edilmesi mühimdir. Hataya dayanıklı ve idempotent betikler yazmak, işlemlerinizi stabil ve tahmin edilebilir kılar. Betiklerinizi modülerize etmek ise bakımı kolaylaştırır ve yeniden kullanılabilirliği arttırır. Shell scripting, sistem yönetimi ve otomasyon için vazgeçilmez bir araçtır.

Betik Dosyaları Oluşturma

Shell betiği yazmaya başlamadan önce, betiğin amacını ve işlevlerini net bir şekilde belirlemek gereklidir. Böylece daha etkili ve anlaşılır betikler geliştirilebilir.

  1. Dosya Uzantısını Belirleyin: Genellikle betik dosyaları .sh uzantısı kullanılarak kaydedilir.
  2. İlk Satırı Yazın: Betiğin ilk satırına #!/bin/bash ekleyerek betiğin hangi shell tarafından yürütüleceğini tanımlayın.
  3. Yürütme İzinleri Verin: chmod +x komutu ile dosyaya yürütme izinleri sağlayarak betiğin çalıştırılabilir olmasını sağlayın.
  4. Yorum Satırları Ekleyin: # işareti ile başlayan yorum satırları ekleyerek betiğin amacını ve kod bloklarının işlevini açıklayın.
  5. Komutları ve Kontrolleri Yazın: Gerekli komutları ve koşullu ifadeleri, döngü yapılarını doğru sözdizimiyle sıralayın.Betik dosyasının içeriğini yazarken doğru sözdizimi kullanmak ve komutların anlamını iyi kavramak kritik önem taşır.Verimli bir betik yazmak için, planlama aşamasından itibaren detaylı bir şekilde çalışmak ve süreçleri derinlemesine düşünmek gereklidir. Sistematik bir yaklaşım, kompleks sistemlerde dahi betiğin doğruluğunu ve istikrarını sağlar.

Betiklerde Akış Kontrolü

Shell betiklerinde akış kontrolü, belirli koşullara bağlı olarak farklı komutların yürütülmesine izin veren bir yapıdır. Koşullu ifadelerden (if, elif, else) ve döngülerden (for, while, until) oluşur. Bu yapılar kullanılarak betiğin farklı senaryolarda nasıl davranacağı tanımlanır, böylece programlamanın zorunlu unsuru olan karar verme mekanizmaları betiklere entegre edilmiş olur. Akış kontrol yapıları sayesinde betikler daha esnek hale gelir ve karmaşık görevleri yerine getirebilmek için gerekli koşul ve döngü mantığı sağlanmış olur.

Koşullu İfadeler

Koşullu ifadeler, shell betiklerinin temel yapıtaşlarından biridir. Bu ifadeler sayesinde belirli bir koşul sağlandığında (veya sağlanmadığında) yürütülecek komutlar tanımlanabilir. Örneğin, if [ $VAR -gt 0 ] şeklinde bir ifade ile $VAR değişkeninin sıfırdan büyük olup olmadığı sorgulanır.

Koşullu ifade blokları, genellikle if, elif (else if’in kısaltması), ve else anahtar kelimeleri ile oluşturulur. İfade doğru ise then (), belirli komutlar çalıştırılır; aksi takdirde else () çalışacak alternatif komutlar belirlenir.

Bir ifadenin doğruluğunu kontrol ederken, test komutu [ ] veya [[ ]] kullanılır. Bu komutlar sayesinde sayısal karşılaştırmalar (-eq, -ne, -lt, -le, -gt, -ge), dosya özellikleri (-f, -d gibi) ve dizgi karşılaştırmaları (==, !=) yapılabilir.

Gelişmiş koşullu ifadeler için && (ve), || (veya) gibi mantıksal operatörlerle birden fazla koşul birleştirilebilir. Örnek olarak if [ $VAR -gt 0 ] && [ $VAR -lt 10 ] ifadesi, $VAR değişkeninin 0’dan büyük VE 10’dan küçük olup olmadığını test eder. Böyle bir yapı, betiklerdeki karar verme yeteneğini arttırarak, daha karmaşık koşul bloklarının kurulmasına olanak tanır.

Döngülerin Kullanımı

Shell scripting’de, döngü yapıları bir dizi işlemin belirli şartlara bağlı olarak tekrar tekrar gerçekleştirilmesini sağlar. Özellikle, sürekli değişen veri akışları üzerinde işlem yapmak için kritik öneme sahiptirler.

Örneğin, for döngüsü ile bir dizinin üzerinde iterasyon yapılabilir. while döngüsü ise bir koşul sağlandığı sürece yineleme olanağı sunar.

Döngüler, shell script’lerin temelini oluşturur ve kullanıcıların komutları otomatize etmelerine, büyük veri kümeleri üzerinde işlemler yapmalarına ya da sistem yönetim görevlerini kolaylıkla ve hızla gerçekleştirmelerine izin verir. for döngüsü genellikle sabit bir dizi üzerinde, while döngüsü ise dinamik koşullar altında kullanılır.

Ayrıca, döngülerin iç içe geçirilmesiyle daha karmaşık veri yapıları üzerinde de kontrol sağlanabilir. İç içe döngüler, sistematik yaklaşımlar gerektiren veri işleme görevlerinde, özellikle basit bir işlemin çok farklı parametrelerle tekrarlanmasını gerektirecek senaryolarda önem kazanmaktadır. Örnek vermek gerekirse, bir matrisin satır ve sütunlarını gezmek için iç içe for döngüleri kullanılabilir.

Gelişmiş Shell Komutları

Gelişmiş shell komutları, uzmanların sistemler üzerinde derinlemesine kontroller yapmasını ve kompleks görevleri yerine getirmesini sağlar. Bu komutlar arasında awk betik dilinin güçlü metin işleme özellikleri, sed ile akış düzenleyici olarak metin transformasyonları, grep komutuyla düzenli ifadeler kullanarak metin aramaları, sayısal ve metinsel değerler üzerinde akılcı işlemler gerçekleştiren bc veya karmaşık dosya işlemleri için kullanılan find ve xargs gibi işlevsellikler öne çıkar. Kısacası, bu gelişmiş komutlar sistem üzerinde derinlemesine manipülasyonlar yapmak, veri ayıklama, işleme ve raporlama gibi kritik operasyonları hızlı ve etkin bir şekilde gerçekleştirmek için vazgeçilmezdirler. Shell scripting, siber güvenlik uzmanları için vazgeçilmez bir araçtır. Siber güvenlik alanında uzmanlaşmak isteyenler için sunulan Siber Güvenlik Eğitimi: Sektörde Uzmanlaşın başlıklı yazımızı inceleyebilirsiniz.

Fonksiyon Tanımlama

Shell script’lerde fonksiyonlar, belirli bir görevi yerine getiren kod blokları olarak tanımlanır. Fonksiyonlar, kod tekrarını önlemek ve scriptlerin okunabilirliğini artırmak için kullanılır. Fonksiyon tanımlaması genelde function anahtar sözcüğü ile başlar, ancak bu zorunlu değildir.

Fonksiyonun ismini belirledikten sonra parantez açılır ve kapatılır. Sonrasında süslü parantezler içerisinde fonksiyonun gövdesi yer alır.

Fonksiyonların tanımı yapılırken parametre geçişlerini de dikkate almak gerekir. Shell scriptlerde parametreler, fonksiyona $1, $2, $3 gibi sırasıyla geçirilir ve fonksiyon içinde bu şekilde kullanılırlar.

Uzman bir shell scriptçi, fonksiyonları karmaşık scriptler içerisinde bir araç seti olarak görmeli ve onları uygun şekilde modülarize etmelidir. Özellikle sistem yönetiminde ve otomasyon süreçlerinde, tekrarlanan görevleri fonksiyonlar aracılığıyla modularize etmek, hem kodun bakımını kolaylaştırır hem de bu fonksiyonları farklı scriptlerde tekrar kullanabilmeyi mümkün kılar. Fonksiyonların doğru kullanımı, bir scripti daha etkili, verimli ve tekrar kullanılabilir hale getirir.

Dizin Yönetimi ve İşlemleri

mkdir komutu yeni bir dizin oluşturmak için kullanılır. Böylece scriptler dinamik olarak çalışma ortamını hazırlayabilir.

Dizin içerikleriyle etkileşimde ls, sort, grep gibi komutlar kullanılır; bu komutlar script içerisinden dizinlerdeki dosyaları listelemek, sıralamak ve filtrelere tabi tutmak için vazgeçilmezdir. Öte yandan find komutu, belirli kriterlere göre dosyaları bulmak ve işlemler uygulamak için oldukça güçlü bir araçtır.

Bir shell scripti içerisinde kapsamlı dosya ve dizin yönetimi yapılırken, hatalarla karşılaşmamak için test ya da [ ] komutlarıyla kontrol sağlanmalıdır. Örneğin, bir dosya ya da dizinin var olup olmadığını kontrol etmek, mevcut değilse oluşturmak veya üzerinde değişiklik yapmadan önce izinleri doğrulamak gibi. Bu yaklaşım, robust bir script geliştirme sürecinde olmazsa olmazdır. İleri düzey bir kullanıcının hakim olması gereken chmod, chown, umask veya setfacl gibi komutlar, dosya ve dizin erişim haklarını ve yönetimini kontrol altında tutmak için önemlidir. Shell scripting ile etkili dizin yönetimi ve işlemleri gerçekleştirmek için, Linux’un güçlü komut setini anlamak önemlidir. Detaylı bilgi için Linux Komutları: Başlangıçtan İleri Seviyeye Uzmanlaşma Rehberi yazımıza göz atabilirsiniz.

Gerçek Dünya Betik Örnekleri

Sıkça karşılaşılan bir durum ise zamanlanmış görevlerin yönetimidir. işleri için yazılan scriptler, belirlenen periyotlarda otomatik olarak çeşitli görevleri yerine getirirler. Bu betikler, veri yedeklemelerini planlamak, sistem güncellemelerini düzenli olarak çalıştırmak ya da sunucu log dosyalarını temizlemek için kullanılır. Ayrıca, sistem sağlık durumunu düzenli olarak denetlemek ve hataları raporlamak için de scriptler hayati bir role sahiptir.

Otomasyonun bir diğer örneği, sistem ya da ağ güvenliğini pekiştirmek amacıyla kullanılan betiklerdir. Örneğin, bir güvenlik duvarı kuralları güncelleme scripti, güvenlik politikalarındaki değişiklikleri hızlı ve hatasız bir şekilde uygular. Sızma testi senaryolarında, Nmap ve Metasploit gibi araçların entegre edildiği kapsamlı scriptler, zafiyet taramalarını ve exploit işlemlerini otomatize eder. Bu tür betikler, güvenlik uzmanlarının zamandan tasarruf etmelerini ve tehditlere karşı proaktif davranabilmelerini sağlar.

Sistem Yedekleme Betiği

Veri yedekleme, her IT profesyoneli için kritik bir süreçtir.

Bir sistem yedekleme betiği, otomatik yedekleme görevlerini gerçekleştirmek için tasarlanır ve böylece verilerin düzenli aralıklarla güvenli bir şekilde kopyalanmasını sağlar. Bu betikler, belirlenen bir harici disk ya da ağa bağlı depolama birimi (NAS – Network Attached Storage) üzerine, sistem veya kullanıcı verilerinin kolaylıkla kopyalanmasını mümkün kılar. Önceden tanımlanmış parametreler ve yedekleme stratejileri, sürecin verimliliğini ve güvenilirliğini artırır.

Yedekleme süreci hata toleransına sahip olmalıdır.

Bir yedekleme betiği genellikle rsync, tar, cp, veya scp gibi araçları kullanabilir ve veri bütünlüğünü korumak için md5sum veya sha256sum gibi checksum mekanizmalarından faydalanabilir. İşlemler sırasında alınacak olan loglar, olası arızaların teşhisi ve izlenmesi için önem taşır.

Gelişmiş senaryolarda, betiğin sıkıştırma (compression) ve şifreleme (encryption) işlevlerini de içermesi gerekebilir, özellikle hassas verilerin korunması için. Bu betikler, kuruluşun veri koruma politikalarına uyumlu olacak şekilde yapılandırılmalı ve yedeklemelerin güvenilirliğinin yanında gizliliği ve erişilebilirliği de sağlamalıdır. Yedeklerin düzenli olarak test edilmesi ve iyileştirme süreçlerinin belirlenmesi, kapsamlı bir yedekleme stratejisinin ayrılmaz bir parçasıdır. Etkili shell scriptleri yazabilen bireyler, siber güvenlik alanında önemli bir avantaja sahiptir. Siber güvenlik uzmanlığı hakkında daha fazla bilgi için Siber Güvenlik Uzmanlığı Nedir? yazımızı okumanızı öneririz.

Otomatik Raporlama

Otomatik raporlama, karmaşık ağ yapısında sistem sağlığı, güvenlik ihlalleri, performans ölçümleri gibi kritik bilgilerin düzenli olarak izlenmesi ve raporlanmasını sağlar. Bu süreç, etkin bir izleme çözümü oluşturarak olası problemlerin proaktif şekilde ele alınmasına katkıda bulunur.

Bu tür raporlar genellikle zamanlanmış görevler (cron jobs) aracılığıyla otomatikleştirilir.

Raporlama betikleri, sistem günlüklerinden (logs) veri toplama, veritabanı sorgulama gibi işlemleri yerine getirir. Bu işlemler sırasında kullanılan komutlar ve döngüler (loops), veri madenciliği ve analizi için hayati önem taşır.

Bir raporlama betiği, elde edilen ham verileri işleyerek anlamlı ve okunabilir raporlar üretme kapasitesine sahip olmalıdır. Örneğin, awk, sed, grep gibi araçlarla metin işleme, sort, uniq komutlarıyla veri sıralama ve özetleme işlemleri gerçekleştirilebilir.

Siber güvenlik açısından, otomatik raporlama, sistemin güvenlik durumuna ilişkin zamanında bilgilendirme sunarak güvenlik açıklarının hızla tespit edilmesine ve gerekli önlemlerin alınmasına olanak tanır. Ayrıca, ilgili kişi ve departmanlara güvenlik meselelerini düzenli olarak bildirir ve farkındalığı arttırır.

Son olarak, etkin bir otomatik raporlama mekanizması siber saldırı risklerini azaltmada kritik bir rol oynar. Akıllıca hazırlanmış betikler, güvenlik olaylarını kaydeden ve ilgili kişilere alarm olarak gönderen uyarı sistemleri oluşturabilir, bu da organizasyonların proaktif karşılık verme yeteneklerini pekiştirir.

Faruk Ulutaş

Faruk Ulutaş, siber güvenlik alanında derinlemesine bir uzmanlıkla donanmış bir bilgisayar mühendisidir. Kapsamlı programlama diline hakimiyeti ve geniş tecrübesi ile çeşitli siber güvenlik projelerinde yer alıp başarılı sonuçlar elde etmiştir. Çeşitli hackathon, kodlama maratonları ve Capture The Flag (CTF) yarışmalarında, hem yurt içinde hem de yurt dışında, gösterdiği üstün performansla sıkça ön plana çıkmıştır. Ayrıca, küresel ölçekte faaliyet gösteren bazı büyük şirketlerin siber güvenlik sistemlerinde kritik güvenlik açıklıklarını başarıyla belirlemiştir. Üstlendiği projelerde kullanıcı güvenliğini sağlamak ve siber saldırılara karşı koymak için çözüm üretme konusunda büyük bir yetenek sergilemiştir. Ulutaş, CyberSkillsHub üzerindeki rolü ile birlikte, öğrencilere kendi deneyimlerini ve bilgilerini aktararak siber güvenlik konusunda yeteneklerini geliştirmelerine yardımcı olmayı hedeflemektedir.