Linux ve MacOS’un komutlarının benzerliği nereden geliyor? Tarihlerine ilişkin ve komutları için inceleme.

Doğan Aydın
Bilişim Hareketi

--

Uzun yıllar windows kullanıcısı olduktan sonra MacOS ile tanışmam ile windows’u bırakmam bir oldu. MacOS kişisel ve iş bilgisayarımda kullanırken, geliştirdiğim hemen hemen tüm projeleri Linux sunucular üzerine kuruyorum. Senelerdir 3 işletim sisteminin kullanıcısıyım diyebilirim.

MAC’in touchpad’i ile tanışmam benim adıma bir devrim olmuştu. İnternet sitelerini, harici bir cihaza(mouse) ihtiyaç duymadan rahatlıkla gezebiliyor olmak büyük kolaylıktı ve MAC’e geçişimdeki en temel unsur bu oldu. Yıllar geçtikten sonra bugün gözlemim: MAC kişisel bilgisayar pazarında ciddi bir yer edindi ve tek başına olan Window hükümdarlığına son verdi. Windows bir diğer darbeyi de server dünyasında Linux’den aldı. Bugün internetin %68'i unix-like makinelerin üzerinde koşuyor.[1]

Merak ettiniz mi bilmiyorum. MacOS içinde yazdığınız komutlar ile Linux içinde yazdığınız komutların benzerliği nerdeyse bire bir. Nereden geliyor bu benzerlik dersiniz?

İşte burda detaylı bir geçmiş var. Hikaye aslında UNIX ile başlıyor. Bell Labs içinde AT&T çalışanları 1969 yılında UNIX’i geliştiriyor ve bunu açık kaynaklı kod olarak dünyanın kullanımına açıyor.

Hikaye şu şekilde devam ediyor.

“Unix 6.versiyonundayken, kaynak kodu AT&T lisansıyla ücretsiz dağıtılıyordu ve tüm dünyada üniversitelerde operating systems dersinde kullanılıyordu ancak versiyon 7 çıktığında AT&T Unix’in ticari bir ürün olduğunu düşünüp kaynak kodlarının üniversiteler tarafından kullanılmasını engelledi. Artık üniversiteler OS derslerinde işin teorisine yöneldiler, girdi çıktı, dosya sistemleri gibi konularda pratiğe ihtiyaç olunduğundan ögrenciler bu konularda eksiklik yaşadılar, zaten akabinde üniversiteler OS derslerinde unix’i ele almayı bıraktılar. Bunun üzerine Tanenbaum abi, AT&T’nin versiyon 7sinin tek bir satırını bile kullanmadan mini-unix yani minix adında yeni bir işletim sistemi yazdı. Amacı kodun olabildiğince okunabilir, sistemin olabildiğince temiz ve küçük olmasıydı. Kaynak koduna binlerce satır yorumlar yazdı ve orta halli birinin bile nasıl çalıştığını anlayabileceği bir OS yazdı.” [5]

Unix hikayeden aslında bu anda çıkıyor. Devamında rolü Tanenbaum abimizin yazdığı minix devam ettiriyor. Peki Linux nereden çıkıyor?

Helsinki üniversitesi bilgisayar mühendisliği öğrencisi Linus, sene 1991 IBM’in bir cihazını alır ve kişisel bilgisayarı olarak kullanmaya başlar. Ancak bilgisayar üzerinde MS-DOS vardır. Linus, MS-DOS’dan memnun değildir ve üniversitede kullandığı gibi UNIX kullanmak ister. Lakin UNIX’i kullanabilmesi için 5000$ lık bir bedel ödemesi gerekir ki o da ben UNIX e benzer bir sistem yazıp bunu IBM makine üzerinde koşturabilir miyim diye yola çıkar. Sıfırdan yazmak yerine minix üzerine geliştirmesini şekillendirir. Bu yaptığı şeyde bir bitirme tezi olur. Yani bizim linux aslında bir lisans öğrencisinin bitirme tezidir. Yüksek lisans, doktora filen de değil, bildiğimiz lisans. Linux’ün hikayesini ilk duyduğumda kendi bitirme tezimden utanmıştım :) Tabi linux o zaman ki linux olarak kalmadı ve üzerinde 100'lerce yazılımcı kod geliştirdi.[2]

