Ana içeriğe geç

06- Bağıl ve Mutlak Yol

Sistemlerde bir dosyanın yerini belirtmek için birtakım ifadeler (path) kullanırız. "C:\Windows\system32" gibi. Linux dünyasında ise her şey root filesystem ile ("/") başlar.

Şimdi cd komutu ile biraz gezintiye çıkalım. pwd komutu ile de bulunduğumuz dizini gösterelim.

ali@ubuntu24:~$ pwd
/home/ali
ali@ubuntu24:~$ cd /
ali@ubuntu24:/$ pwd
/
ali@ubuntu24:/$ ls
bin  bin.usr-is-merged  boot  cdrom  dev  etc  home  lib  lib64  lib.usr-is-merged  lost+found  media  mnt  opt  proc  root  run  sbin  sbin.usr-is-merged  snap  srv  swap.img  sys  tmp  usr  var
ali@ubuntu24:/$ cd /bin
ali@ubuntu24:/bin$ pwd
/bin
ali@ubuntu24:/bin$ cd /var/log/
ali@ubuntu24:/var/log$ pwd
/var/log
ali@ubuntu24:/var/log$

Gezintiye "/home/ali" dizininden başladık. "/" a gittik. Orada bir ls çalıştırıp, içeride neler olduğuna baktık. Sonrasında "/bin" ve "/var/log" dizinlerine gittik. Hiçbir sorun ile karşılaşmadık.

Mutlak Yol (Absolute Path)

Absolute path, dosya sisteminin neresinde olursanız olun, sizi her zaman ilgili dosya ve dizine götürecek olan path'tir. Absolute path'i fark ettirecek en önemli özellik, her zaman / karakteri ile başlamasıdır.

Yukarıdaki örnekte, cd komutundan sonra verdiğimiz her path, "/" karakteri ile başlıyor. Dolayısıyla dosya sisteminin neresinde olursak olalım, her zaman aynı sonucu verecektir.

Bağıl Yol (Relative Path)

Dosya sisteminde bulunduğunuz konuma göre değişiklik gösteren path'tir. Bu şekilde kullanacağınız path, her zaman hangi dizinde olduğunuza bağımlıdır. Ev dizinimize geri dönüp tekrar gezintiye çıkalım.

Kullanıcının Ev Dizinine Gitmek

cd komutunu yazıp Enter'a basarak, ilgili kullanıcının ev dizinine doğrudan gidebilirsiniz.

ali@ubuntu24:/var/log$ pwd
/var/log
ali@ubuntu24:/var/log$ cd
ali@ubuntu24:~$ pwd
/home/ali
ali@ubuntu24:~$ ls
evraklar   projeler  'tatil fotoğrafları'
ali@ubuntu24:~$ cd projeler/
ali@ubuntu24:~/projeler$ ls
deneme  'web projesi'
ali@ubuntu24:~/projeler$ pwd
/home/ali/projeler

Gezintiye "/var/log" dizininden başladık. Sonra cd komutunu kullanarak ev dizinimize - bu örnekte /home/ali - gittik. ls ile içeriğe baktık. "projeler" dizinini gördük. Ev dizinimizde, "projeler" isimli bir dizin var. Dolayısıyla cd projeler/ komutu, bizi "/home/ali/projeler" dizinine götürebildi. Çünkü zaten "/home/ali" altındaydık.

Aynı komutu farklı bir yerde deneyelim:

ali@ubuntu24:~/projeler$ cd /etc
ali@ubuntu24:/etc$ pwd
/etc
ali@ubuntu24:/etc$ cd projeler/
-bash: cd: projeler: No such file or directory

"/etc" dizinine gittik ve bu dizin altında cd projeler/ komutunu çalıştırdık. Komut başarısız oldu. Çünkü absolute path değil, relative path verdik.

  • Kime göre relative? Bulunduğumuz dizine göre.
  • Bulunduğumuz dizin neresi? /etc
  • /etc altında, "projeler" isimli bir dizin var mı? Hayır.
  • Dolayısıyla komutumuz hata verir. Bu gayet normaldir.

Farklı bir örneği inceleyelim:

ali@ubuntu24:/etc$ cd /home
ali@ubuntu24:/home$ pwd
/home
ali@ubuntu24:/home$ ls
ali
ali@ubuntu24:/home$ cd ali
ali@ubuntu24:~$ pwd
/home/ali
ali@ubuntu24:~$

