Bash script, Unix’de mevcut olan en popüler programlama araçlarından biridir.
Açılımı Bourne Again Shell‘dir. Bütün Linux kullanıcıları veya Sistem Yöneticileri için güçlü bir araçtır.
Bash, Bilgisayara talimat vermemizi ve onunla iletişim kurmamızı sağlayan kabuktur. Bu sayede bilgisayar ondan istediğimiz şeyleri yapacaktır.
Shell script de işletim sistemine neyi ne sıklıkla yapacağını söylemek için tasarlanan komut satırı destekli programdır. Birden fazla görev tanımlaması yapılabilir.
O zaman Bash Script sayesinde aynı anda birden fazla komutu çalıştırmamızı sağlayan komut dosyalarıdır.
Hadi hep beraber komutları öğrenmeye başlayalım.
Dosya ve Klasör Listeleme İşlemleri
Parametresiz Kullanımlar
- ls: Aktif klasördeki dosya ve klasörleri listeler.
- ls Desktop: Masaüstü klasöründeki dosya ve klasörleri listeler
- ls .. : Bir üst klasörün içeriğini listeler
- ls ../*.txt : Bir üst dizinde uzantısı txt olan dosyaları listeler
- ls ~ : Home dizininin içeriğini listeler
- ls hash.txt : Bulunan dizinde hash.txt olan dosyayı listeler
- ls a??b?.html: 5 Harfli olan ilk harfi a 4. harfi b olan ve uzantısı html olan dosyaları listeler
Parametreli Kullanımlar
- ls -l Desktop : Masaüstündeki tüm dosya ve klasörleri detaylı olarak listeler
- ls -a : Gizli olan dosya ve klasörlerin gösterilmesini sağlar.
- ls -R : İlgili olan klasörün alt dizinleriyle beraber listelenmesini sağlar
- ls -lh : Dosyaları boyutlarıyla beraber listeler
- ls -laRh Documents : Belgeler klasöründeki tüm dosya ve klasörleri, alt dizinleri de dahil olmak üzere (gizli olanlarda dahil) boyutlarına göre listeler.
Dizinler Arası Gezinme
- cd Desktop : cd dizinler arasında geçiş yapmak istediğimiz zaman kullanacağımız komuttur. Burada aktif olarak bulunduğumuz dizinden Desktop dizinine geçiş yapıyoruz.
- cd /Desktop/berat/ : Eğer klasörün başına / koyarsak kök dizinde arayacaktır aksi halde aktif dizinde arama yapacaktır. Burada root dizininin altındaki, Dekstop dizininin altındaki, berat dizinine gidiyoruz.
- cd .. : Bir üst dizine geçiş yapar
- cd “/Desktop/Deneme klasörü” : Bütün linux komutlarında geçerli olan bir dizin ismi boşluklu ve birden fazla kelimeden oluşuyorsa gidilecek yol çift tırnak işareti arasında verilir.
- cd /Desktop/deneme/.. : deneme dizinine girer sonra da bir üst dizine gelerek Desktop dizinini aktif eder.
Dizin Oluşturma ve Silme İşlemleri
- mkdir berat : berat isminde bir dizin oluşturur.
- mkdir -p berat/berat2 : berat dizinini oluşturur, onun içine de berat2 dizinini oluşturur. Yani alt dizinli dizin oluşturmak için -p parametresiyle beraber mkdir’ i kullanırız.
- rmdir berat : berat dizinini siler
- rmdir -p berat/berat2 : -p parametresi belirtilen yolu baştan aşağı siler. Burada berat2 yi siler berat klasörünün içeriğini de siler ama berat dizini kalır.
- rmdir * : Boş olan tüm dizinleri siler
- rmdir b?* : b harfi ile başlayan ikinci harfi ne olursa olsun önemli olmayan tüm dizinleri siler.
Dosya Oluşturma ve Silme İşlemleri
- touch berat : berat adında dosya oluşturur
- touch berat_furkan : berat_furkan isimli dosya oluşturur.
- touch “berat furkan” : berat furkan isimli dosya oluşturur.
- touch “berat” “furkan” : Tek seferde birden fazla dosya oluşturulabilir.
- rm “berat” : berat dosyasını silme
- rm “berat” “furkan” : berat ve furkan dosyalarını silme
- rm -r “berat” : Alt dosyalarla birlikte içi dolu yada boş olsun ne kadar dosya varsa siler
- rm -d “berat” : belirtilen boş dizinleri siler
Dosya/Dizin Kopyalama, Taşıma ve İsim Değiştirme İşlemleri
Kopyalama
- cp kaynak hedef şeklinde kullanılır
- cp “/Desktop/berat.txt” /Documents/furkan/ : Masaüstündeki berat.txt dosyasını Documents’ in içindeki furkan dizinine kopyalama komutudur.
Dosya Taşıma
- mv kaynak hedef şeklinde kullanılır.
- mv “/Desktop/berat.txt” /Documents/furkan/ : Masaüstündeki berat.txt dosyasını Documents’ in içindeki furkan dizinine taşıma
İsim Değiştirme
- mv /Desktop/berat.txt “berat furkan.txt” : berat.txt isimli dosyanın ismini berat furkan.txt olarak değiştirdik.
Dosya/Dizin’ lerin Sahiplik ve Grup Bilgilerini Değiştirmek
Dosya Kullanıcısının Sahibini Değiştirmek
- sudo chown berat deneme.txt : deneme.txt dosyasının kullanıcısı artık berat oldu
Dosya Grup Sahipliğinin Değiştirilmesi
- sudo chgrp berat deneme.txt : deneme.txt dosyasının grup sahipliği artık berat oldu.
- sudo chown -R berat deneme : deneme klasörü ve içindekilerin hepsinin kullanıcısı berat oldu
- sudo chgrp -R berat deneme: belirtilen klasör ve içindekilerin hepsinin grup kullanıcısı berat oldu.
Komut Yönlendirme
Bu komutlar bir komutun sonucunu ekran yerine bir dosyaya yazma ve bir komuta argüman olarak bir metin dosyası vermektense başka bir komutun çıktısını vermeyi sağlar
- ls > deneme.txt : listelemenin sonucunu deneme.txt’ nin içine yazar. Eğer deneme.txt dosyasının içi doluysa silinir ve listelemenin sonucu yazar.
- ls >> deneme.txt : listelemenin sonucunu deneme.txt dosyasının sonuna ekleyerek yazar var olan içeriği silmez.
- ls -z 2>deneme.txt : z parametresi ls’ ye ait bir parametre değil. Bu nedenle oluşan hata kodunu deneme.txt’ nin içeriğini silerek yazar.
- ls -z 2>>deneme.txt : z parametresi ls’ ye ait bir parametre değil. Bu nedenle oluşan hata kodunu deneme.txt’ nin sonuna ekleyerek yazar.
- | (pipe) işareti : Bu işaret sayesinde bir komutun çıktısını başka bir komuta argüman olarak vermemize yarar. Bu sayede gereksiz dosya oluşturma işlemlerinden kurtulmuş oluruz.
- ls berat | grep furkan : Bu komut ls berat komutunun çıktısında furkan kelimesini arayacak ve bulunan satırları listeyecek.
Metin Dosyaları ile İşlem Yapmak
- cat > berat : yazmak istediğimiz metni berat dosyasının içine yazarız ve ctrl+d ile kaydedip çıkarız.
- cat berat berat2 : berat ve berat2 dosyalarını ekrana basar
- cat berat berat2 > beratfurkan : berat ve berat2 dosyalarını beratfurkan dosyasının içinde birleştirmemize yarar
- cat berat berat2 | grep ‘merhaba’ : berat ve berat2 dosyalarının içeriğinde merhaba kelimesi olanları ekrana yazar.
- more /var/log/syslog : more komutu cat ile aynıdır içeriği ekrana yazdırır. Ancak cat den farkı ekrana sığmayacak kadar çok satır olduğunda boşluk tuşu ile kaydırma olanağı sağlar.
- head /Desktop/berat.txt : berat.txt dosyasında ilk 10 satırı ekrana yazdırır.
- head -n 5 /Desktop/berat.txt : berat.txt dosyasının ilk 5 satırını ekrana yazdırır.
- tail /Desktop/berat.txt : head’ in tam tersidir. Bu da sondan 10 satırı ekrana yazdırır.
- tail -n 5 /Desktop/berat.txt : berat.txt’ nin son 5 satırını ekrana yazdırır.
- grep : Metin dosyalarında arama yapmamıza yarar.
- grep ‘merhaba’ berat.txt : berat.txt dosyasında merhaba kelimesini arar.
Kullanıcı İşlemleri
- sudo adduser berat : berat adında yeni bir kullanıcı oluşturur.
- sudo adduser -G Grup_adı Kullanıcı_adı : Kullanıcı eklerken grubunu da belirler. Burada araya virgül koyarak birden fazla gruba da ekleme yapabiliriz.
- sudo deluser berat : berat kullanıcısını siler
- sudo less /etc/passwd : Sistemde kayıtlı tüm kullanıcıları listeler
- sudo passwd -l berat : berat kullanıcısını kilitler ve berat kullanıcısı oturum açamaz
- sudo passwd -u berat : berat kullanıcısının kilidini açar.
Kullanıcı Grup İşlemleri
- sudo addgroup Grup_adı : Yeni grup ekleme
- sudo delgroup Grup_adı : Grup silme
- sudo getent group : Tüm grupları listeleme
- sudo usermod -a -G Grup_adı Kullanıcı_adı : Belirtilen kullanıcıyı, belirtilen gruba ekleme
- sudo groups berat : berat kullanıcısı hangi gruplara ekli onu listeler
- sudo id berat : berat kullanıcısı hangi grupta ekli onu gösterir. Burada groups dan farklı olarak id gösterimli olarak gösterir.
- sudo passwd berat : berat kullanıcısının parolasını değiştirme komutudur.
Servis Yönetimi İşlemleri
- service –status-all : Tüm servisleri listeler
- sudo systemctl stop Servis_Adı : Belirtilen servisi durdurur.
- sudo systemctl start Servis_Adı : Belirtilen servisi başlatır.
- sudo systemctl restart Servis_Adı : Belirtilen servisi yeniden başlatır.
- sudo systemctl status Servis_Adı : Belirtilen servisin durumunu kontrol eder
- Yukarıdaki yöntemlere alternatif olan yötem:
- sudo service Servis_Adı stop : Belirtilen servisi durdurur.
- sudo service Servis_Adı start : Belirtilen servisi başlatır.
- sudo service Servis_Adı restart : Belirtilen servisi yeniden başlatır.
- sudo service Servis_Adı status : Belirtilen servisin durumunu kontrol eder.
Zamanlanmış Görevler
- /etc/crontab : Dosyanın yeri
- /etc/cron.daily/ : Günlük çalışacaklar klasörü
- /etc/cron.hourly/ : Saatlik çalışacaklar klasörü
- etc/cron.monthly/ : Aylık çalışacaklar klasörü
- etc/cron.weekly/ : Haftalık çalışacaklar klasörü
Sistem Değişkenleri (System Variables)
- echo “$BASH” : Kullanılan shell’in yolunu verir.
- echo “$SHELL” : Yukardaki komut ile aynı görevi görür. Kullanılan shell kabuğunun yolunu verir.
- echo “$BASH_VERSION” : Kullanılan bash’ in versiyon bilgisini verir.
- echo “$HOSTNAME” : Bilgisayarın adını verir
- echo “$HOME” : Aktif olan kullanıcının home dizini yolunu verir.
- echo “$PWD” : Bulunulan aktif dizinin tam yolunu verir
- echo “$USER” : Açık olan kullanıcının kullanıcı adı bilgisini verir.
- echo “$LANG” : Bilgisayardaki aktif olan dilin bilgisini verir.
- echo “$TERM” : Mevcut olan terminalin tipini verir. Örneğin xterm-256color
- echo “$OSTYPE” : İşletim sisteminin türünü belirtir. Örneğin linux-gnu
Kullanıcı Değişkenleri (User Variables)
- Değişkenler sayısal bir değer ile başlayamaz. Örneğin 5deger gibi.
- İki kelimelik değişken oluşturuluyorsa araya boşluk ya da nokta konulamaz. Alt tire (_) kullanılmalıdır. Örneğin deger_1 gibi yada deger1 gibi oluşturulmalıdır.
- İsimlendirme yaparken türkçe karakterler kullanılmamalıdır.
- int tanımlamak için:
- yas=32
- string tanımlamak için:
- kullanici_adi=’berat’
- Sistem değişkenlerinden bir tanesinin sonucunu, değişkene girdi olarak verilmesi için:
- MevcutDosyaYolu=$PWD
Argümanlar
- $@ : Dizi olarak içerisindeki elemanları kullanma imkanı verir
- $* : Dizi olarak kullanma imkanı vermeden değerleri olduğu gibi yazar.
- $# : Alınan parametrelerin sayısını verir.
- Parametreleri $1, $2 şeklinde tanımlarsak index 1′ den başlar, eğer $@ ile parametre alırsak sıfırdan başlar.
- echo $@ : Alınan tüm parametre verilerini yazdırır.
- girilen_degerler=(“$@”) : Dizi olarak parametreleri alıp kullanmak
- echo ${girilen_degerler[1]} : dizinin 1 numaralı elemanını getirmesini istedim.
Değişkenlere Dışarıdan Veri Almak
Değişkene Veri Almak
- read ad
- echo “Girilen isim: ” $ad
Birden Fazla Değişkene Veri Almak
- read ad,soyad
- echo “Adı ve Soyadı: ” $ad, $soyad
Dizi Şeklinde Veri Almak
- read -a degerler
- echo ${degerler[0]}, ${degerler[1]}
Tek Satırda Mesaj Gösterip Veri Girişi Sağlamak
- read -p “Adiniz: ” ad
- read -p “Soyadiniz” soyad
- echo “Adiniz ve Soyadiniz: ” $ad, $soyad
- Veri alınması sırasında eğer girilen değerin görünmesini istemiyorsak -s parametresi eklenmelidir.
Girilen Bütün Verileri Alma
- read
- echo $REPLY
- Burada girilen tüm değerler tek bir çıktı şeklinde yazdırılır.
If Kontrol Yapısı
Tek Koşullu Durumlar
if koşul
then
#Bu alanda koşulun gerçekleşmesi halinde yapılacak işlemler yazılır
else
#Bu alanda da koşulun gerçekleşmemesi durumunda yapılacak işlemler yazılır
fi
Birden Fazla Koşul Durumu
if koşul1
then
Koşul1′ in gerçekleşmesi durumunda yapılacak işlemler buraya yazılır
elif koşul2
then
koşul2′ nin gerçekleşmesi durumunda yapılacak işlemler buraya yazılır.
else
Hiçbir koşulun gerçekleşmemesi halinde buraya yapılacak işlemler yazılır.
fi
Koşul Kuralları
Integer Değerleri Karşılaştırma Koşulları
- -eq : if [ “$a” -eq “$b” ] : Eğer eşit ise durumu (is equal to)
- -ne : if [ “$a” -ne “$b” ] : Eğer eşit değil ise durumu (is not equal to)
- -gt : if [ “$a” -gt “$b” ] : Eğer büyük ise durumu (is greater than)
- -ge : if [ “$a” -ge “$b” ] : Eğer büyük veya eşit ise durumu (is greater than or equal to)
- -lt : if [ “$a” -lt “$b” ] : Eğer Küçük ise durumu (is less than)
- -le : if [ “$a” -le “$b” ] : Eğer Küçük veya eşit ise durumu (is less than or equal to)
- < : if ((“$a” < “$b”)) : Küçük durumu
- <= : if ((“$a” <= “$b”)) : Küçük eşit durumu
- > : if ((“$a” > “$b”)) : Büyük durumu
- >= : if ((“$a” >= “$b”)) : Büyük eşit durumu
String Değerleri Karşılaştırma Koşulları
- = : if [ “$a” = “$b” ] : Eğer eşit ise durumu
- == : if [ “$a” == “$b” ] : Eğer eşit ise durumu
- != : if [ “$a” != “$b” ] : Eğer eşit değil ise durumu
- < : if [[ “$a” < “$b” ]] : Eğer küçükse durumu
- > : if [[ “$a” > “$b” ]] : Eğer büyükse durumu (Küçük veya büyüktür şartlarında alfabetik olarak karşılaştırılır)
- -z : if [ -z “$String” ] : Eğer değer boş ise durumu
- -n : if [ -n “$String” ] : Eğer değer boş değil ise durumu
AND ve OR Operatörleri
AND ve OR operatörlerini birden fazla şartı aynı anda karşılaştırmak için kullanırız.
- if [[ “$kodblogu1” && “$kodblogu2” ]] : Burada şartın gerçekleşmesi için her iki kod bloğunun da true değer döndürmesi gereklidir.
- if [[ “$kodblogu1” || “$kodblogu2” ]] : Burada şartın gerçekleşmesi için iki kod bloğundan birinin true değer döndürmesi gereklidir.
Diziler
isimler = (‘berat’ ‘furkan’ ‘yunus’)
- echo “${isimler[@]}” : Tüm dizi elemanlarını ekrana basar
- echo “${!isimler[@]}” : Tüm dizinin index sırasını gösterir
- echo “${#isimler[@]}” : Toplam dizi uzunluğunu verir
- echo “${isimler[1]}” : İndex numarası 1 olan elemanı ekrana yazdırır
- isimler[3]=’yusuf’ : 3 numaralı indise yusuf’ u ekliyoruz
- isimler[0]=’zeynep’ : 0. indisteki berat elemanını, zeynep ile değiştiriyoruz
- unset isimler[2] : 2.indisteki veriyi ve indeks numarasını siler
While Döngüsü
a=0
while (($a <= 10))
do
echo $a
((a++))
sleep 1
done
Burada 0 dan 10 a kadar olan sayıları while döngüsü aracılığı ile ekrana yazdırmış olduk.
For Döngüsü
Standart For Döngüsü Kullanımı
for (( i=0;i<=10;i++ ))
do
echo $i
done
Burada 0 dan 10 a kadar olan sayıları for döngüsü aracılığı ile ekrana yazdırmış olduk.
Linux Terminal Komutları ile For Döngüsü Kullanımı
for i in "ls -l" "pwd"
do
echo "Komut : $i"
$i
done
Break ve Continue Kullanımı
Break Kullanımı
Geçerli döngüyü sonlandırır ve program kontrolünü, sonlandırılan döngüyü izleyen komuta iletir.
for (( i=0;i<=10;i++ ))
do
if [ $i -gt 5]
then
break # Döngüyü sonlandırır.
fi
echo $i
done
Continue Kullanımı
Geçerli yineleme için çevreleyen döngünün gövdesi içindeki kalan komutları atlar ve program kontrolünü döngünün bir sonraki yinelemesine geçirir.
for (( i=0;i<=10;i++ ))
do
if [ $i -eq 2 -o $i -eq 6 ]
then
continue # Döngünün başına döner
fi
echo $i
done
Until Kullanımı
Komutlar yürütülmeden önce koşul değerlendirilir. Koşul false olarak değerlendirilirse komutlar yürütülür. Aksi takdirde, koşul doğru olarak değerlendirilirse döngü sonlandırılır ve program kontrolü aşağıdaki komuta iletilir.
i=1
until (( $i >= 9 ))
do
echo $i
((i++))
done
Fonksiyon Kullanımı
Girilen sayının yarısını alan bash script fonksiyonunu yazalım.
read -p "Sayı giriniz: " sayi
function Yarisini_Al(){
echo "Sonuç: $((sayi/2))"
sleep 1 # Bir saniye bekletme yapıyor.
}
Yarisini_Al
Aritmetik İşlemler
a=20;
b=5;
c=10;
echo $(( a + b )) # Toplama
echo $(( a – b )) # Çıkarma
echo $(( a * b )) # Çarpma
echo $(( a / b )) # Bölme
echo $(( a % b )) # Mod Alma
echo $(( c++ )) # Sayıyı bir attır.
echo $(( c– )) # Sayıyı bir azalt.
FLOAT (Virgüllü Değerlerle Çalışmak)
echo ” $a + $b ” | bc
echo ” $a – $b ” | bc
echo ” $a * $b ” | bc
echo ” $a / $b ” | bc
echo ” $a % $b ” | bc
# Virgülden sonra gösterilecekleri scale=noktasayisi; ekleyerek buluruz.
echo “scale=2; $a % $b ” | bc
Dosya İşlemleri
-f : dosya var
-s : dosya boş değil
-r : dosya okunabilir
-w : dosyaya yazılabilir
-x : çalıştırılabilir dosya
-d : dizin
dosyaadi=$1
if [ -d $dosyaadi ]
then
echo “Dosya var”
else
echo “Dosya yok”
fi
Kullanımı ile ilgili bir örnek yapalım:
echo -e "Aranacak dosya ismini girin: \c"
read dosya_adi
if [ -f $dosya_adi]
then
echo "Dosya vardır"
else
echo "İsmini girdiğiniz dosya bulunmamaktadır, yeni oluşturulacak. Mesajı yazıp çıkmak için ctrl + d kombinasyonunu kullanınız."
cat >> $dosya_adi
fi
Bash Script Nasıl Kullanılır ve Çalıştırılabilir
- .sh uzantılı dosya oluşturun. İsmi de berat.sh olsun.
- En başına #!/bin/bash ekleyin
- Normalde terminale yazacağımız komutları buraya girelim. Yani yazacağımız komutları buraya girelim kaydedelim.
- Komut satırını açalım ve berat.sh ‘ a yetki verelim. chmod u+x berat.sh diyelim
- Artık dosyamızı istediğimiz zaman çalıştırabiliriz.
- Çalıştırmak için : ./berat.sh diyerek çalıştırabiliriz.
Örnek- MAC Changer(MAC Değiştirici) Bash Script
#!/bin/bash
#Otomatik MAC Changer komut dosyası
wlanDOWN=$(ifconfig wlan0 down)
change_mac=$(macchanger -r wlan0)
wlanUP=$(ifconfig wlan0 up)
verify=$(macchanger --show wlan0)
network_connect=$(sudo service network-manager start)
progress[0]="-"
progress[1]="\\"
progress[2]="|"
progress[3]="/"
printf "%s\n" "$wlanDOWN"
printf "%s\n" "$change_mac"
printf "%s\n" "$wlanUP"
printf "%s\n" "$verify"
printf "%s\n" "To return to permanent mac address type 'macchanger --permanent <interface name>
printf "%s\n" "$network_connect"
echo -n "[Reconnecting ] ${progress[0]}"
for i in "${progress[@]}"
do
(echo -ne "\b$i" & sleep 1 & wait)
done
printf "%s\n"
echo "You are now connected"
echo "Ready to spoof IP Addr: "
Artık dosyayı .sh uzantısı ile kaydedip çalıştırdığınız zaman MAC adresinizi değiştirebilirsiniz 🙂
Bir siber güvenlik uzmanının suyu ve havası Linux işletim sistemidir. Hem Linux işletim sistemi hem de Programlama dillerine hakim personellerimiz ile siz de kişisel olarak ya da kurumunuzdaki personellerinizin Linux konusunda daha çok deneyim kazanmasını ve daha da kendini geliştirerek linux bash script dosyaları yazabilmesini istiyorsanız bizimle iletişime geçebilir ve eğitimler alabilirsiniz.
Diğer yazılarımda görüşmek üzere. Bizi takip etmeye devam edin…