Linux kullanıma hazır hala gelişi 1991. Tarih olarak bakarsak çok daha genç bir işletim sistemi. Linux UNIX üzerinde çalışmıyor. Linux minix’den esinlenmiş ancak yeniden yazılmış bir işletim sistemi. [3]

Peki MAC’te çalışan komutların Linux ile benzerliği nereden çıktı derseniz?

“Mac OS X Leopard is built upon the BSD code base.”[4]

Mac OS X Leopard BSD kod tabanı üzerine geliştirilmiş bir işletim sistemi. BSD’nin açılımı “Berkeley Software Distribution”. Bu da nedir derseniz?

“The Berkeley Software Distribution was a Unix-based operating system developed and distributed by the Computer Systems Research Group at the University of California, Berkeley, from 1977 to 1995.”[5]

Yani Unix tabanlı bir işletim sistemi dağıtımı. Ancak ilerleyen zamanda BSD geliştiricileri UNIX dair hemen hemen her şeyi yeniden geliştirmişler. Dolayısı ile UNIX’in bir kodu kalmamış.

“While it is true that BSD was originally based on the UNIX code base, the BSD developers replaced all the original UNIX code long before Apple based its OS on BSD. Therefore, it is incorrect to state that Mac OS X Leopard is based on UNIX code as it does not include any UNIX code.” [4]

Dolayısı ile aslında MacOS da Linux de birer UNIX-like işletim sistemi. Yani ondan esinlenip, yeniden yazılmışlar. Dolayısı ile geçmişten gelen kullanıcı alışkanlıkları ile komut yapılarını da pek değiştirmemişler.

Ben neden bu makaleyi yazıyorum derseniz? Öğrendiğim platformlara ilişkin notlar tutarım. Kısa yolları ya da önemli bulduğum nasıl yapıldığını dokümante ederim. Bunlardan biriside Unix komutları için aldığım notlardı. Bu notların herkese açarak hem bana hem de Türkçe kaynak arayışında olan arkadaşlara faydalı olmak istedim. Burada amacım tüm unix-like dünyanın komutlarını sunmak değil, önemli bulduğum komutlar için aldığım notları paylaşmaktır.

Ayrıca terminali bazı dönemlerde az kullanmaktan dolayı zaman zaman hakimiyetimi kaybettiğimi düşünüyorum ve sıklıkla notlarıma bakma ihtiyacım doğuyor. Umarım bu link hem benim adıma hem de takip etmek isteyen arkadaşlar adına bir referans olur.

Kısa yollar

  • ctrl+U: İmlecin solundakileri siler.
  • crtl+K: İmlecin sağındakileri siler.
  • cmd+T: Terminal üzerinde yeni sekme açar.
  • cmd+W: Aktif olan sekmeyi kapatır.
  • cmd+K: Terminali temizler

history

# history

Geçmişe yönelik kullanılan komutları sıralamak için kullanılır.

# !nano

Komutla yapılan son komut çağırım şeklini tekrar çağırmak için komutun başına ! işareti konarak çağırılabilir. Yukardaki örnekte en son nasıl nano çağırıldı ise o şekilde çağırılsın gibi. Bunu özellikle çok uzun komut hazırlayıp tekrar tekrar uğraşmamak için çağırabilirsiniz.

# !nano:p

Yukardaki şekilde sonuna :p eklenirse çağırmadan, en son nano komutunun hangi parametreler ile çağırıldığını gösterir.

echo

Hem yeni dosya oluşturup, hem de içine veri girişi sağlayabildiğimiz bir komut.

DÜZELTME: echo dosya oluşturan bir komut değildir. Herhangi bir yerde metin çıktısını göstermek için kullanılır. Aşağıdaki dosyanın içine veriyi yazan yönlendirici operatör olan > işaretidir. Bu düzeltme için SimaWB’ye teşekkürler.

echo "metin" > icerikdosyası 