cd /home ile "/home" dizinine gittik. ls ile bir listeleme yaptık. Burada "ali" diye bir dizin var. cd ali komutunu çalıştırdık ve başarıyla sonuçlandı.

  • Kime göre relative? Bulunduğumuz dizine göre.
  • Bulunduğumuz dizin neresi? /home
  • /home altında, "ali" isimli bir dizin var mı? Evet.
  • Dolayısıyla komutumuz başarıyla çalışır.
  • "/home" altında cd ali çalıştırmak, herhangi bir yerde cd /home/ali çalıştırmaya eşdeğerdir.

Hangisini Ne Zaman Kullanmalıyım?

Uzun uzun path'ler yazmak istemiyorsanız, relative path'i tercih edebilirsiniz.

Örneğin, "/var/log" dizini altında yer alan diğer dizinlerin içeriğini görmek istiyorsunuz. Relative path kullanarak bunu yapabilmek için, öncelikle "/var/log" dizinine gidebilir ve devamında ls çalıştırarak bu dizinlerin içeriğini inceleyebilirsiniz:

ali@ubuntu24:~$ cd /var/log
ali@ubuntu24:/var/log$ ls
alternatives.log  apt       bootstrap.log  cloud-init.log         dist-upgrade  dmesg.0     dpkg.log  installer  kern.log   lastlog  README  sysstat              wtmp
apport.log        auth.log  btmp           cloud-init-output.log  dmesg         dmesg.1.gz  faillog   journal    landscape  private  syslog  unattended-upgrades
ali@ubuntu24:/var/log$ ls installer/
autoinstall-user-data  casper-md5check.json  cloud-init-output.log  curtin-install.log  installer-journal.txt  subiquity-client-debug.log       subiquity-client-info.log       subiquity-server-debug.log       subiquity-server-info.log
block                  cloud-init.log        curtin-install         device-map.json     media-info             subiquity-client-debug.log.1414  subiquity-client-info.log.1414  subiquity-server-debug.log.1456  subiquity-server-info.log.1456
ali@ubuntu24:/var/log$ ls journal/
3cca9f62b51f45daa2c00808880f83e9
ali@ubuntu24:/var/log$

Bu işlemi, absolute path kullanarak yapmaya çalışırsanız, komutlarınız ls journal/ yerine, ls /var/log/journal hâline gelecek:

ali@ubuntu24:~$ pwd
/home/ali
ali@ubuntu24:~$ ls /var/log/installer/
autoinstall-user-data  casper-md5check.json  cloud-init-output.log  curtin-install.log  installer-journal.txt  subiquity-client-debug.log       subiquity-client-info.log       subiquity-server-debug.log       subiquity-server-info.log
block                  cloud-init.log        curtin-install         device-map.json     media-info             subiquity-client-debug.log.1414  subiquity-client-info.log.1414  subiquity-server-debug.log.1456  subiquity-server-info.log.1456
ali@ubuntu24:~$ ls /var/log/journal/
3cca9f62b51f45daa2c00808880f83e9

Relative Path

Relative path, bizi uzun path isimleri yazmaktan kurtarır. Örneğin, /tmp dizini altına 3 dosya oluşturmak istiyorsunuz: dosya1, dosya2 ve dosya3. Bu işlemi kendi ev dizininizden - mesela /home/ali - yapmak isterseniz, her seferinde absolute path yazmanız gerekir: touch /tmp/dosya1 /tmp/dosya2 /tmp/dosya3 gibi. Ancak "/tmp" dizinine gittikten sonra relative path kullanabilir ve komutunuzu kısaltabilirsiniz: touch dosya1 dosya2 dosya3 gibi.

Fakat relative path bizi her zaman kurtarmaz. Diyelim ki spesifik bir işi yapan, uzun bir komut yazdınız. Birtakım dosyalara da dokunarak çalışan bir komut olsun. Böyle bir komutu, dosya sisteminin neresinde olursanız olun tek seferde çalıştırabilmek istiyorsanız absolute path kullanmalısınız.

Komutun detayları şu an için önemsiz olmakla birlikte, aşağıdaki komut, sistemde yer alan tüm kullanıcıları listelemeye yarar. Bu komut, "/etc/passwd" dosyasını kullanır. Eğer relative path kullanırsak - kullancağımız path'e göre değişmekle birlikte - yalnızca "/" ya da "/etc" dizini altında çalışabilir. Fakat dosyanın yolunu relative değil, absolute vererek, dosya sisteminin neresinde olursak olalım sağlıklı çalışmasını sağlayabiliriz.

ali@ubuntu24:~$ cut -d : -f 1 /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
_apt
nobody
systemd-network
systemd-timesync
dhcpcd
messagebus
systemd-resolve
pollinate
polkitd
syslog
uuidd
tcpdump
tss
landscape
fwupd-refresh
usbmux
ali
sshd

