15 Ocak 2021 Cuma

Find Komutu ile Aradığını Bulmak (Linux) ve Deneme Soruları


 

Find komutu, Unix benzeri işletim sistemlerinde en önemli ve en sık kullanılan komut satırı yardımcı programlarından biri. 

Find komutu, bağımsız değişkenlerle eşleşen dosyalar için belirtilen koşullara göre dosya ve dizinlerin listesini aramak ve bulmak için kullanılıyor.

Linux'da find komutu ile bir şey bulmak istediğimizde komut giriş şekli aşağıdaki gibi oluyor:

find nerede ne

Yani ilk olarak sisteme find diyerek bir şey bulmasını istediğimizi, ardından bunu nerede bulmasını istediğimizi son olarak da ne aradığımızı belirtiyoruz.  Ancak çok sayıda farklı kullanım şekli ile sonuca ulaşılmasını mümkün kılıyor.

Birçok farklı komutta olduğu gibi "man" komutu ile birlikte find'ın nasıl kullanılacağına dair seçenekler görülebilir:

man find

Ayrıca wildcard (* işareti) kullanarak da kolay arama yapmak mümkün.

ÖRNEK:

Linux terminalinde touch komutu ile bulunduğunuz dizine iki dosya yaratın:

touch dosya1 dosya2

Touch komutunu kullanarak isimleri dosya1 ve dosya2 olan 2 adet dosya yaratmış olduk.

Bunu ls ya da ls -la komutları ile doğrulayabiliriz.

Ya da;

find dosya* 

Yukarıdaki komutu kullandığımızda bulunduğumuz dizinde "dosya" adına sahip olan tüm dosyalar sıralanacaktır. Yani hem dosya1 hem dosya2 sonucu gelecektir.

find *1 

Yukarıdaki komutu girmemiz durumunda ise yalnız dosya1 bulunacaktır.

Bulunduğumuz dizinde değil farklı bir dizinde arama yapmak istiyorsak ya da tüm işletim sisteminde arama yapılmasını istiyorsak find komutunun hemen ardından path yani arama yapılacak yolu belirtmemiz gerekir. 

Find komutunun hemen ardından gelecek ilk bilgi yukarıda bahsetmiş olduğum gibi "nerede" sorusunun yanıtı olmalıdır. Böylece find hem dizinleri hem de alt dizinleri arayacaktır. 

Eğer tüm işletim sistemi altında arama yapmasını istiyorsak komut:

find /

 

En faydalı iki flag: -type and -name 

-type ile aramakta olduğumuz "şeyin"dosya mı yoksa dizin mi olduğunu belirtebiliriz. Dizin aradığımızı belirtmek için -type 'ın ardından d,ya da bir dosya arıyorsak bu durumda f kullanmamız gerekir.

Şimdiye kadar ki kısımda find komutuna nerede ve ne tip bir "şey" aradığımızı şu şekilde söyledik:

find / -type f (Tüm işletim sisteminde bir dosya ara) (Hala ne araması gerektiğini söylemedim!)

-name flag ise aranacak bir ad veya patern belirtmek için kullanılır.

 

Wildcard (*) kullanımı

Aradığımız dosyaya ait yalnızca bir kısım bilgiye sahipsek find komutunun wildcard yani * ile kullanımı faydalı olur.

Burada aramakta olduğumuz dosya ya da dizinin tam adını yazabilir ya da wildcard kullanarak ismin sadece bir kısmını belirtebiliriz. Ayrıca yalnız belirli bir uzantıya sahip dosyaları aramak istiyorsak (örneğin sadece .sh ya da .xml olan dosyaları görmek istiyorsak) yine wildcard kullanmak gerekecektir.

Dikkat: Eğer wildcard kullanılıyorsa mutlaka tırnak içerisinde kullanılması gerekir.

Örneğin: 

find / -type f -name "*.xml" 

 

-name ve -iname farkı 

Ayrıca -name yerine -iname kullanılması durumunda büyük/küçük harf ayrımı da ortadan kalkar (case insensitive olur). 

Yani "Inex.sh" arıyorsak "inex.sh" şeklinde arama yaptığımızda da bu dosyayı bulur ancak -name kullanırsak bu case sensitive yani büyük/küçük harf duyarlı bir arama olacaktır.

ÖRNEKLER

/home dizini altında "user.txt" adındaki tüm dosyaları büyük/küçük harfe duyarlı olmayacak şekilde bulun 

find /home -type f -iname user.txt

Adında "exploits" geçen tüm dizinleri bulun

find / -type d -name "*exploits"

Owner, Size ve Permissions

Bazı durumlarda sadece isim belirtmek de yeterli olmayacaktır. Dosyanın hangi kullanıcıya ait olduğunu (owner), ne büyüklükte olduğunu (size) veya hangi izinlere sahip olduğunu (permissions) da belirtmek isteyebiliriz.

Ayrıca özellikle log arama gibi durumlarda işe yarayabilecek farklı bir bilgi de aratabiliriz: dosya en son ne zaman değişmiş ya da dosyaya en son ne zaman erişilmiş.

Sıradan gidelim:

 

1. Owner

Eğer dosyanın hangi kullanıcıya ait olduğunu belirtmek istiyorsak -user flag kullanılır.

 

2. Size

Dosyanın büyüklüğü -size flag ile belirtilir. 

Sayısal değerler -n, +n, ve n formatlarında belirtilir, n bir number yani sayı gösterir. 

-n "n"den küçük olan değerler, +n "n"den büyük olan değerler ve n "n"ye eşit olan değerleri belirtmek için kullanılır. 

-size flag ile dosyanın büyüklüğünü belirmek için ihtiyacımız olan diğer bir bilgi ise suffix (son ek)tir. Yani dosyanın byte mı, kilobyte mı megabyte mı olduğunu belirtmemiz gerekir.