“metin” kelimesini icerikdosyası adında dosya yaratıp içine yazdırmış olduk. Eğer tek ok > işareti yerine iki ok >> kullanırsak bu durumda eğer dosya varsa dosyaya ekleme yapar, ezmez.

Bu operatörün kullanıma gerçekten bayılıyorum. Örneğin alttaki şekilde bir tanımlama ile tüm dosyaların isimlerini bir dosyaya metin olarak ekleyebiliyoruz. Unix’ün konuya yaklaşımındaki inceliği, sadeliği görüyor musunuz…

ls -l > dosyalistesi

eğer nano ya da cat gibi bir komut ile dosyalistesi’ni açarsak göreceğimiz o dizindeki tüm dosyaların isimleri güzelce sıralandığı olacak.

echo ekleme dışında listeleme işlerine de yarıyor.

echo d*
echo *a

Bu iki komuttan ilki ile d ile başlayan dosyaları sırala, diğeri ise a ile biten dosyaları sıralamış oluyoruz.

paste

Bildiğimiz paste işleminden farklı. İki dosya içeriğini satır numaraları ile yan yana getirme işlemi yapar. Örneğin

# cat icerik1icerik 1icerik 2icerik 3icerik 4# cat icerik2yeniicerik1yeniicerik2yeniicerik3yeniicerik4# paste icerik1 icerik2icerik 1 yeniicerik1icerik 2 yeniicerik2icerik 3 yeniicerik3icerik 4 yeniicerik4

Burada yine estetik bir hareket ile karşılaştırma sonucunu bir dosyaya yazmak istersek. Alttaki şekilde icerik1 ve 2'yi karşılatır. Sonucunu sonuç dosyasına yaz diyebiliriz.

paste icerik1 icerik2 > sonuc

grep

Dosya içerisinde arama yapmayı sağlayan komut.

  • -i: Büyük/küçük harf ayrımı yap.
  • -r: Alt dizinlerde de arama yap.
  • -v: Aranılan kelimenin olmadıklarını listele.

tr

Dosya içerisindeki metinlerde düzenleme yapmaya yarıyor. Örneğin dosya içindeki tüm harfleri büyük harfleri ile değiştirelim, listeleyelim. Ne kadar basit değil mi? Zaman zaman tüm harfleri büyütmeye ya da küçültmeye çalıştığımda bunu kullanıyorum.

# cat dosya1icerik 1icerik 2icerik 3icerik 4# tr a-z A-Z < dosya1ICERIK 1ICERIK 2ICERIK 3ICERIK 4

find

Unix’ün harika bir başka fonksiyonu. Neden dersiniz? Bugün mac os yada windows işletim sistemlerinin sağladığı arayüzler üzerinde de arama yapıyoruz ancak bu kadar detaylı değil.

find [path] [aranacak kelime]

örneğin:

  • type f ya da type d ekleyerek aramanın dosyalarda ya da dizinler için yapılmasını söyleyebiliyoruz.
  • perm [code] vererek erişim izini code olan dosya, dizinleri bulabiliyoruz.
  • size +20k diyerek 20Kbyte’dan daha büyük ya da eksi koyarsanız küçük dosyalarda arama yapabiliyorsunuz.
  • ctime 5 diyerek 5 gün önde düzenlenmiş dosyayı ya da artır, eksi kullanarak öncesi ve sonrası için de arama yapılabiliyor.
  • Başlık isimlerinin önüne * konarak ile başlayan, biten gibi isim aramaları yapılabiliyor.
find ~ -size +200M

Mesela cihazınızda biraz temizlik yapmak istiyorsunuz ve boyutu büyük dosyaları listeleyeceksiniz. Yukardaki örnek ile 200 Mbyte’dan büyük dosyaları listelemiş olursunuz.

Yine unix’in bir estetiği, find komutunun bulduklarını exec komutu ile çeşitli işlemlere yönlendirebiliyorum. Mesela resimleriniz var yüzlerce ve tüm bu resim dosyalarını, boyutlandıran bir fonksiyona parametre olarak göndermek istiyorsunuz. İşte find ve exec komutları tam bunun için.

exec

