> Unutmamalıyız ki bir çok "shell" komutu, aynı isimli POSIX fonksiyonu kullanılarak yazılmıştır. > "Internal Command" ve "External Command" : "External Command", "/bin" dizini içerisinde bulunan programlardır. "Internal Command" ise, bizim yazdığımız "Bash" programındaki fonksiyonlar gibi düşünülebilir. > "ls -l" komutu ile ekrana çıkan yazıların incelenmesi: "ls -l" komutunu "shell" programı ile çalıştırdığımız zaman, aşağıdaki gibi sonuçlar ekranda belirecektir. Bu sonuçlar, o dizinde bulunan dosyaların detaylarına ilişkindir. -rwxrwxr-x 1 ahmopasa ahmopasa 17128 Kas 17 21:39 wd -rw-rw-r-- 1 ahmopasa ahmopasa 741 Kas 17 21:39 wd.c ^ ^ ^ ^ ^ ^ ^ I II III IV V VI VII Görüldüğü üzere bu bilgiler 7 sütun altında toplanmıştır. Bu bilgilerden, I : İlgili dosyaya, o anki kullanıcının sahip olduğu, erişim hakları. II : İlgili dosyanın yapmış olduğu "hard-link" adedi. III: İlgili dosyanın User ID değeri. Rakamsal karşılığı yine "etc/passwd" dosyası içerisindedir. IV : İlgili dosyanın Group ID değeri. Rakamsal karşılığı yine "etc/passwd" dosyası içerisindedir. V : İlgili dosyanın byte bilgisi. VI : İlgili dosyanın en son değiştirilme tarihi. VII: İlgili dosyanın adı. Sağdan sola doğru olmak üzere, bu bilgileri detaylı bir şekilde incelersek; >> VII: İlgili dosyanın adını belirtmektedir. >> VI : İlgili dosyanın en son değiştirilme tarihini belirtmektedir. >> V : İlgili dosyanın kaç "byte" olduğunu belirtmektedir. >> IV : İlgili Dosyanın Grup ID bilgisini belirtmektedir. UNIX/Linux sistemlerinde dosya oluşturan sadece bir adet POSIX fonksiyonu vardır ki onun adı da "open". Kendisi, arka planda, "sys_open" isimli sistem fonksiyonunu çağırmaktadır. İş bu "open" fonksiyonunu çağıran şey sonuçta bir proses olduğu için, yeni oluşturulan dosyanın Grup ID bilgisi iki farklı şekilde atanabilir: >>> İlki, bu dosyayı meydana getiren prosesin Etkin Grup ID bilgisinin, dosyaya aktarılması. >>> İkincisi ise ilgili dosyanın içinde bulunduğu dizinin Grup ID bilgisinin, yeni oluşturulan bu dosyaya aktarılması. Varsayılan ayar olarak Linux sistemlerinde birincil yaklaşım sergilenmektedir fakat bir takım ayarlamalar ile ikincil yaklaşımın sergilemesi de mümkündür. Son olarak DOSYALAR BİRDEN FAZLA GRUPLARA DAHİL OLAMAZLAR. >> III : İlgili dosyanın Kullanıcı ID bilgisini belirtmektedir. Grup ID bilgisinin elde edilişinden farklı olarak, burada, "open" fonksiyonunu çağıran prosesin Etkin Kullanıcı ID bilgisi, yeni oluşturulan dosyaya aktarılmaktadır. >> II : İlgili dosyanın sahip olduğu "hard-link" sayısı. Bu konunun detaylarına ilerleyen dönemlerde değinilecektir. >> I : Bu kısma dosyanın erişim hakları denmektedir. 10 adet karakterden meydana gelmektedir. Dosya açılmadan evvel öncelikle erişim haklarının kontrolü yapılmaktadır. Yani prosesimizin bir dosya üzerinde yazma hakkı yoksa dosyayı hiç açamıyoruz. İlk aşama olarak, dosyaya erişmeye çalışan prosesin sadece Etkin Kullanıcı ID bilgisinin "0" olup olmadığına bakılıyor. Geleneksel olarak Etkin Kullanıcı ID bilgisi sıfır olan prosesler POSIX standartlarında "root", "super-user" vb. isimler ile anılmakta. Eğer ilgili ID sıfır ise başka hiç bir kontrol yapmadan bütün yetkiler prosese veriliyor. >>> "sudo" kelimesini program isimlerinin başına yazarak bir program çalıştırdığımız zaman, yeni oluşturulan bu prosesin Etkin Kullanıcı ID bilgisi sıfıra oluyor. Örneğin, aşağıdaki komutu "shell" programı ile çalıştırdığımızda, Etkin Kullanıcı ID değeri sıfır olan yeni bir "Bash" prosesini hayata getirmiş oluruz. "sudo /bin/bash" Bundan dolayıdır ki "id" komutunu "shell" üzerinde çalıştırırsak, aşağıdaki çıktıyı elde ederiz; "uid=0(root) gid=0(root) groups=0(root)" Bu da demektir ki "shell" ("Bash") içerisinde yeni bir "shell" programı çalıştırıyoruz. İçerideki "Bash" prosesinin Etkin Kullanıcı ID değeri sıfır, dışarıdaki "Bash" prosesinin Etkin Kullanıcı ID değeri ise "ahmopasa" şeklindedir. İçerideki "Bash" üzerinden oluşturacağımız bütün dosyaların Kullanıcı ID bilgileri ve Grup ID bilgileri artık sıfır değerinde olacaktır. Eğer "exit" komutunu çalıştırırsak, önce içerideki "Bash" prosesi sona erecek ve böylelikle "Bash" prosesine geri döneceğiz. Eğer prosesin Etkin Kullanıcı ID değeri "0" değil ise, bu kısımdaki karakterler şu anlamlara gelmektedir; >>> En soldaki karakter, erişim haklarından ziyade, ilgili dosyanın türü hakkında bilgi vermektedir. Bu karakter şu aşağıdaki karakterlerden birisi olabilir; >>>> "-" karakteri ise, ilgili dosyanın "regular file" olduğunu belirtir. >>>> "d" karakteri ise, ilgili dosyanın bir dizin olduğunu belirtir. Yani "directory", anlamına gelmektedir. >>>> "p" karakteri ise, ilgili dosyanın bir "pipe folder" olduğunu belirtir. >>>> "s" karakteri ise, ilgili dosyanın bir "socket folder" olduğunu belirtir. >>>> "l" karakteri ise, ilgili dosyanın bir "symbolic link" olduğunu belirtir. >>> Geri kalan dokuz karakter ise üç gruba ayrılmıştır: >>>> Soldaki ilk üçlü parçaya "owner" denmekte olup, sahiplik bilgisinin saklandığı yerdir. O an dosyayı kullanacak olan prosesin Etkin Kullanıcı ID bilgisi ile o dosyanın Kullanıcı ID bilgisinin aynı olması durumudur. Eğer ID bilgileri eşit ise geriye kalan diğer üçlü parçalara bakılmıyor ve bu alandaki hakları sorgulamaya başlıyor. Eğer ID bilgileri farklı ise ikinci üçlü parçaya geçiyor. >>>> Soldan ikinci üçlü parçaya "group" denmekte olup, grup hakkında bilgi vermektedir. Eğer "owner" grubundaki ID sorgulaması başarısız olmuş ise sıra bu parçaya geçiyor ve iş bu dosyanın Grup ID bilgisi ile bu dosyada işlem yapacak prosesin Etkin Grup ID bilgisini karşılaştırıyor. Her iki ID bilgisinin de aynı olması durumunda, son üçlü gruba hiç bakmadan, sadece bu gruptaki hakları sorgulamaya başlıyor. >>>> Soldan üçüncü üçlü parçaya ise "other" denmekte olup, ne "owner" ne de "group" dahilinde olanlar hakkında bilgi vermektedir. Bu dosyaya herhangi bir proses tarafından erişildiğini varsaymakta ve buradaki hakları sorgulamaya başlamaktadır. >>>> Her bir grup kendi içerisinde üç karakter barındırmaktadır. Bu karakterlerden en soldaki genellikle "r", ortadaki "w" ve en sağdaki ise genelde "x" karakteri alır. "-" olması durumunda ise o hakkın verilmediği anlamına gelmektedir. Aşağıda bu konuya ilişkin örnek verilmiştir: * Örnek 1, Aşağıdaki hakları inceleyelim; "-rw-rw-r--" Yukarıdaki hakları sunan dosyanın ID değerleri aşağıdaki gibi olsun; Kullanıcı ID bilgisi: kaan Grup ID bilgisi: study Bu dosyada yazma yapacak prosesin ID değerleri de aşağıdaki gibi olsun; Etkin Kullanıcı ID bilgisi: ali Etkin Grup ID bilgisi: test Bu durumda işletim sistemi en sağdaki ilk üç grupta hak sorgulaması yapacak. Çünkü en soldaki tekil karakteri es geçersek ikinci, üçüncü ve dördüncü karakterlere prosesin Etkin Kullanıcı ID bilgisi ile dosyanın Kullanıcı ID bilgisinin eşit olması durumunda bakılacaktı. Örneğimizde böyle bir eşitlik olmadığından beşinci, altıncı ve yedinci karaktere bakılacak. Fakat buraya bakılabilmesi için ilgili dosyanın Grup ID bilgisi ile işlem yapacak prosesin Etkin Grup ID bilgisinin eşit olması gerekiyor. Bizim örneğimizde böyle bir eşitlik olmadığından, en sağdaki üçlü grupta hak incelemesi yapılacak. Bu durumda "r" karakteri "read-only", "w" karakteri "write" ve "x" karakteri ise çalıştırılabilir bir dosya ise çalıştırma yetkisi vermektedir. Bizim örneğimizdeki karakterler "r--" olması hasebiyle, ilgili proses dosyamız üzerinde SADECE okuma yapabilir. * Örnek 2, Aşağıdaki hakları inceleyelim; "-rw-rw-r--" İlgili dosyanın Kullanıcı ID bilgisi "kaan", Grup ID bilgisi ise "study" olsun. Bu dosyada yazma yapacak prosesin Etkin Kullanıcı ID bilgisi "ali", Etkin Grup ID bilgisi ise "study" olsun. En soldaki karakteri yine es geçiyoruz. Devamında gelen ilk üçlü karakter grubunu, dosyanın Kullanıcı ID bilgisi ile prosesin Etkin Kullanıcı ID bilgisi aynı olmadığı için, es geçiyoruz. Fakat dosyanın Grup ID bilgisi ile prosesin Etkin Grup ID bilgisi aynı olduğu için ikinci üçlü karakter üzerinde hak sorgulaması yapılacaktır. Bu durumda beşinci, altıncı ve yedinci karakter incelenecektir. Yani "rw-" üçlüsüne bakılacaktır. Burada "read-only" ve "write" yetkileri verildiğinden, prosesimiz ilgili dosyada YAZMA işlemi ve OKUMA işlemi yapabilecektir. >>> Çok karşılaşılan bir arayüz ise ilgili dosyanın "-rw-r--r--" şeklinde erişim haklarının olması durumudur. >>> Proseslerin "supplementary" grupları da mevcut olduğundan, bu grupların Etkin Grup ID bilgileri de dosyaların Grup ID bilgileri ile karşılaştırılır. Aşağıda bu konuya ilişkin örnekler verilmiştir: * Örnek 1, "ls -l" komutunu "shell" programında çalıştırdığımız zaman aşağıdaki yazılar ekrana çıkmaktadır; total 24 -rwxrwxr-x 1 ahmopasa ahmopasa 17128 Kas 17 21:39 wd -rw-rw-r-- 1 ahmopasa ahmopasa 741 Kas 17 21:39 wd.c Bu durumda gerek "wd" gerek "wd.c" dosyalarının Kullanıcı ID bilgileri ve Grup ID bilgileri "ahmopasa" şeklindedir. Yine "id" komutunu çalıştırdığımız zaman aşağıdaki yazılar ekrana çıkmaktadır; uid=1000(ahmopasa) gid=1000(ahmopasa) ... Buradaki ID değerleri, ilgili prosesin Etkin ID değerleridir. Yani Etkin Kullanıcı ID, Etkin Grup ID vs. Buradaki Etkin Kullanıcı ID ve Etkin Grup ID bilgileri ise "etc/passwd" dosyasından alınmıştır. Buna göre bizler "shell" üzerinden "Vim" programını çalıştırsak, hayata gelen "Vim" prosesinin de Etkin Kullanıcı ID ve Etkin Grup ID değerleri yine "ahmopasa" olacak. Bu "Vim" prosesi ile yukarıdaki "wd.c" dosyası üzerinde işlem yapmak istediğimiz vakit, prosesin Etkin Kullanıcı ID değeri ile dosyanın Kullanıcı ID değeri birbirine eşit olduğundan, dosyanın sahibi gibi muamele göreceğiz ve soldan ikinci, üçüncü ve dördüncü karakterler üzerinde hak sorgulamasına tabii tutulacağız. Yani "rw-". Bu da demektir ki "Vim" prosesi üzerinden "wd.c" dosyasını okuma ve yazma amacı ile açabiliriz. * Örnek 2, "ls -l /etc/passwd" komutunu "shell" programında çalıştırdığımız zaman aşağıdaki yazılar ekrana çıkmaktadır; -rw-r--r-- 1 root root 2923 Haz 28 2021 /etc/passwd "etc" dizini içindeki "passwd" dosyasının Kullanıcı ID bilgisi ve Grup ID bilgisi "root" şeklindedir. Yine "id" komutunu çalıştırdığımız zaman karşımıza etkin ID bilgileri ekrana basılır; uid=1000(ahmopasa) gid=1000(ahmopasa) ... Prosesimizin Etkin Kullanıcı ID bilgisi ile Etkin Grup ID bilgisi, dosyanın Kullanıcı ID bilgisi ve Grup ID bilgisine EŞİT OLMADIĞI için sekizinci, dokuzuncu ve onuncu karakterler bazında hak sorgulamasına tabii tutulacağız. Yani "r--". Bu durumda bizler "Vim" üzerinden bu dosyaya erişmek istediğimiz zaman sadece okuma hakkımız olacak. * Örnek 3, "ls -l wd" komutunu "shell" programında çalıştırdığımız zaman aşağıdaki yazılar ekrana çıkmaktadır; -rwxrwxr-x 1 ahmopasa ahmopasa 17128 Kas 17 21:39 wd Yine "id" komutunu çalıştırdığımız zaman karşımıza etkin ID bilgileri ekrana basılır; uid=1000(ahmopasa) gid=1000(ahmopasa) ... Buradan anlaşılıyor ki "owner", "group" ve "other" kısmındaki prosesler bu programı çalıştırma yetkisine sahipler. Sırasıyla şu kodları "shell" programında çalıştıralım; "chmod o-x wd" "ls -l wd" Şimdi ekranda çıkacak en son yazı şu şekilde olacaktır; -rwxrwxr-- 1 ahmopasa ahmopasa 17128 Kas 17 21:39 wd Her ne kadar "other" isimli kısımdaki prosesler bu programı çalıştıramasalar da, bizler hala çalıştırabiliriz çünkü bizler hem "owner" hem de "group" kısımlarında yetkiliyiz. Şimdi de şu aşağıdaki kodları "shell" programında çalıştıralım; "chmod g-x wd" "ls -l wd" Şimdi ekranda çıkacak en son yazı şu şekilde olacaktır; -rwxrw-r-- 1 ahmopasa ahmopasa 17128 Kas 17 21:39 wd Artık "other" kısmına ek olarak "group" kısımdaki prosesler de bu programı çalıştıramazlar. Fakat biz hala çalıştırabiliriz çünkü bizler hala "owner" kısmındayız. Şimdi de şu aşağıdaki kodları "shell" programında çalıştıralım; "chmod u-x wd" "ls -l wd" Şimdi ekranda çıkacak en son yazı şu şekilde olacaktır; -rw-rw-r-- 1 ahmopasa ahmopasa 17080 Kas 19 04:01 wd Artık bizlerin de çalıştırma yetkisi yoktur. Eğer çalıştırmayı denersek, aşağıdaki gibi bir hata alacağız; "bash: ./wd: Permission denied" Bu durumda bizler ancak kendimizi "root" yaparsak çalıştırabiliriz. * Örnek 4, "Executable" olmayan bir dosyaya, örneğin bir metin dosyası, "x" hakkı verdiğimiz zaman işletim sisteminin sistem fonksiyonları bu dosyayı bir "Script" dosyası olarak değerlendiriyor ve ona göre aksiyon alıp çalıştırıyor. Bu konunun nasıl olduğuna ilerleyen derslerde de değinilecektir. Diğer yandan şu hususa da dikkat etmeliyiz; bir dosyanın Kullanıcı ID bilgisi "kaan" olsun. Bizler de "etc/passwd" içerisinden "kaan" kullanıcısının bulunduğu satırı komple silelim. Artık bu durumda o dosyanın detaylarını "ls -l" komutu ile incelediğimiz zaman, "kaan" yerine, rastgele sayılar göreceğiz. Bir proses ile bu dosya üzerinde işlem yapmak istediğimiz zaman, prosesin Etkin Kullanıcı ID bilgisi ile iş bu dosyanın rastgele rakamlardan oluşan Kullanıcı ID bilgisi karşılaştırılacaktır. Bu durum sistemin çalışmasında bir bozulmaya yol açmaz fakat tavsiye edilen yöntem, "Bash" programı vasıtasıyla, kullanıcı silen komut satırı argümanlarının kullanılmasıdır. Çünkü bu komutlar ilgili kullanıcının id bilgilerini içeren bütün dosyaları ve programları da silmektedir. Bu komutlar "deluser", "userdel", "delgroup" ve "groupdel" komutlarıdır. Yani elle kullanıcı silmemeliyiz. Öte yandan "ls" komutuna "-a" seçeneğini geçtiğimiz zaman ekrana "." ve ".." ile başlayan dosyaları da bastıracaktır. Aksi halde "ls" komutu "." ve ".." ile başlayan dosyaları ekrana yazdırmamaktadır. Benzer şekilde "ls" komutu ile bir dizinin kendi özelliklerini görebilmek için "-d" seçeneğini kullanmamız gerekiyor. Aksi halde ilgili dizin içerisindekileri ekrana yazdıracaktır. > "sudo", "su" ve "runuser" komutlarını İNCELEMELİYİZ. Bu komutlar, "Bash" programı üzerinden başka kullanıcılara geçmemizi sağlar. Yani o kullanıcı olarak işleme devam ediyoruz. Örneğin, normal bir şekilde kendi oturumuzu açıyoruz. "Bash" programını çalıştırdığımız zaman, iş bu prosesin id bilgileri, "etc/passwd" dosyasından temin ediliyor. Dolayısıyla bu "Bash" programı üzerinden oluşturduğumuz bütün dosyalar ve çalıştırdığımız diğer prosesler, bizim kullanıcımızınki ile aynı id bilgilerine sahip olacaktır. Eğer "Bash" programı üzerinden "sudo bin/bash" dersek artık "root" kullanıcısı olarak "Bash" programını çalıştırmış oluyoruz. Bu andan sonra çalıştıracağımız bütün prosesler ve oluşturacağımız bütün dosyaların id bilgileri "root" kullanıcısının id bilgileri ile aynı olacaktır. Bir diğer örnek de şu olabilir; Normal bir şekilde kendi oturumuzu açıyoruz. "Bash" programını çalıştırdığımız zaman, iş bu prosesin id bilgileri, "etc/passwd" dosyasından temin ediliyor. Dolayısıyla bu "Bash" programı üzerinden oluşturduğumuz bütün dosyalar ve çalıştırdığımız diğer prosesler, bizim kullanıcımızınki ile aynı id bilgilerine sahip olacaktır. Eğer "Bash" programı üzerinden "su - veli" komutunu çalıştırırsak ve "veli" kullanıcısının şifresini de biliyorsak, artık ilgili "Bash" programının id bilgileri "veli" ninki ile aynı olacaktır. Bu andan sonra çalıştıracağımız bütün prosesler ve oluşturacağımız bütün dosyaların id bilgileri "veli" kullanıcısının id bilgileri ile aynı olacaktır. > Hatırlatıcı Notlar: >> "ls" komutu ilgili dizindekileri sıraya dizdikten sonra ekrana basmaktadır. Doğal sırayı görmek için "-f" seçeneğini kullanmalıyız. "-l" komutu daha sonra belirtirsek de detaylarını da ekleyecektir. Örneğin, "ls -fl /usr/include". Fakat UNIX sistemlerinde "-f" seçeneğini kullanırsak "-r", "-S" ve "-t" seçenekleri "ignore" edilirken "-A", "-g", "-l", "-n", "-o", "-s" seçenekleri "ignore" edilebilir. FAKAT DOĞAL SIRADAN BİR ANLAM ÇIKARTMAMALIYIZ. Çünkü silinen bir dizinin yerine başka bir dizin gelebilir. >> "ps" isimli kabuk komutu, o an çalışan proseslerin listesini vermektedir. >> "wc" isimli kabuk komutu, argüman olarak geçilen dosyadaki kelimeleri saymaktadır. >> "more" isimli kabuk komutu, çıktıyı sayfa sayfa görüntülemek için kullanılır. >> Bir aygıt sürücüsünü diğer programlardan ayıran en önemli özelliği, aygıt sürücüsünün "kernel mode" çalışan programlar olmasıdır. >> Sistem fonksiyonları "kernel" içerisindeki fonksiyonlardır. Dolayısıyla böyle fonksiyonları çağıran prosesler, geçici süreyle "kernel mode" seviyesine çekilirler. >> "cd .." komutu bir önceki dizine, "cd /" komutu ise "root" dizinine dönmenizi sağlar. >> "ipcs -s" komutu ile sistemdeki semafor nesnelerini "shell" programı ile görüntüleyebiliriz. >> "ipcrm -s " diyerek de o sistemdeki "ID" değerine sahip semafor nesnesi silinmektedir. >> O anda makinemizdeki işletim sistemi hakındaki bilgi uname komutuyla elde edilebilir. Bu komut -r ile kullanılırsa o makinede yüklü olan kernel versiyonu elde edilmektedir. Örneğin: $ uname -r 4.15.0-20-generic >> UTC saat biçimi dünyanın her yerinde aynıdır. Türkiye'nin yerel saati UTC biçimine göre, "day-light saving" durumuna bağlı olarak ya "+2" ya da "+3" formundadır. >> Komut satırı programından "tty" komutunu çalıştırdığımız zaman, o terminal programının "pts" bilgisini öğreniriz. Fakat o terminali kullanarak "sudo" ile bir program çalıştırırsak, bu sefer "pts" bilgisi de değişecektir. Yani normalde iki adet açık terminal olsun. Bunlar üzerinden "tty" komutunu çalıştırdığımızda sırasıyla "pts/0" ve "pts/1" çıktılarını göreceğiz. Eğer bu terminallerden birisi ile "sudo" komutunu kullanarak program çalıştırırsak, artık "pts/2" olacaktır. >> "shell" programı üzerinden "PS1='CSD>'" komutunu çalıştırırsak, artık satır başı "CSD>" olarak gözükecektir. Eğer "PS1='#'" yapsaydık, satır başları "#" olarak gözükecekti. >> "shell" programının kaynak limitleri "ulimit" komutuyla görüntülenmektedir. Bu komut da "cd" gibi içsel bir komuttur. Bu komutu "-a" ile kullanırsak bütün "soft-limit" değerlerini görüntülemiş oluruz. Bütün "hard-limit" değerleri için "-H -a" seçeneğini kullanmamız gerekmektedir. Limitlerde değişiklik yapmak için limite ilişkin seçenekleri kullanmalıyız. Örneğin, "ulimit -n 5000" komutuyla hem "soft-limit" hem de "hard-limit" değiştirilir. Eğer yalnızca "soft-limit" değerini istiyorsak "-S", yalnızca "hard-limit" değerini istiyorsak "-H" seçeneklerini yazmalıyız. Tabii "hard-limit" değerini arttırma işlemi için prosesimizin uygun önceliğe sahip olması gerekmektedir. Fakat "ulimit" komutu içsel bir komut olduğundan "sudo" ile çalıştıramayız. Bu yüzden ilk başta "shell" programını "root" olarak çalıştırmalıyız ki kendisinin limit değerlerini arttırabilelim. >> "forground/background" çalışmayı organize eden terminallere ise "job controlling terminal" adı verilir. >> UNIX ve türevi sistemlerde dosyanın yol ifadesinden hareketle o dosyanın "inode" numarasını elde edebiliriz; "stat", "fstat", "lstat" fonksiyonlarıyla. Ancak bu işlemin tersini gerçekleştirebileceğiz bir mekanizma mevcut DEĞİLDİR. Dolayısıyla "find" komutunu kullanarak arama yöntemiye yapılabilir.