c byte için kullanılan suffix, k kilobyte için kullanılan suffix, ve M megabyte için kullanılan suffixdir. 

Yani eğer 50 byte'tan küçük dosyaları aramak istiyorsak kullanım -30c şeklinde olacaktır.


3. Permissions


Belirli dosyalara erişimin yalnız belirli kullanıcılar ile kısıtlanabildiğini biliyoruz.

-perm
flag bu izinlerin belirtilmesi için kullanılır ve octal (örn. 777)ya da sembolik olarak belirtilebilir (örn. u=r).
 
u user yani kullanıcı, g gruplar, o other users (kullanıcı ve gruplar dışında kalanlar) ve a "all" yani tümü için kullanılır. Varsayılan ayar a 'dır.

Yukarıdaki örnekte u=r mevcut kullanıcının okuma izni olan dosyaları belirtmektedir.
The default is a.

İzinlerin octal ve sembolik yazımları, ne anlama geldikleri ve nasıl değiştirilebilecekleri hakkında https://www.howtogeek.com/437958/how-to-use-the-chmod-command-on-linux/ linkinde detaylı bilgi bulunuyor.
 
Yukarıdaki şekilde 777 ya da u=r gibi bir belirteç kullanıldığında find yalnızca buna tam olarak uyan sonuçları getirecektir. Aramayı biraz daha genişletmek istersek ya da / öneklerini kullanabiliriz. 
kullanılması sonucu en az belirlenen izinlere sahip dosyalar ile döndürür. 
Birisinin yazma ve / veya yürütme izinlerine sahip olsa bile, -444 modunun herkes tarafından okunabilen dosyalarla eşleşeceği anlamına gelir.
 
/ kullanılması sonucu ayarlanan izinlerden herhangi biriyle eşleşen dosyaları döndürür. 
/ 666 modunun, gruplardan en az biri (sahip, grup veya diğerleri) tarafından okunabilen ve yazılabilen dosyalarla eşleşeceği anlamına gelir.

Time-related (Zaman ile ilgili) Aramalar

Find komutu ile yapabildiğimiz bu aramalar daha komplekstir ancak bazı durumlarda çok faydalı olabilir.

Time-related aramalar için kullanılan flag bir kelime ve bir ekten oluşur.

Kelimeler  min (minutes) ve time (days) olarak kullanılır.

Ekler ise a (accessed), m(modified) ve c(changed)'dir ve aşağıdaki anlamları taşır: 

a (accessed): Dosyaya son erişilen zaman

m(modified): Dosyanın son düzenlendiği zaman

c(changed): Dosyanın durumunun son değiştirildiği zaman

Numerik değerler için -size flag ile aynı kurallar geçerlidir.

ÖRNEK:

Eğer bir dosyaya  en son 30 dakikadan daha uzun zaman önce erişim sağlandığını belirtmek istiyorsak aşağıdaki şekilde belirtilecektir:

-amin +30 

Eğer 7 gün içerisinde (7 günden önce) değişiklik yapıldığını belirtmek istiyorsak:

-mtime -7 

DİKKAT: Bir dosyanın son 24 saat içinde değiştirildiğini belirtmek istediğinizde, -mtime 0 seçeneği kullanılır.)

Bilinmesi gereken önemli 2 konu daha var:

1. > yönlendirme operatörü find komutuyla kullanılabilir. Böylece arama sonuçları bir dosyaya kaydedebilir ve daha da önemlisi, çıktının daha okunaklı olmasını sağlamak için olası hataların çıktıları bastırılabilir.
 

2. Ben hemen hemen her find ile yaptığım aramanın sonuna 2>/dev/null ekledim. Bu şekilde bazı durumlarda yüzlerce çıkabilen "Permission denied" hatasından kurtuldum. 2> /dev/null kullandığınızda karşınıza yalnız erişim izniniz bulunan dosyalar çıkar.

 

BÖLÜM SONU CANAVARI:

 
1. "sinem" kullanıcısına ait tüm dosyaları bulun
2. Tam olarak 100 bayt boyutunda olan tüm dosyaları bulun
3. /Home dizininde 1 KiB’den küçük ve ".txt" uzantılı tüm dosyaları bulun
4. Sahibi tarafından tam olarak okunabilen ve yazılabilen, herkes tarafından okunabilen tüm dosyaları bulun (OCTAL format)
5. Yalnızca herkes tarafından okunabilen tüm dosyaları bulun (OCTAL format kullanın)
6. Diğer izinlerden bağımsız olarak "others" grubu için ".sh" uzantılı tüm dosyaları bulun (sembolik format)
7. /Usr/bin dizinindeki root kullanıcısına ait ve en azından SUID iznine sahip tüm dosyaları bulun (sembolik format)
8. ".Png" uzantısıyla son 10 gün içinde erişilemeyen tüm dosyaları bulun
9. / Usr / bin dizinindeki son 2 saat içinde değiştirilmiş tüm dosyaları bulun

CEVAPLAR:
 
1. find / -type f -user sinem
2. find / -type f -size 100c
3. find /home -type f -size -1k -name "*.txt"
4. find / -type f -perm 644
5. find / -type f -perm 444
6. find / -type f -perm u=w -name "*.sh"
7. find /usr/bin -type -f -user root -perm /u=s
8. find / -type f -atime -10 -name "*.png"
9. find /usr/bin -type f -mmin -120  





Hiç yorum yok:

Yorum Gönder

John the Ripper ile Şifre Kırmak

  JOHN THE RIPPER ARACIYLA ŞİFRE KIRMAK  John The Ripper, açık kaynak ve ücretsiz bir şifre kırma aracı. Her ne kadar Unix için çıkmış ols...