find komutu açıklamasında bahsedildiği gibi dosya ile ilgili işlem yapmayı sağlar.

find resimler -name *.png -exec boyutlandir {} \;

Bu kodu yazarsanız resimler dizini altındaki tüm png dosyalarını boyutlandir adlı shell script’inize göndermiş olursunuz. Bu sayede dosyalarınızı küçültebilirisiniz.

find resimler -name *.png -size +20M -exec rm {} \;

Bu komutu koşturursanız resimler dosyasındaki png görsellerinin boyutu 20 Mbyte büyük olanları silmiş olursunuz. Bu şekilde bazı resimlerden hızlıca vazgeçip hafızanızı boşaltabilirsiniz.

shred

Bu komut güvenlik için önemli bir kod. Dosyayı güvenli silmeye yarar. Bu sayede dosya silindikten sonra hafızadan erişim sağlanamaz. Öncelikle şunu bilmek lazım. Bugün biz bilgisayarlarımızdan dosya silerken dosyanın içeriğini değil sadece basit adresini sileriz. Dolayısı ile o adrese bakacak olursanız aslında dosya ordadır. Belki zaman içinde üzerine birileri bir şey yazar ancak yazana kadar dosyanızın içeriği ordadır. Bu sayede bilgisayarınızdan sildiğiniz halde dosyalarınızı kurtarma şansınız oluyor. Ancak bu komut işte bu işi imkansız hale getirmek için yazılmış. İçeriğin olduğu yere kendisi rastgele içerik yazıyor ve bunu birden çok defa yaparak geri kurtarma şansı kalmıyor. Örneğin şifrelerinizi sakladığınız bir dosya varsa onu bu şekilde silmeniz mantıklı olacaktır.

shred -n 10 -v dosya1

rm

Sıklıkla parametrelerini unuttuğum bir kod. Silme komutu.

  • -r: alt dizinlerini de siler.
  • -i: silerken önce siliyim mi diye sormasını istersek.
  • -rf: sorgusuz, sualsiz silmesini istersek.

Erişim Konuları

Unix’in dosya erişimlerine ilişkin 3'lü bir yapısı mevcut.

  • Sahibi
  • Sahibiyle aynı grupta olanlar
  • Diğerleri

Örneğin ls -l komutunu koşturarak dizin içindeki dosyaları yetkilendirme bilgisi ile listeleyebiliriz.

# ls -ltotal 16drwxr-xr-x  2 trda  staff  64 Dec 23 17:26 dizin1-rw-r--r--  1 trda  staff  36 Dec 23 16:41 dosya1-rw-r--r--  1 trda  staff  48 Dec 23 16:42 dosya2

başlangıçta yer alan d ya da — işareti bunun bir dizin mi dosya mı olduğunu ifade eder.

Peşinden gelen 3 farklı grup için okuma yazma ve çalıştırma komutu izni bilgileri gösterilir. Örneğin yukarıda yer alan dizin1 dizini için inceleyecek olursak. “drwxr-xr-x” d: dizin olduğunu söylüyor. İlk grubu yani sahibin r(okuma), w(yazma) ve x(çalıştırma) iznine sahip olduğunu gösteriyor. İkinci grup sadece okuma ve çalıştırma iznine sahip, diğerleri ise sadece çalıştırma iznine sahip.

Erişim Yetkilerini Değiştirme

chmod

Dosyaların erişimlerine ilişkin unix-like dünyanın sunduğu yapı ilk bakıldığında çok karışık geliyor. Bana da öyle gelmişti. Ancak altta ki kısmı okuyacak olursanız aslında ne kadar basit ve esnek olduğunu göreceksiniz. Bu Erişim izninlerini bu komut ile değiştirebilmekteyiz.

  • u: dosya sahibi
  • g: sahibi ile aynı gruptakiler
  • o: diğer kullanıcılar
  • a: herkes
  • +: yetki ekleme
  • -: yetki çıkarma
  • r: okuma yetkisi
  • w: yazma yetkisi
  • x: çalıştırma yetkisi