Benzer şekilde, şayet bir Bash script yazdıysanız ve birtakım işlemler yapmanız gerekiyorsa, relative path'ten uzak durmak mantıklı olabilir. Çünkü bir kullanıcının, sizin script'inizi hangi dizin altında çalıştıracağını bilemezsiniz.

Özel Karakterler ile Gezinti

Bash'te, nokta "." karakteri bulunduğunuz dizini, yan yana iki nokta ".." karakteri ise bulunduğunuz dizinin bir üst dizinini kast eder. Tahmin edeceğiniz üzere, bu ifadeler relative'dir. Bulunduğunuz dizine göre değişiklik gösterir.

Aşağıdaki örneği inceleyin:

ali@ubuntu24:~$ cd
ali@ubuntu24:~$ pwd
/home/ali
ali@ubuntu24:~$ cd ..
ali@ubuntu24:/home$ pwd
/home
ali@ubuntu24:/home$

cd komutu ile evimize gittik. pwd ile, "/home/ali" altında olduğumuzu doğruladık. cd .. ile, bulunduğumuz dizinin bir üst dizinine gittik. Yani bu durumda "/home" dizinine gitmiş olduk. Aynı komutu tekrar çalıştırınca:

ali@ubuntu24:/home$ cd ..
ali@ubuntu24:/$ pwd
/

"/" dizinine geldiğimizi göreceksiniz. Çünkü "/home" dizininin bir üstünde "/" dizini vardır.

Directory Traversal Attack

Penetrasyon testleri ile ilgilendiyseniz, Directory Traversal ya da Path Traversal atak yöntemlerini duymuş olabilirsiniz. Bir web sitesi URL'inin sonuna, üst üste "../" ifadesinin eklenmesi ile başladıklarına şahit olmuşsunuzdur. Bu ifade ile, web uygulamasının size sunmakta olduğu dizinin bir üstü, onun da bir üstü, onun da bir üstü... şeklinde devam eden bir süreç ile "/" dizinine kadar gelebilmeyi ve devamında oradan veri çıkarmayı - mesela /etc/passwd - deneyebilirsiniz. Modern web uygulamaları, bu saldırıya çoğu zaman açık değildir. Ama hepsinin korunuyor olmasının da bir garantisi yok.

Path'lerin Kullanımı

Path'lerin kullanımı, yalnızca cd ile kısıtlı değildir. Path kullanan herhangi bir program - örneğin cp programı - absolute ve relative path konusuna bağlıdır. Zaten bu path'leri, sizin shell'iniz yorumlamaktadır.

Aşağıdaki örnekleri inceleyelim:

ali@ubuntu24:/$ cd
ali@ubuntu24:~$ pwd
/home/ali
ali@ubuntu24:~$ cp /etc/passwd kopya1
ali@ubuntu24:~$ ls
 evraklar   kopya1   projeler  'tatil fotoğrafları'
ali@ubuntu24:~$

cd ile evimize döndük, pwd ile teyit ettik. cp /etc/passwd kopya1 komutu ile hem absolute, hem de relative path kullandık. Kaynak dosyayı absolute path ile, hedef dosyayı relative path ile belirttik.

  • Kaynak dosya neresi? /etc/passwd.
  • Path'i hangi şekilde verilmiş? Absolute (başında / var).
  • Hedef dosya neresi? kopya1.
  • Path'i hangi şekilde verilmiş? Relative (başında / yok).
  • Neredeki dosya kopyalanacak? /etc/passwd. Kesin. Çünkü absolute path ile verilmiş.
  • Nereye kopyalanacak? "kopya1" ismiyle, şu an bulunduğum dizin neresiyse oraya kopyalanacak. Çünkü relative path kullanılmış.
  • Bu komutu hangi dizinde çalıştırdık? /home/ali.
  • Dolayısıyla /etc/passwd dosyası, /home/ali/kopya1 olarak kopyalanacak.

Deneyin

Deneyimlerime dayanarak söyleyebilirim ki, bu konunun anlaşılması bazen zor olabiliyor. Anlayabilmenin en iyi yöntemi, "/" karakterine odaklanmak. Path'in başında "/" var ise bu absolute path'tir ve nerede olduğunuzdan bağımsız olarak her zaman aynı yeri gösterir. "/" karakteri yoksa relative path'tir ve her zaman bulunduğunuz yere göre değişiklik gösterir. Dosya oluşturun, dizin oluşturun, kopyalama ve taşıma işlemleri yapın. Path'leri denedikçe ve doğru yaptıkça - veya hata aldıkça - bu konu daha net oturacaktır.