# chmod +x dosya1# ls -ltotal 16drwxr-xr-x  2 trda  staff  64 Dec 23 17:26 dizin1-rwxr-xr-x  1 trda  staff  36 Dec 23 16:41 dosya1-rw-r--r--  1 trda  staff  48 Dec 23 16:42 dosya2

Yukardaki örnek ile herkese dosya1'i çalıştırma izni vermiş olduk.

# chmod o-x dosya1# ls -ltotal 16drwxr-xr-x  2 trda  staff  64 Dec 23 17:26 dizin1-rwxr-xr--  1 trda  staff  36 Dec 23 16:41 dosya1-rw-r--r--  1 trda  staff  48 Dec 23 16:42 dosya2

Yukardaki örnek ile sadece diğerlerinden çalıştırma iznini geri aldık.

# chmod u+rwx,g-x,o-xr dosya1

Yukarıdaki örnek ile dosya1'in sahibine okuma, yazma ve çalıştırma izni verirken, sahibi ile aynı gruptakilerden çalıştırma iznini almış olduk ayrıca diğer kullanıcılardan da çalıştırma ve okuma iznini aldık.

Aslında bu tanımlama yapısı oldukça basit ancak daha kolay anlaşabilmek için rwx yapısını sayı şeklinde de tanımlamışlar.

r = 4, w = 2, x = 1

Bu şekilde bu sayıların toplamını kullanarak çok daha hızlı dosya tanımlaması yapılabiliyor. Örneğin dosyanın iznini 755 ile değiştirmek var ya da şu şekilde söylemek var rwx-rx-rx. Hangisi basit…

# chmod 641 dosya2# ls -ltotal 16drwxr-xr-x  2 trda  staff  64 Dec 23 17:26 dizin1-rwxr-xr--  1 trda  staff  36 Dec 23 16:41 dosya1-rw-r----x  1 trda  staff  48 Dec 23 16:42 dosya2

Yukarıdaki 641 ile aslında rw-r-x etkisi vermiş oldum.

Kullanıcı Ekleme

Sunucu yönetimi yapan arkadaşların sıklıkla yaptıkları gibi sadece root bir user vardır ve her sunucuya bağlanan bu root hesap ile işlemler yapar. Aslında bu çok yanlış ancak zaman zaman insan atlıyor ve root hesap bilgilerini diğer insanlar ile paylaşıyor. Güvenlik sorunu oluşturduğu gibi, bu sunucu üzerinde yapılan işlemlerin log’lanması noktasında da sıkıntılı bir konu.

adduser

Kullanıcı yaratmayı sağlana basit bir koddur.

adduser kullaniciadi

Kullanıcı eklendikten sonra kullanıcıya bir UID ve GID ataması yapılır.

id

Kullanıcının UID, GID sini bu komut ile kontrol edebiliyoruz.

# id kullaniciadiuid=501(kullaniciadi) gid=20(kullaniciadi) groups=20(kullaniciadi)

Kullanıcıyı Aktif/Pasif Yapmak

usermod

Kullanıcıyı -L parametresi ile kitler, -U parametresi ile tekrar aktif hale getirmeyi sağlayabiliyoruz.

usermod [-L|-U] kullaniciadi

Kullanıcı Parolasını Değiştirme

passwd

Kullanıcının parolasını değiştirmesini sağlar.

# passwd kullaniciadiChanging password for kullaniciadi.Old Password:New Password:Retype New Password:

Başka Kullanıcı Kimliği İle Çalıştırma

Hesaplar arasında geçiş yapıp işlemler yapmayı sağlar.

su

İki şekilde çalışır. Sadece kimlik değiştirebilir ya da kimlik değiştirip, değişen kimliğin dosya yapısı ile geçiş sağlar.

su kullaniciadi

Bu şekilde direk kullanıcı gibi davranabiliriz.

su - kullaniciadi

Yukardaki şekilde yazınca ise home dizinimiz kullaniciadi adlı kişinin dizini olur. Direk o oturum açmış gibi çalışmaya devam ederiz.

MAC kullanıyorsanız ve root hesaba geçmek istiyorsanız aşağıdaki komutu çalıştırabilirsiniz.

sudo su

ps

Çalışan tüm process’leri listeler.

ps aux

top

Çalışan process’leri gösteri ancak verileri aralıklar ile yeniler. Bu sayede an ve an kaynak tüketimlerini görmüş oluruz. Varsayılan yenilenme süresi 3 saniyedir. Bu değer değiştirilmek istenirse “-d süre” tanımı yapılarak değiştirilebilir.

top -d 5

kill

Çalışan process’i durdurmak için kullanılan komuttur.

kill <pid>

Buradaki pid process ID’dir. top ya da ps aux komutları çıktısından ilgili ID alınarak işlem yapılabilir.

Olduku siz kill komutunu çağırıyorsunuz ancak process bir türlü kapanmıyor. Bu durumda 9 numaralı sinyali göndererek ölümcül darbeyi vurabiliyorsunuz.

kill -9 <pid>

ifconfig

Makinenin IP yapılandırmasını gösterir.

nslookup

DNS sunucusunun yönlendirdiği IP sorgulamasını yapmanızı sağlar. Yani bugün bir siteye girdiğinizde aslında bir domain çağırıyorsunuz bunun karşılığı bir server var ve server’a IP ile ulaşıyorsunuz ancak IP’si nedir bilmiyorsunuz. İşte nslookup komutu ile o domain’in bağlı olduğu IP adresine erişmiş oluyorsunuz.

nslookup> facebook.comServer:  8.8.8.8Address: 8.8.8.8#53Non-authoritative answer:Name: facebook.comAddress: 157.240.1.35

Mesela facebook.com adresinin ulaştığı IP.

query parametresini değiştirerek domaine ilişkin farklı bilgilerde alabiliyoruz.

  • NS: Name server’ları
  • MX: Mail serverları
  • TXT: TXT kayıtlarını sorgular
  • ANY: Tüm sorgular
  • SOA: TTL e ilişkin bilgiler
> set query=NS> facebook.comServer:  8.8.8.8Address: 8.8.8.8#53Non-authoritative answer:facebook.com nameserver = a.ns.facebook.com.facebook.com nameserver = b.ns.facebook.com.

host

nslookup’ın daha basit versiyonu.

# host peacefulsoundsapp.compeacefulsoundsapp.com has address 18.185.192.152peacefulsoundsapp.com has address 52.57.47.78peacefulsoundsapp.com mail is handled by 1 aspmx.l.google.com.peacefulsoundsapp.com mail is handled by 10 alt3.aspmx.l.google.com.peacefulsoundsapp.com mail is handled by 10 alt4.aspmx.l.google.com.peacefulsoundsapp.com mail is handled by 5 alt1.aspmx.l.google.com.peacefulsoundsapp.com mail is handled by 5 alt2.aspmx.l.google.com.

Ayrıca type vererek özel çıktı alabilirsiniz.

host -t TXT facebook.comfacebook.com descriptive text "v=spf1 redirect=_spf.facebook.com"

tcpdump

Bu komut çok severek kullandığım bir komut ancak çok detaylı. Bunu tek başına bir başlık içinde inceliyor olacağım.

Umarım size de bana da ilerleyen günlerde faydalı olacak bir yazı olmuştur. Takip eder ya da yorum yazarsanız bu tür paylaşımlar yapma konusunda hevesimi artırırsınız.

Saygılarımla,

Doğan Aydın

Twitter Profilim: https://twitter.com/dgnaydin

Linkedin Sayfam: https://www.linkedin.com/in/doganaydin/

REFERANSLAR

[1] https://w3techs.com/technologies/overview/operating_system/all

[2] https://www.linuxtrainingacademy.com/what-is-linux/

[3] https://techcrunch.com/2008/03/24/arent-unix-and-linux-the-same-thing-yes-and-no/

[4] https://eksisozluk.com/entry/14166210

[5] https://en.wikipedia.org/wiki/Berkeley_Software_Distribution

--

--

Doğan Aydın
Bilişim Hareketi

CTO@TurkNet, Software developer, Dad, History book lover, Cyclist, EU4 and HIO4 video games fan, Junior writer, Amateur traveler