Lablara erişmek için: https://tryhackme.com/r/room/linuxfundamentalspart1 , https://tryhackme.com/r/room/linuxfundamentalspart2 , https://tryhackme.com/r/room/linuxfundamentalspart3
“Linux Temelleri” oda serisinin ilk bölümüne hoş geldiniz. Büyük olasılıkla bir Windows veya Mac makine kullanıyorsunuz, her ikisi de görsel tasarım ve çalışma şekilleri açısından farklıdır. Tıpkı Windows, iOS ve MacOS gibi Linux da başka bir işletim sistemidir ve akıllı arabalara, android cihazlara, süper bilgisayarlara, ev aletlerine, kurumsal sunuculara ve daha fazlasına güç veren dünyanın en popüler işletim sistemlerinden biridir. Linux’un arkasındaki bazı tarihi konuları ele alacağız ve sonunda bir Linux sihirbazı olma yolculuğunuza başlayacağız! Bu odada şunları yapacaksınız: Tarayıcınızda etkileşimli bir Linux makinesinde ilk komutlarınızı çalıştırmak Dosya sistemiyle etkileşim için kullanılan bazı temel komutları öğretmek Dosyaları nasıl arayabileceğinizi göstermek ve shell operatörlerini tanıtmak.
Linux Nerelerde Kullanılır?
Linux’un, Windows gibi işletim sistemlerine (OS) kıyasla yaklaşılması çok daha göz korkutucu olduğu söylenebilir. Her iki çeşidin de kendi avantajları ve dezavantajları vardır. Örneğin, Linux oldukça daha hafif bir işletim sistemidir ve her gün bir şekilde Linux kullandığınızdan emin olabilirsiniz! Linux, aşağıdakiler gibi şeyleri güçlendirir:
- Ziyaret ettiğiniz web siteleri
- Araba eğlence/kontrol panelleri
- Mağazalardaki satış noktası (PoS) sistemleri, örneğin ödeme noktaları ve kasalar
- Trafik ışığı kontrolörleri veya endüstriyel sensörler gibi kritik altyapılar
Linux Çeşitleri
“Linux” adı aslında UNIX (başka bir işletim sistemi) tabanlı birden fazla işletim sistemi için bir şemsiye terimdir. Linux’un açık kaynak olması sayesinde, Linux’un çeşitleri, sistemin ne için kullanıldığına en uygun olacak şekilde her türlü şekil ve boyutta gelir.
Örneğin, Ubuntu ve Debian, oldukça yaygın Linux dağıtımlarıdır çünkü çok genişletilebilirler. Yani Ubuntu’yu bir sunucu olarak (web siteleri ve web uygulamaları gibi) veya tam teşekküllü bir masaüstü olarak çalıştırabilirsiniz. Bu seri için, Ubuntu kullanacağız.
Ubuntu Server, yalnızca 512MB RAM ile çalışabilir.
Windows’un farklı sürümleri (7, 8 ve 10) olduğu gibi, Linux’un da birçok farklı sürümü/dağıtımı vardır.
Araştırma: Linux işletim sisteminin ilk sürümü hangi yıl yayınlandı?
Cevap: 1991
linux makine’ye nasıl erişeceğinizi anlatan bir yazı bulunmakta start machine diyerek makinenizi aktif edin.
Daha önce de bahsettiğimiz gibi, Ubuntu gibi işletim sistemlerini kullanmanın en büyük avantajlarından biri ne kadar hafif olabildikleridir. Elbette bunun dezavantajları da yok değil; örneğin, genellikle GUI (Grafik Kullanıcı Arayüzü) ya da makineyle etkileşim kurmak için kullanabileceğimiz bir masaüstü ortamı (yüklü değilse) bulunmuyor. Bu sistemlerle etkileşime geçmenin büyük bir kısmı “Terminal” kullanmaktır. “Terminal” tamamen metin tabanlıdır ve ilk başta göz korkutucudur. Bununla birlikte, bazı komutları parçalara ayırırsak, bir süre sonra terminali kullanmaya hızlı bir şekilde aşina olursunuz!
Dosyalara gitmek, içeriklerinin çıktısını almak ve dosya oluşturmak gibi temel işlevleri yapabilmemiz gerekiyor! Bunu yapmak için gereken komutlar kendiliğinden açıklayıcıdır (tabii ki ne olduklarını bildikten sonra…) Aşağıdaki tabloda ayrıştırdığım ilk iki komutla başlayalım:
Komut | Açıklama |
---|---|
echo | Verilen herhangi bir metni çıktılar. |
whoami | Şu anda hangi kullanıcı olarak oturum açtığımızı öğrenir. |
Kullanılan her komutun bir örneği için aşağıdaki parçacıklara bakın…
Using echo
tryhackme@linux1:~$ echo "Hello Friend!"
Using whoami to find out the username of who we’re logged in as
tryhackme@linux1:~$ whoami
Soru: Eğer “TryHackMe” metninin çıktısını almak isteseydik, komutumuz ne olurdu?
Cevap: echo tryhackme
Deploy edilmiş Linux makinenizde oturum açtığınız kişinin kullanıcı adı nedir?
Cevap: tryhackme
Dosya Sistemi ile Etkileşim
Komutlar:
Komut | Tam Adı |
---|---|
ls | listeleme |
cd | dizin değiştirme |
cat | birleştirme (concatenate) |
pwd | mevcut çalışma dizinini yazdırma (print working directory) |
- Geçerli Dizinimizdeki Dosyaları Listeleme (ls)
İlk olarak, mevcut dizinimizde ne olduğunu bilmeliyiz. Bu, “ls” komutu kullanılarak yapılır.
tryhackme@linux1:~$ ls
'Önemli Dosyalar' 'Belgelerim' Notlar Resimler
Bu çıktıda, aşağıdaki dizinlerin mevcut olduğunu görebiliriz:
- Önemli Dosyalar
- Belgelerim
- Notlar
- Resimler
İpucu: ls ve dizin adını kullanarak, o dizinin içeriğini listeleyebilirsiniz. Örneğin, ls Resimler
.
- Geçerli Dizinimizi Değiştirme (cd)
Artık hangi klasörlerin mevcut olduğunu bildiğimize göre, “cd” komutunu kullanarak bu dizinlere geçiş yapabiliriz. Örneğin, “Resimler” dizinine geçmek için cd Resimler
yazarız:
tryhackme@linux1:~/Resimler$ ls
kopek_resim1.jpg kopek_resim2.jpg kopek_resim3.jpg kopek_resim4.jpg
Bu durumda, dört tane köpek resmi olduğu görülüyor.
- Bir Dosyanın İçeriğini Çıktılama (cat)
Dosyaların içeriğini görmek için “cat” komutunu kullanırız. Örneğin, “Belgeler” dizininde bir “todo.txt” dosyası varsa, bunun içeriğini aşağıdaki gibi görüntüleyebiliriz:
tryhackme@linux1:~/Belgeler$ ls
todo.txt
tryhackme@linux1:~/Belgeler$ cat todo.txt
Yapmam gereken önemli bir şey var!
Bu örnekte:
- “ls” komutunu kullanarak “Belgeler” klasöründe mevcut dosyaları listeledik.
cat todo.txt
komutunu kullanarak “todo.txt” dosyasının içeriğini çıktıladık: “Yapmam gereken önemli bir şey var!”
İpucu: cat
ve dosya adını kullanarak, bir dosyanın içeriğini görüntüleyebilirsiniz. Örneğin, cat /home/ubuntu/Belgeler/todo.txt
.
- Geçerli Çalışma Dizinimizin Tam Yolunu Bulma (pwd)
Mevcut çalışma dizinimizi bulmak için “pwd” komutunu kullanırız. Bu, o an hangi dizinde olduğumuzu tam olarak gösterir:
tryhackme@linux1:~/Belgeler$ pwd
/home/ubuntu/Belgeler
Bu komut:
- “Belgeler” dizininde olduğumuzu doğrular.
- Bu “Belgeler” dizininin tam yolunun “/home/ubuntu/Belgeler” olduğunu gösterir.
Bu bilgiyi kullanarak, gelecekte dizin değiştirmek için cd /home/ubuntu/Belgeler
komutunu kullanabiliriz.
Bu komutlar, Linux dosya sisteminde gezinmek ve dosyalarla etkileşim kurmak için temel araçlardır.
Soru: Deploy ettiğiniz Linux makinesinde kaç tane klasör var?
Cevap: 4
Soru: Hangi dizin bir dosya içerir?
Cevap: folder4
Bu dosyanın içeriği nedir?
Cevap: Hello World!
Bu dosyaya gitmek ve yeni geçerli çalışma dizinini bulmak için cd komutunu kullanın. Yol nedir?
Cevap: /home/tryhackme/folder4
Linux’un Etkili Kullanımı
Görünüşe göre öyle değil gibi görünse de, Linux’un en etkileyici özelliklerinden biri gerçekten ne kadar verimli olabileceğinizdir. Elbette, bu yalnızca ne kadar aşina olduğunuzla sınırlıdır. Ubuntu gibi işletim sistemleriyle (OS) zamanla etkileşime geçtikçe, şimdiye kadar öğrendiğimiz temel komutlar kas hafızasına yerleşmeye başlayacaktır.
Bu sistemlerin ne kadar verimli olabileceğini göstermek için, kullanıcı erişimine sahip olduğumuz tüm sistemde dosyaları hızla aramak için komutlar kullanabiliriz. Sürekli olarak cd ve ls komutlarını kullanmak yerine, find gibi komutlarla bu tür işleri otomatikleştirebiliriz.
Bu noktada Linux biraz daha göz korkutucu hale gelmeye başlar, ancak bunu parçalara ayırıp size kolaylaştıracağız.
Find Kullanımı
find komutu harikadır çünkü çok basit veya oldukça karmaşık bir şekilde kullanılabilir, tam olarak ne yapmak istediğinize bağlı olarak. Ancak, öncelikle temellere bağlı kalalım.
Aşağıdaki kod parçacığını alın; kullanılabilir dizinlerin bir listesini görebiliriz:
“ls” Kullanarak Geçerli Dizinimizin İçeriğini Listeleme
tryhackme@linux1:~$ ls
Masaüstü Belgeler Resimler klasör1
tryhackme@linux1:~$
- Masaüstü
- Belgeler
- Resimler
- klasör1
Şimdi, elbette, dizinler kendileri içinde daha fazla dizin içerebilir. Belirli dosyaları aramak için her birini incelemek zorunda kaldığımızda bu bir baş ağrısı olabilir. find komutunu kullanarak bunu bizim için yapabiliriz!
Basit başlayalım ve aradığımız dosyanın adını zaten bildiğimizi varsayalım, ancak tam olarak nerede olduğunu hatırlamıyoruz! Bu durumda, “passwords.txt” dosyasını arıyoruz.
Dosya adını hatırlarsak, find -name passwords.txt
komutunu kullanarak bu belirli dosyayı geçerli dizinimizdeki her klasörde arayabiliriz:
“find” Kullanarak “passwords.txt” Adlı Dosyayı Bulma
tryhackme@linux1:~$ find -name passwords.txt
./klasör1/passwords.txt
tryhackme@linux1:~$
find komutu dosyayı bulmayı başardı — meğer “klasör1/passwords.txt” konumundaymış — harika. Ama diyelim ki dosyanın adını bilmiyoruz veya .txt uzantılı her dosyayı aramak istiyoruz. find bunu da yapmamıza olanak tanır!
Basit bir joker karakter (*) kullanarak .txt ile biten herhangi bir şeyi arayabiliriz. Bizim durumumuzda, geçerli dizinimizdeki tüm .txt dosyalarını bulmak istiyoruz. find -name *.txt komutunu kullanacağız. find komutu her .txt dosyasını buldu ve her birinin konumunu verdi:
“find” Kullanarak .txt Uzantılı Dosyaları Bulma
tryhackme@linux1:~$ find -name *.txt
./klasör1/passwords.txt
./Belgeler/todo.txt
tryhackme@linux1:~$
find komutu şunları buldu:
- “passwords.txt” dosyası “klasör1” içinde bulunuyor
- “todo.txt” dosyası “Belgeler” içinde bulunuyor
Bu çok da zor değildi, değil mi?
Grep Kullanımı
Öğrenmesi harika olan bir başka yardımcı program da grep’in kullanımıdır. grep komutu, belirli değerleri aramak için dosyaların içeriğini taramamıza olanak tanır.
Örneğin, bir web sunucusunun erişim günlüğünü ele alalım. Bu durumda, bir web sunucusunun access.log dosyasında 244 giriş var.
“wc” Kullanarak “access.log” Dosyasındaki Girişleri Sayma
tryhackme@linux1:~$ wc -l access.log
244 access.log
tryhackme@linux1:~$
cat gibi bir komut burada pek işe yaramayacaktır. Örneğin, belirli bir kullanıcı/IP adresinin ziyaret ettiği şeyleri aramak istiyorsak, 244 giriş arasında arama yapmak pek de verimli değildir.
grep komutunu kullanarak bu dosyanın tamamını, aradığımız değerin bulunduğu tüm girişleri arayabiliriz. Bir web sunucusunun erişim günlüğü örneği ile devam edersek, “81.143.211.90” IP adresinin ziyaret ettiği her şeyi görmek istiyoruz (bu hayali bir IP adresidir).
“grep” Kullanarak “access.log” Dosyasındaki “81.143.211.90” IP Adresini Bulma
tryhackme@linux1:~$ grep "81.143.211.90" access.log
81.143.211.90 - - [25/Mar/2021:11:17 + 0000] "GET / HTTP/1.1" 200 417 "-" "Mozilla/5.0 (Linux; Android 7.0; Moto G(4))"
tryhackme@linux1:~$
grep komutu bu dosyayı taradı ve verdiğimiz değeri içeren tüm girişleri bize gösterdi.
Soru: “THM” ön ekine sahip bayrağı bulmak için “access.log” üzerinde grep kullanın. Bayrak nedir?
Cevap:THM{ACCESS}
Linux operatörleri, Linux ile çalışırken bilginizi güçlendirmenin harika bir yoludur. Değinmeye değer birkaç önemli operatör vardır. Temellere değineceğiz ve bunları küçük parçalara ayıracağız.
Genel bir bakışta, aşağıdaki operatörleri göstereceğim:
Sembol / Operatör | Açıklama |
---|---|
& | Bu operatör, komutları terminalinizin arka planında çalıştırmanıza olanak tanır. |
&& | Bu operatör, terminalinizde bir satırda birden fazla komutu birleştirmenize olanak tanır. |
> | Bu operatör bir yönlendiricidir – bu, bir komutun çıktısını (örneğin bir dosyanın çıktısını almak için cat kullanmak) başka bir yere yönlendirebileceğimiz anlamına gelir. |
>> | Bu operatör, > operatörü ile aynı işlevi yapar, ancak çıktıyı ekler, yani hiçbir şeyin üzerine yazılmaz. |
Bu operatörleri biraz daha ayrıntılı olarak ele alalım.
Operatör “&”
Bu operatör, komutları arka planda çalıştırmamıza olanak tanır. Örneğin, büyük bir dosyayı kopyalamak istediğimizi varsayalım. Bu, oldukça uzun sürecek ve dosya başarılı bir şekilde kopyalanana kadar başka hiçbir şey yapmamızı engelleyecektir.
“&” kabuk operatörü, bir komut yürütmemizi ve bunun arka planda çalışmasını sağlar (örneğin bu dosya kopyalama) ve bu sayede başka işler yapmamıza olanak tanır!
Operatör “&&”
Bu kabuk operatörü, ne kadar aşina olunduğuna göre biraz yanıltıcıdır. “&” operatöründen farklı olarak, “&&” operatörünü komutlar listesini çalıştırmak için kullanabiliriz. Örneğin, command1 && command2 şeklinde. Ancak, command2’nin yalnızca command1 başarılı olduysa çalışacağını belirtmek gerekir.
Operatör “>”
Bu operatör, çıktı yönlendirici olarak bilinir. Bu, temel olarak, çalıştırdığımız bir komutun çıktısını alıp başka bir yere gönderebileceğimiz anlamına gelir.
Bunun harika bir örneği, Görev 4’te öğrendiğimiz echo komutunun çıktısını yönlendirmektir. Elbette, echo howdy gibi bir şey çalıştırmak “howdy” sonucunu terminalimize geri döndürecektir — bu çok kullanışlı değil. Bunun yerine, “howdy” çıktısını yeni bir dosyaya yönlendirebiliriz!
Diyelim ki “hey” mesajı ile “welcome” adlı bir dosya oluşturmak istiyoruz. echo hey > welcome komutunu çalıştırabiliriz ve dosya “hey” içeriği ile oluşturulacaktır:
> Operatörünü Kullanma
tryhackme@linux1:~$ echo hey > welcome
“welcome” Dosyasının İçeriğini cat ile Görüntüleme
tryhackme@linux1:~$ cat welcome
hey
Not: Eğer “welcome” gibi bir dosya zaten varsa, içeriği üzerine yazılır!
Operatör “>>”
Bu operatör de bir çıktı yönlendiricidir, ancak daha önce tartıştığımız > operatöründen farklıdır. Bu operatör, içeriği dosyanın sonuna ekler, yani içeriği değiştirmez.
Önceki örneğe devam edersek, “hey” içeriğine sahip “welcome” adlı dosyamız olduğunu varsayalım. echo komutunu kullanarak > operatörü ile “hello” eklemek istersek, dosya artık sadece “hello” içerecektir ve “hey” kaybolacaktır.
operatörü, içeriği dosyanın sonuna eklememize olanak tanır:
>> Operatörünü Kullanma
tryhackme@linux1:~$ echo hello >> welcome
“welcome” Dosyasının İçeriğini cat ile Görüntüleme
tryhackme@linux1:~$ cat welcome
hey
hello
Soru 1: Bir komutu arka planda çalıştırmak istesek, hangi operatörü kullanmalıyız?
Cevap: &
Soru 2: “passwords” adlı bir dosyanın içeriğini “password123” ile değiştirmek istesem, komutum ne olur?
Cevap: echo password123 > passwords
Soru 3: Şimdi “passwords” adlı dosyaya “password123” ile birlikte “tryhackme” eklemek istersem, komutum ne olur?
Cevap: echo tryhackme >> passwords
Soru 4: cevap vermeye gerek yok
Tebrikler, bu aşamaya gelmeyi başardınız! Linux ile ilk etkileşimleriniz için oldukça fazla şey öğrendik. Ancak, bunlar bir Linux makinesiyle etkileşimde bulunurken kullanacağınız en temel işlevlerdir.
Bu odanın sizin için zorlayıcı olmamış olmasını umuyorum. Daha önce de belirttiğim gibi, bu şeylere çok sık kullanacağınız için çok çabuk aşina olacaksınız.
Hızlıca özetlemek gerekirse, şunları öğrendik:
- Linux’un bugün neden bu kadar yaygın olduğunu anlama
- İlk Linux makinenizle etkileşime geçme!
- En temel komutlardan bazılarını çalıştırma
- Dosya sisteminde gezinmeye giriş ve verileri bulmayı daha verimli hale getirmek için find ve grep gibi komutları kullanmayı öğrendik!
- Komutlarınızı güçlendirmek için önemli kabuk operatörlerinden bazılarını öğrenme
Bu odada biraz vakit geçirin ve öğrendiklerinizi pekiştirin. Kendinizi biraz daha rahat hissettiğinizde, Linux Temelleri Bölüm 2’ye geçin.
Şimdi Linux Fundementals Part 2‘ ile devam edelim.
Elden geçirilmiş “Linux Temelleri” serisinin ikinci bölümüne hoş geldiniz. Bu serinin ilk bölümündeki bilgilerimizi uygulayacağız, bu nedenle daha fazla ilerlemeden önce o odayı tamamlamanızı şiddetle tavsiye ederim. 2. bölümde, tarayıcı içi işlevselliği bir kenara bırakacağız ve uzak makinelerin terminallerine giriş yapabilmek ve bunları kontrol edebilmek için temel bir beceri olan başlangıç yapmanıza yardımcı olacağız. Sadece bu değil, aynı zamanda oda size şunları da sunacak: Bayrakları ve argümanları kullanmayı tanıtarak ilk birkaç komutunuzun potansiyelini ortaya çıkarmak Dosyaları kopyalamak ve taşımak gibi daha kullanışlı komutları gerçekleştirmek için dosya sistemi bilginizi ilerletmek Dosya ve klasörlere erişimin nasıl yönetildiğini ve erişimimizi nasıl belirleyebileceğimizi keşfetmek İlk birkaç komut dosyanızı ve çalıştırılabilir dosyanızı çalıştırmak!
hemen makinenize ssh atın ve gelin bölümde zaten nasıl yapmanız gerektiği adım adım anlatılmış bu kısmı es geçiyorum.
Çoğu komut, argümanların sağlanmasına izin verir. Bu argümanlar, bir tire (-) ve belirli bir anahtar kelime ile tanımlanır; bu anahtar kelimelere bayraklar veya anahtarlar denir.
Daha sonra hangi komutların argümanlara izin verdiğini ve bunların tam olarak ne yaptığını nasıl belirleyebileceğimizi tartışacağız.
Bir komut kullanırken, aksi belirtilmedikçe, varsayılan davranışını gerçekleştirecektir. Örneğin, ls
çalıştığımız dizinin içeriğini listeler. Ancak, gizli dosyalar gösterilmez. Komutların davranışını genişletmek için bayraklar ve anahtarlar kullanabiliriz.
ls
örneğimizi kullanarak, ls
bize aşağıdaki ekranda gösterildiği gibi yalnızca “folder1” adlı bir klasör olduğunu bildirir. Aşağıdaki ekran görüntülerindeki içeriklerin yalnızca örnekler olduğunu unutmayın.
Bir dizinin içeriğini görüntülemek için ls
kullanma:
tryhackme@linux2:~$ ls
folder1
tryhackme@linux2:~$
Ancak, -a
argümanını (tümünün kısaltması) kullandıktan sonra, aniden “.hiddenfolder” gibi birkaç dosya ve klasör içeren bir çıktı alırız. .
ile başlayan dosyalar ve klasörler gizli dosyalardır.
Gizli klasörleri görüntülemek için ls
kullanma:
tryhackme@linux2:~$ ls -a
.hiddenfolder folder1
tryhackme@linux2:~$
Bu komutları kabul eden komutların bir de --help
seçeneği vardır. Bu seçenek, komutun kabul ettiği olası seçenekleri listeleyecek, kısa bir açıklama sağlayacak ve nasıl kullanılacağına dair bir örnek sunacaktır.
ls
komutu ile kullanabileceğimiz seçenekleri listeleme:
tryhackme@linux2:~$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE with -l, scale sizes by SIZE when printing them;
e.g., '--block-size=M'; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information);
with -l: show ctime and sort by name;
otherwise: sort by ctime, newest first
-C list entries by columns
--color[=WHEN] colorize the output; WHEN can be 'always' (default
if omitted), 'auto', or 'never'; more info below
-d, --directory list directories themselves, not their contents
-D, --dired generate output designed for Emacs' dired mode
-f do not sort, enable -aU, disable -ls --color
-F, --classify append indicator (one of */=>@|) to entries
--file-type likewise, except do not append '*'
--format=WORD across -x, commas -m, horizontal -x, long -l,
single-column -1, verbose -l, vertical -C
--full-time like -l --time-style=full-iso
-g like -l, but do not list owner
--group-directories-first
tryhackme@linux2:~$
Bu seçenek, aslında man sayfasının (kısaltması manuel) biçimlendirilmiş bir çıktısıdır ve bu, Linux komutları ve uygulamaları için belgeler içerir.
Man(ual) Sayfası
Manuel sayfalar, hem sistem komutları hem de bir Linux makinesinde bulunan uygulamalar için harika bir bilgi kaynağıdır ve bu makinenin kendisinde ve çevrimiçi olarak erişilebilir.
Bu belgeleri görüntülemek için man
komutunu ve ardından belgesini okumak istediğimiz komutu kullanabiliriz. ls
örneğimizi kullanarak, ls
için manuel sayfaları görüntülemek için man ls
kullanırdık:
ls
komutu ile kullanabileceğimiz seçenekleri listeleme:
tryhackme@linux2:~$ man ls
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of
-cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and ..
--author
with -l, print the author of each file
-b, --escape
print C-style escapes for nongraphic characters
--block-size=SIZE
with -l, scale sizes by SIZE when printing them; e.g., '--block-size=M'; see SIZE format below
Manual page ls(1) line 1 (press h for help or q to quit)
Soru: Kılavuz sayfasında gezinmek için hangi yön ok tuşunu kullanacağız?
Cevap: Down
Soru: Çıktıyı “insan tarafından okunabilir” bir şekilde görüntülemek için hangi bayrağı kullanacağız?
Cevap: -h
Linux makinelerinde dosya sistemiyle etkileşim kurarken en temel komutlardan bazılarını ele aldık. Örneğin, ls ve find komutlarıyla klasörlerin içeriğini listelemeyi ve bulmayı ve cd komutuyla dosya sisteminde gezinmeyi öğrendik.
Bu görevde, dosya sistemiyle etkileşim kurmak için daha fazla komut öğreneceğiz ve şunları yapmamıza izin verecek komutları öğreneceğiz:
- dosya ve klasör oluşturma
- dosya ve klasör taşıma
- dosya ve klasör silme
Daha spesifik olarak, aşağıdaki komutları ele alacağız:
Komut | Tam Adı | Amacı |
---|---|---|
touch | touch | Dosya oluşturma |
mkdir | make directory | Klasör oluşturma |
cp | copy | Dosya veya klasör kopyalama |
mv | move | Dosya veya klasör taşıma |
rm | remove | Dosya veya klasör silme |
file | file | Bir dosyanın türünü belirleme |
İpucu: cat kullanırken olduğu gibi, bu komutlar için tam dosya yollarını da belirtebiliriz, yani directory1/directory2/note gibi.
Dosya ve Klasör Oluşturma (touch, mkdir)
Linux’ta dosya ve klasör oluşturmak basit bir işlemdir. İlk olarak, bir dosya oluşturmayı ele alacağız. touch komutu tam olarak bir argüman alır – oluşturmak istediğimiz dosyaya vermek istediğimiz isim. Örneğin, touch note komutunu kullanarak “note” dosyasını oluşturabiliriz. touch sadece boş bir dosya oluşturur. Boş dosyaya içerik eklemek için echo gibi komutlar veya nano gibi metin düzenleyicileri kullanmamız gerekir.
tryhackme@linux2:~$ touch note
tryhackme@linux2:~$ ls
folder1 note
Bu, bir klasör oluşturmak için mkdir komutunu kullanmak kadar basit bir işlemdir ve yine oluşturmak istediğimiz dizine vermek istediğimiz adı belirtiriz. Örneğin, mkdir mydirectory komutunu kullanarak “mydirectory” dizinini oluşturabiliriz.
tryhackme@linux2:~$ mkdir mydirectory
tryhackme@linux2:~$ ls
folder1 mydirectory note
Dosya ve Klasör Silme (rm)
rm, şu ana kadar ele aldığımız komutlar arasında dikkat çekicidir. Dosyaları rm komutunu kullanarak basitçe silebilirsiniz. Ancak, bir dizini silmek için -R anahtarını dizin adıyla birlikte belirtmeniz gerekir.
tryhackme@linux2:~$ rm note
tryhackme@linux2:~$ ls
folder1 mydirectory
tryhackme@linux2:~$ rm -R mydirectory
tryhackme@linux2:~$ ls
folder1
Dosya ve Klasör Kopyalama ve Taşıma (cp, mv)
Linux makinesinde dosya kopyalama ve taşıma önemli bir işlevdir. cp ile başlayarak, bu komut iki argüman alır:
- Mevcut dosyanın adı
- Kopyalanacak yeni dosyanın adı
cp, mevcut dosyanın tüm içeriğini yeni dosyaya kopyalar. Aşağıdaki ekranda, “note” dosyasını “note2” olarak kopyalıyoruz.
tryhackme@linux2:~$ cp note note2
tryhackme@linux2:~$ ls
folder1 note note2
Bir dosyayı taşımak, tıpkı cp komutunda olduğu gibi iki argüman alır. Ancak, mv yeni bir dosya oluşturmak veya mevcut dosyayı kopyalamak yerine, ikinci argüman olarak belirtilen dosyayı birleştirir veya değiştirir. mv komutunu bir dosyayı yeni bir klasöre taşımak için kullanabileceğiniz gibi, bir dosya veya klasörün adını değiştirmek için de kullanabilirsiniz. Aşağıdaki örnekte, “note2” dosyasını “note3” olarak yeniden adlandırıyoruz. “note3” artık “note2″nin içeriğine sahip olacaktır.
tryhackme@linux2:~$ mv note2 note3
tryhackme@linux2:~$ ls
folder1 note note3
Dosya Türünü Belirleme
Dosyaların amacı veya içeriği hakkında varsayımlarda bulunmak yanıltıcı olabilir ve insanları sık sık yanıltır. Dosyaların amacını kolaylaştırmak için genellikle bir uzantısı vardır. Örneğin, metin dosyaları genellikle “.txt” uzantısına sahiptir. Ancak, bu zorunlu değildir.
Örneklerimizde kullandığımız dosyaların şu ana kadar bir uzantısı yoktu. Dosyanın neden orada olduğunu bilmeden – amacını gerçekten bilmiyoruz. Burada devreye file komutu giriyor. Bu komut bir argüman alır. Örneğin, “note” dosyasının gerçekten bir metin dosyası olup olmadığını doğrulamak için file komutunu kullanacağız.
tryhackme@linux2:~$ file note
note: ASCII text
Soru: “newnote” adlı dosyayı nasıl oluşturursunuz?
Cevap: touch newnote
Soru: makinede, “tryhackme’nin” home dizinindeki “unknown1” dosyasının türü nedir?
Cevap: ASCII text
Soru: “myfile” dosyasını “myfolder” dizinine nasıl taşıyabiliriz?
Cevap: mv myfile myfolder/
Soru: Bu dosyanın içeriği nedir?
Cevap: THM{FILESYSTEM}
Şimdiye kadar, bazı kullanıcıların belirli dosyalara veya klasörlere erişemediğini öğrendiniz. Önceki görevlerimizde, sahip olduğumuz erişim haklarını belirlemek ve nereye gittiğimizi görmek için bazı komutları nasıl kullanacağımızı keşfettik.
Daha önce, komutların bayraklar ve anahtarlar aracılığıyla nasıl genişletilebileceğini öğrendik. Örneğin, ls
komutu, mevcut dizindeki içerikleri listelemeye yarar. -l
anahtarını kullandığınızda, aşağıdaki ekran görüntüsünde olduğu gibi on sütun görürüz. Ancak, sadece ilk üç sütuna ilgi duyuyoruz:
ls -lh
kullanarak dizindeki tüm dosyaların izinlerini listelemek
tryhackme@linux2:~$ ls -lh
-rw-r--r-- 1 cmnatic cmnatic 0 Feb 19 10:37 file1
-rw-r--r-- 8 cmnatic cmnatic 0 Feb 19 10:37 file2
Görünüşte karmaşık olsa da, bu üç sütun, bir dosya veya klasörün belirli özelliklerini ve bu dosya veya klasöre erişimimizin olup olmadığını belirlemede çok önemlidir. Bir dosya veya klasör, aşağıdaki gibi birkaç özelliğe sahip olabilir:
- Okuma (Read)
- Yazma (Write)
- Çalıştırma (Execute)
Kullanıcılar Arası Geçiş
Linux’ta kullanıcılar arasında geçiş yapmak oldukça basittir, su
komutunu kullanarak bu geçişi gerçekleştirebilirsiniz. Root kullanıcısı (veya sudo
aracılığıyla root izinleri kullanarak) değilseniz, bu geçişi sağlamak için iki şeye ihtiyacınız vardır:
- Geçiş yapmak istediğiniz kullanıcı
- Kullanıcının şifresi
su
komutu bazı anahtarlar alabilir. Örneğin, bir komutu giriş yaptıktan sonra çalıştırma veya belirli bir shell kullanma gibi. Daha fazla bilgi için su
komutunun man sayfasını okumanızı öneririm. Ancak, -l
veya --login
anahtarını ele alacağım.
Basitçe, -l
anahtarını su
komutuna verdiğimizde, gerçek kullanıcı olarak sisteme giriş yapmayı daha çok taklit eden bir shell başlatırız — yeni kullanıcının birçok özelliğini miras alırız, örneğin ortam değişkenleri ve benzerleri.
su
ile kullanıcıya geçiş yapmak:
tryhackme@linux2:~$ su user2
Password:
user2@linux2:/home/tryhackme$
Örneğin, su
komutunu “user2″ye geçiş yapmak için kullandığınızda, yeni oturumunuz önceki kullanıcının ana dizinine düşer.
su -l
ile kullanıcıya geçiş yapmak:
tryhackme@linux2:~$ su -l user2
Password:
user2@linux2:~$ pwd
/user2@:/home/user2$
Burada, -l
kullandığınızda, yeni oturumunuz otomatik olarak “user2″nin ana dizinine düşer.
Soru: Makinede, “important” öğesinin sahibi kimdir?
Cevap: user2
Soru: user2’ye geçmek için komut ne olmalıdır?
Cevap: su user2
Soru: important dosyasının içeriğindeki flag nedir?
Cevap: THM{SU_USER2}
/etc
Bu kök dizini, sisteminizdeki en önemli kök dizinlerden biridir. “etc” (et cetera’nın kısaltması) klasörü, işletim sisteminiz tarafından kullanılan sistem dosyalarını depolamak için yaygın bir yerdir.
Örneğin, aşağıdaki ekran görüntüsünde vurgulanan “sudoers” dosyası, sudo veya kök kullanıcısı olarak bir dizi komutu çalıştırma iznine sahip kullanıcılar ve grupların listesini içerir.
Ayrıca, “passwd” ve “shadow” dosyaları da belirtilmiştir. Bu iki dosya, Linux için özeldir çünkü sisteminizdeki her kullanıcı için şifrelerin nasıl şifrelenmiş olarak saklandığını gösterir. Bu şifreleme genellikle sha512 formatında yapılır.
/etc dizininin bazı dikkat çekici içerikleri
tryhackme@linux2:/etc$ ls
shadow passwd sudoers sudoers.d
/var
“/var” dizini, “var” kelimesi değişken veriyi temsil eder ve Linux kurulumlarında bulunan ana kök klasörlerden biridir. Bu klasör, sistemde çalışan hizmetler veya uygulamalar tarafından sıklıkla erişilen veya yazılan verileri depolar. Örneğin, çalışan hizmetlerden ve uygulamalardan gelen günlük dosyaları burada saklanır (/var/log), veya belirli bir kullanıcıya bağlı olmayan diğer veriler (örneğin, veritabanları) bu dizinde bulunur.
/var dizininin bazı dikkat çekici içerikleri
tryhackme@linux2:/var$ ls
backups log opt tmp
/root
“/home” dizininden farklı olarak, “/root” klasörü doğrudan “root” sistem kullanıcısının ana dizinidir. Bu dizin, kök kullanıcı için yalnızca ana dizin olarak kullanılır. Genellikle, bu kullanıcının verileri varsayılan olarak “/home/root” gibi bir dizinde bulunur, ancak bu dizin kök kullanıcının ev dizinidir.
/root dizininin bazı dikkat çekici içerikleri
root@linux2:~# ls
myfile myfolder passwords.xlsx
/tmp
Bu dizin, Linux kurulumlarında bulunan benzersiz bir kök dizinidir. “Temporary” (geçici) anlamına gelen /tmp dizini, yalnızca bir veya iki kez erişilmesi gereken verileri depolamak için kullanılır. Bilgisayar yeniden başlatıldığında, bu klasörün içeriği temizlenir, tıpkı bilgisayarınızdaki bellek gibi.
Penetrasyon testlerinde bizim için faydalı olan şey, varsayılan olarak herhangi bir kullanıcının bu klasöre yazabilmesidir. Yani, bir makineye erişim sağladığımızda, bu klasör bizim için toplama komut dosyalarımız gibi şeyleri depolamak için iyi bir yer olabilir.
/tmp dizininin bazı dikkat çekici içerikleri
root@linux2:/tmp# ls
todelete trash.txt rubbish.bin
Linux Fundementals 3‘den devam edelim:
Terminal Metin Editörleri
Şu ana kadar, dosyalara metin eklemek için echo komutu ve pipe operatörleri (> ve >>) kombinasyonunu kullandık. Ancak bu yöntem, birden fazla satıra sahip dosyalarla çalışırken verimli bir çözüm sunmaz.
Nano
Nano ile başlamak oldukça kolay! Nano kullanarak bir dosya oluşturmak veya düzenlemek için nano dosya_adı
komutunu kullanabilirsiniz — burada “dosya_adı” düzenlemek istediğiniz dosyanın adını temsil eder.
Nano’yu Tanıyalım
tryhackme@linux3:/tmp# nano myfile
GNU nano 4.8 myfile
^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos M-U Undo M-A Mark Text
^X Exit ^R Read File ^\ Replace ^U Paste Text ^T To Spell ^_ Go To Line M-E Redo M-6 Copy Text
Komutu çalıştırmak için enter tuşuna bastığınızda, nano açılacaktır ve metninizi girmeye veya düzenlemeye başlayabilirsiniz. Her satır arasında yukarı ve aşağı ok tuşları ile gezinebilir veya yeni bir satır başlatmak için klavyenizdeki “Enter” tuşunu kullanabilirsiniz.
Nano ile Metin Yazma
tryhackme@linux3:/tmp# nano myfile
GNU nano 4.8 myfile Modified
Hello TryHackMe
I can write things into "myfile"
^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos M-U Undo M-A Mark Text
^X Exit ^R Read File ^\ Replace ^U Paste Text ^T To Spell ^_ Go To Line M-E Redo M-6 Copy Text
Nano’nun hatırlaması kolay birkaç özelliği vardır ve genel olarak bir metin editöründen beklediğiniz temel işlevleri kapsar, bunlar arasında:
- Metin arama
- Kopyalama ve yapıştırma
- Satır numarasına atlama
- Hangi satırda olduğunuzu öğrenme
Bu özellikleri kullanmak için “Ctrl” tuşuna (Linux’ta ^ ile temsil edilir) ve ilgili harfe basabilirsiniz. Örneğin, çıkmak için “Ctrl” ve “X” tuşlarına basmak yeterlidir.
VIM
VIM, çok daha gelişmiş bir metin editörüdür. Tüm gelişmiş özelliklerini bilmenizi beklemiyoruz, ancak Linux becerilerinizi güçlendirmek için faydalı olabilir.
VIM’in bazı avantajları, daha uzun bir alışma süreci gerektirse de şunları içerir:
- Özelleştirilebilir – klavye kısayollarını kendi tercihinize göre değiştirebilirsiniz
- Söz Dizimi Renklendirme – kod yazarken veya bakım yaparken kullanışlıdır ve yazılım geliştiriciler arasında popüler bir tercihtir
- VIM, nano’nun yüklenmediği tüm terminallerde çalışır
- Kullanabileceğiniz çok sayıda kaynak, cheat sheet, eğitim ve benzeri materyaller mevcuttur
Daha fazla bilgi için TryHackMe’nin VIM’e odaklanan bir odası mevcuttur!
Soru: Nano kullanarak “tryhackme “nin home dizininde bulunan “task3” dosyasını düzenleyin. Bayrak nedir?
Cevap: THM{TEXT_EDITORS}
Dosya İndirme ve Transferi
Dosya İndirme – Wget
Bilgisayar dünyasında temel özelliklerden biri, dosyaları transfer edebilme yeteneğidir. Örneğin, bir program, script veya resim indirmek isteyebilirsiniz. Neyse ki, dosyaları indirmek için birkaç yöntem mevcut.
Bu görevde wget
komutunun kullanımını ele alacağız. Bu komut, web üzerindeki dosyaları HTTP üzerinden indirmenizi sağlar; sanki bir tarayıcıda dosyayı erişiyormuşsunuz gibi. İndirmek istediğiniz dosyanın adresini vermeniz yeterlidir. Örneğin, “myfile.txt” adlı dosyayı bilgisayarınıza indirmek istiyorsanız, web adresini bildiğinizi varsayarsak komut şu şekilde olacaktır:
wget https://assets.tryhackme.com/additional/linux-fundamentals/part3/myfile.txt
Dosya Transferi – SCP (SSH)
Secure Copy, veya SCP, güvenli bir şekilde dosya kopyalamak anlamına gelir. Normal cp
komutunun aksine, bu komut SSH protokolü kullanarak iki bilgisayar arasında dosya transferi sağlar ve hem kimlik doğrulama hem de şifreleme sunar.
SOURCE ve DESTINATION modeli kullanarak SCP komutu ile:
- Dosyaları ve dizinleri mevcut sisteminizden uzak bir sisteme kopyalayabilirsiniz.
- Dosyaları ve dizinleri uzak bir sistemden mevcut sisteminize kopyalayabilirsiniz.
Eğer her iki sistemde de kullanıcı adları ve şifreleri biliyorsanız, örneğin, önemli bir dosyayı uzak bir makineden kendi makinenize kopyalamak için SCP komutunu şu şekilde kullanabilirsiniz:
Uzak Makineden Dosya Kopyalama
scp [email protected]:/home/ubuntu/documents.txt notes.txt
Burada:
[email protected]:/home/ubuntu/documents.txt
uzak makinedeki dosyanın yolunotes.txt
ise yerel makinedeki dosya adı
Kendi Makinenizden Uzak Makineye Dosya Kopyalama
scp important.txt [email protected]:/home/ubuntu/transferred.txt
Burada:
important.txt
yerel makinedeki dosya adı[email protected]:/home/ubuntu/transferred.txt
uzak makinedeki hedef yol
Dosyaları Sunma – WEB
Ubuntu makineleri, python3 ile birlikte gelir ve Python, “HTTPServer” adlı hafif ve kullanımı kolay bir modül sunar. Bu modül, bilgisayarınızı hızlı ve kolay bir web sunucusuna dönüştürür ve dosyalarınızı sunmanızı sağlar, böylece diğer bilgisayarlar wget ve curl gibi komutlarla bu dosyaları indirebilirler.
Python3’ün “HTTPServer” modülü, komutu çalıştırdığınız dizindeki dosyaları sunar, ancak bu dizini değiştirmek için manuel sayfalarda bulabileceğiniz seçenekler sunar. Komutu çalıştırmak için terminalde şu komutu kullanın:
Python ile Web Sunucusu Başlatma
python3 -m http.server
Örneğin, “webserver” adlı bir dizinden “file” adlı dosyayı sunuyorsak:
tryhackme@linux3:/webserver# python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Şimdi, wget komutunu kullanarak dosyayı indirin. Python3 sunucusu port 8000’de çalıştığı için wget komutunuzda bu portu belirtmelisiniz. Örneğin:
Port 8000’de Çalışan Web Sunucusundan Dosya İndirme
tryhackme@mymachine:~# wget http://10.10.47.15:8000/myfile
Not: Python3 web sunucusunu başlattığınız terminal açık kalmalıdır ve wget komutunu başka bir terminalden çalıştırmalısınız. Aşağıdaki örnekte olduğu gibi:
Web Sunucusundan Dosya İndirme Örneği
tryhackme@linux3:/tmp# wget http://10.10.47.15:8000/file
2021-05-04 14:26:16 http://127.0.0.1:8000/file
Connecting to http://127.0.0.1:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 51095 (50K) [text]
Saving to: ‘file’
file 100%[=================================================>] 49.90K --.-KB/s in 0.04s
2021-05-04 14:26:16 (1.31 MB/s) - ‘file’ saved [51095/51095]
Bu modülün bir kusuru, indekslemenin hiçbir yolu olmamasıdır, bu nedenle kullanmak istediğiniz dosyanın tam adını ve konumunu bilmeniz gerekir. Bu yüzden Updog kullanmayı tercih ediyorum. Updog nedir? Daha gelişmiş ama hafif bir web sunucusu. Ama şimdilik Python’un “HTTP Sunucusu “nu kullanmaya devam edelim.
Dosyaları Sunma — WEB
Ubuntu makineleri python3 ile önceden paketlenmiş olarak gelir. Python, “HTTPServer” adlı hafif ve kullanımı kolay bir modül sağlar. Bu modül, bilgisayarınızı hızlı ve kolay bir web sunucusuna dönüştürür ve böylece kendi dosyalarınızı sunabilirsiniz, bu dosyalar başka bir bilgisayar tarafından curl ve wget gibi komutlarla indirilebilir.
Python3’ün “HTTPServer” modülü, komutu çalıştırdığınız dizindeki dosyaları sunar, ancak bu dizini manuel sayfalarda bulabileceğiniz seçeneklerle değiştirebilirsiniz. Komutu başlatmak için terminalde şu komutu çalıştırmanız yeterlidir:
python3 -m http.server
Aşağıdaki ekran görüntüsünde, “webserver” adlı bir dizinden “file” adlı tek bir dosya sunulmaktadır.
Şimdi, wget kullanarak dosyayı bilgisayarın IP adresini ve dosya adını kullanarak indirelim. Bu modülün bir dezavantajı, indeksleme yapmanın bir yolu olmamasıdır, bu yüzden kullanmak istediğiniz dosyanın tam adını ve konumunu bilmelisiniz. Bu nedenle, ben Updog kullanmayı tercih ediyorum. Updog nedir? Daha gelişmiş ama yine de hafif bir web sunucusudur. Ancak şimdilik Python’un “HTTP Server” modülünü kullanmaya devam edelim.
Yukarıdaki ekran görüntüsünde, wget’in “file” adlı dosyayı başarılı bir şekilde bilgisayarımıza indirdiğini görebiliriz. Bu istek, herhangi bir web sunucusu gibi SimpleHTTPServer tarafından günlüğe kaydedilir, bu da aşağıdaki ekran görüntüsünde gösterilmiştir.
- Dosyayı TryHackMe AttackBox’ına indirin:
http://MACHINE_IP:8000/.flag.txt
İçerikleri nelerdir?
THM{WGET_WEBSERVER}
- Öğrendiklerinizi uygulamak için dosyalar oluşturun ve indirin. Python3’ün “HTTPServer” modülü hakkındaki dokümantasyonu nasıl okuyabileceğinizi görün.
İşiniz bittiğinde Python3 HTTPServer modülünü durdurmak için Ctrl + C
tuşlarına basın.
GÖREV 5: process 101
GÖREV 5: Süreçler 101
Süreçler, makinenizde çalışan programlardır. Kernel tarafından yönetilirler ve her sürecin, PID olarak bilinen bir kimlik numarası vardır. PID, sürecin başlama sırasına göre artar. Örneğin, 60. süreç, 60 PID’ye sahip olacaktır.
Süreçleri Görüntüleme
Kullanıcı oturumumuzda çalışan süreçlerin listesini ve durum kodu, çalıştırılan oturum, CPU kullanım süresi ve çalıştırılan program veya komutun adı gibi ek bilgileri sağlamak için ps komutunu kullanabiliriz:
ps
Bu komut, temel süreç bilgilerini sağlar ve aşağıdaki gibi bir çıktı üretir:
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
4 ? 00:00:00 kworker/0:0H
5 ? 00:00:00 kworker/0:0
Bu bilgiler şunları içerir:
- PID: Sürecin kimlik numarası.
- TTY: Sürecin hangi terminalden başlatıldığı.
- TIME: Sürecin CPU kullanımı süresi.
- CMD: Çalıştırılan komutun adı.
Yukarıdaki örnekte, ikinci süreç olan ps‘nin PID’si 204’tür ve bir sonraki komutta bu 205 olarak artar.
Tüm Süreçleri Görüntüleme
Diğer kullanıcılar tarafından çalıştırılan süreçleri ve oturumdan başlatılmayan (yani sistem süreçleri) süreçleri görmek için, ps komutuna aux parametresini eklememiz gerekir:
ps aux
Bu komut, çok daha kapsamlı bir süreç listesi sağlar ve aşağıdaki gibi bir çıktı üretir:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 22520 1088 ? Ss 10:14 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 10:14 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:14 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S 10:14 0:00 [kworker/0:0H]
Bu bilgiler şunları içerir:
- USER: Süreci başlatan kullanıcı.
- PID: Sürecin kimlik numarası.
- %CPU: CPU kullanım yüzdesi.
- %MEM: Bellek kullanım yüzdesi.
- VSZ: Sanal bellek boyutu.
- RSS: Fiziksel bellek boyutu.
- TTY: Sürecin hangi terminalden başlatıldığı.
- STAT: Sürecin durumu.
- START: Sürecin başlama zamanı.
- TIME: Sürecin CPU kullanımı süresi.
- COMMAND: Çalıştırılan komutun adı.
Bu komut sayesinde, sistemde çalışan tüm süreçleri ve ilgili bilgileri görebilirsiniz.
Toplam 5 süreç görebildiğimize dikkat edin – şimdi nasıl “root” ve “cmnatic” olduğuna dikkat edin Çok kullanışlı bir başka komut da top komutudur; top size sisteminizde çalışan süreçler hakkında tek seferlik bir görünüm yerine gerçek zamanlı istatistikler verir. Bu istatistikler her 10 saniyede bir yenilenecektir, ancak çeşitli satırlara göz atmak için ok tuşlarını kullandığınızda da yenilenecektir. Sisteminiz hakkında bilgi edinmek için bir başka harika komut da top komutudur.
Süreçleri Yönetme
Süreçleri sonlandırmak için sinyaller gönderebilirsiniz; bu sinyaller, sürecin kernel tarafından ne kadar “temiz” bir şekilde işleneceği ile ilgilidir. Bir komutu sonlandırmak için, uygun bir şekilde adlandırılmış kill komutunu ve sonlandırmak istediğimiz sürecin PID’sini kullanabiliriz. Örneğin, PID 1337’yi sonlandırmak için kill 1337 kullanırız.
Aşağıda, bir süreç öldürüldüğünde gönderilebilecek bazı sinyaller bulunmaktadır:
- SIGTERM — Süreci sonlandırın, ancak öncesinde bazı temizlik işlemlerini yapmasına izin verin.
- SIGKILL — Süreci sonlandırın — herhangi bir temizlik yapmaz.
- SIGSTOP — Süreci durdurun/askıya alın.
Süreçler Nasıl Başlar?
Öncelikle, namespace’lerden bahsedelim. İşletim Sistemi (OS), namespace’lerini kullanarak bilgisayardaki kaynakları (CPU, RAM ve öncelik gibi) süreçlere böler. Bunu, bilgisayarınızı dilimlere ayırmak gibi düşünebilirsiniz — bir pastaya benzer. Bu dilim içindeki süreçler, belirli bir miktar işlem gücüne erişebilir, ancak bu, genel olarak tüm süreçler için mevcut olanın küçük bir kısmı olacaktır.
namespace’ler, güvenlik için harikadır çünkü süreçleri birbirinden izole etmenin bir yoludur — yalnızca aynı namespace’lerde bulunan süreçler birbirini görebilir.
Daha önce PID’nin nasıl çalıştığını konuşmuştuk ve burada devreye girer. 0 kimlik numarasına sahip süreç, sistem başladığında başlatılan bir süreçtir. Bu süreç, Ubuntu’daki sistemd gibi sistemin init sürecidir ve kullanıcı süreçlerini yönetme yolu sağlar ve işletim sistemi ile kullanıcı arasında bulunur.
Örneğin, bir sistem boots ve initialises, sistemd başlatılan ilk süreçlerden biridir. Başlatmak istediğimiz herhangi bir program veya yazılım, sistemd’nin bir alt süreci olarak başlatılır. Bu, sistemd tarafından kontrol edildiği anlamına gelir, ancak kendi süreci olarak çalışır (sistemd’den kaynakları paylaşmasına rağmen), bu da onu tanımlamamızı kolaylaştırır.
Sistem Başlatılması Sırasında Başlatılması İstenen Uygulamalar
Bazı uygulamalar, sistemin başlatılması sırasında otomatik olarak başlatılabilir. Örneğin, web sunucuları, veritabanı sunucuları veya dosya transfer sunucuları gibi yazılımlar kritik olabilir ve sistem yöneticileri tarafından sistem açılırken başlatılacak şekilde yapılandırılabilir.
Bu örnekte, Apache web sunucusunun manuel olarak başlatılmasını ve ardından sistemin her açılışta Apache2’yi başlatmasını sağlayacağız.
Systemctl Kullanımı
Systemctl komutu, systemd süreci/daemon’u ile etkileşimde bulunmamızı sağlar. Örneğin, Apache’nin başlatılması için systemctl start apache2 komutunu kullanacağız. Apache’yi durdurmak için de benzer şekilde systemctl stop apache2 komutunu kullanırız.
Systemctl ile yapabileceğimiz dört işlem şunlardır:
- Başlat (Start)
- Durdur (Stop)
- Etkinleştir (Enable)
- Devre Dışı Bırak (Disable)
Linux’ta Arka Plan ve Ön Plan İşlemleri
İşlemler iki durumda çalışabilir: Arka planda ve ön planda. Örneğin, terminalinizde çalıştırdığınız komutlar, “echo” gibi, ön planda çalışır. Bu, komutun çıktısının hemen terminale döneceği anlamına gelir. Arka planda çalışan bir işlem, komutun çıktısının hemen terminale dönmemesi ve terminalde başka işlemler yapılabilmesi anlamına gelir.
Burada echo "Hi THM"
komutunu çalıştırıyoruz ve çıktının doğrudan bize döneceğini bekliyoruz. Ancak, komutun sonuna &
operatörünü eklediğimizde, gerçek çıktıyı almak yerine sadece echo
işleminin ID’sini alıyoruz — çünkü işlem arka planda çalışıyor.
Bu, dosya kopyalama gibi komutlar için mükemmeldir çünkü komutu arka planda çalıştırabilir ve dosya kopyalamanın tamamlanmasını beklemeden başka komutlar çalıştırmaya devam edebiliriz.
Script’leri çalıştırırken de aynı şekilde yapabiliriz — &
operatörünü kullanmak yerine, klavyenizde Ctrl + Z
tuşlarına basarak bir işlemi arka plana alabilirsiniz. Bu, bir script veya komutun çalışmasını “durdurmanın” etkili bir yoludur.
Bu script, ben durdurana veya işlemi askıya alana kadar sürekli olarak “This will keep on looping until I stop!” mesajını tekrar edecek. Ctrl + Z
kullanarak işlemi askıya alabiliriz (T^Z ile gösterildiği gibi). Şimdi terminalimiz mesajlarla dolmuyor — ta ki işlemi tekrar ön planda çalıştırana kadar, ki bunu aşağıda tartışacağız.
Bir işlemi ön planda çalıştırma
Şimdi arka planda çalışan bir işlemimiz var, örneğin background.sh
script’imiz, bu işlemi ps aux
komutunu kullanarak doğrulayabiliriz. Bu işlemi geri alıp, etkileşimde bulunmak için ön planda çalıştırabiliriz.
Ctrl + Z
veya &
operatörü ile işlemi arka plana aldığımızda, fg
komutunu kullanarak bu işlemi tekrar ön plana getirebiliriz. Aşağıda olduğu gibi, fg
komutunu kullanarak arka planda çalışan işlemi terminalde tekrar kullanıma alabiliriz ve script’in çıktısı artık bize geri döner.
- Önceki ID’si “300” olan bir süreci başlatacak olsaydık, bu yeni sürecin ID’si ne olurdu? 301
- Bir süreci temiz bir şekilde öldürmek istersek, ona hangi sinyali gönderirdik? SIGTERM
- Makinede (MACHINE_IP) çalışan süreci bulun. THM{PROCESSES}
- “myservice” hizmetini durdurmak için hangi komutu kullanırız? systemctl stop myservice
- Sistemin açılışında aynı hizmeti başlatmak için hangi komutu kullanırız? systemctl enable myservice
- Önceden arka plana alınmış bir süreci tekrar ön plana getirmek için hangi komutu kullanırız? fg
Görev 6 -: Sisteminizi Yönetme: Otomasyon
Kullanıcılar, sistem başlatıldığında belirli bir eylemi veya görevi planlamak isteyebilirler. Örneğin, komutları çalıştırmak, dosyaları yedeklemek veya favori programlarınızı (örneğin Spotify veya Google Chrome) başlatmak.
Burada cron sürecinden bahsedeceğiz, ancak daha spesifik olarak crontab’lerle nasıl etkileşimde bulunabileceğimizi ele alacağız. Crontab, sistem başlatıldığında başlatılan süreçlerden biridir ve cron işleri (cron jobs) oluşturma ve yönetme işlevini yerine getirir.
Bir crontab, cron süreci tarafından her satırı adım adım çalıştırmak üzere tanınan özel bir dosyadır. Crontab’ler 6 belirli değeri gerektirir:
Değer | Açıklama |
---|---|
MIN | Ne zaman dakika olarak çalıştırılacağı |
HOUR | Ne zaman saat olarak çalıştırılacağı |
DOM | Ne zaman ayın günü olarak çalıştırılacağı |
MON | Ne zaman yılın ayı olarak çalıştırılacağı |
DOW | Ne zaman haftanın günü olarak çalıştırılacağı |
CMD | Gerçekten çalıştırılacak komut |
Örneğin, dosyaları yedeklemek isteyebilirsiniz. “cmnatic” kullanıcısının “Documents” klasörünü her 12 saatte bir yedeklemek istiyorsanız, aşağıdaki formatı kullanabilirsiniz:
0 */12 * * * cp -R /home/cmnatic/Documents /var/backups/
Crontab’lerin ilginç bir özelliği de wildcard veya yıldız işareti (*) desteğidir. Eğer belirli bir alan için değer sağlamak istemiyorsanız, yani hangi ay, gün veya yıl olduğunu önemsemiyorsanız, sadece her 12 saatte bir çalıştırılmasını istiyorsanız, o alana bir yıldız koyabilirsiniz.
Başlangıçta bu biraz kafa karıştırıcı olabilir, bu yüzden “Crontab Generator” gibi çevrimiçi araçlar kullanarak formatınızı oluşturmak size yardımcı olabilir! Ayrıca “Cron Guru” sitesini de kullanabilirsiniz!
Crontab’ler, crontab -e komutuyla düzenlenebilir ve bir editör (örneğin Nano) seçerek crontab’ınızı düzenleyebilirsiniz.
Soru: Makinedeki crontab ne zaman çalışacak?
Cevap: @reboot
Introducing Packages & Software Repos
Geliştiriciler yazılımlarını topluluğa sunmak istediklerinde, yazılımlarını bir “apt” deposuna gönderirler. Onaylanırlarsa, programları ve araçları kullanıma sunulur. Linux’un en dikkat çekici özelliklerinden ikisi burada kendini gösterir: Kullanıcı erişilebilirliği ve açık kaynak araçlarının değeri.
Bir Ubuntu 20.04 Linux makinesinde ls
komutunu kullanarak bu dosyalar gateway/registry olarak işlev görür.
Depoları Yönetme (Ekleme ve Kaldırma)
İşletim Sistemi sağlayıcıları kendi depolarını yönetirken, topluluk depolarını da listenize ekleyebilirsiniz! Bu, işletim sisteminizin yeteneklerini genişletmenizi sağlar. Ek depo eklemek için add-apt-repository
komutunu kullanabilir veya başka bir sağlayıcıyı listeleyebilirsiniz. Örneğin, bazı sağlayıcılar, coğrafi olarak daha yakın bir depo sunabilir.
Genellikle, yazılımı Ubuntu sistemimize yüklemek için apt
komutunu kullanırız. apt
komutu, paketleri ve yazılım kaynaklarını yönetmenize, yazılım yüklemenize veya kaldırmanıza olanak tanıyan paket yönetim yazılımının bir parçasıdır.
Şimdi, yukarıda açıkladığımız add-apt-repository
komutunu kullanarak bir depo ekleme ve kaldırma işlemini adım adım gerçekleştirelim. Yazılım yükleme işlemlerini dpkg
gibi paket yükleyicileri aracılığıyla yapabilseniz de, apt
‘in avantajı, sisteminizi güncellediğinizde eklediğiniz yazılım depolarının da güncellenmesi anlamına gelir.
Bu örnekte, varsayılan Ubuntu depolarında bulunmayan Sublime Text metin editörünü Ubuntu makinemize depo olarak ekleyeceğiz. Yazılım eklerken, indirdiğiniz yazılımın bütünlüğü GPG (Gnu Privacy Guard) anahtarları kullanılarak garanti edilir. Bu anahtarlar, geliştiricilerin yazılımınızı “işte bizim yazılımımız” diyerek sunduğu güvenlik kontrolüdür. Anahtarlar, sisteminizin güvendiği ve geliştiricilerin kullandığı anahtarlarla eşleşmezse, yazılım indirilmez.
Öyleyse, başlayalım. Önce Sublime Text 3’ün geliştiricilerinin GPG anahtarını eklememiz gerekiyor. (Not: TryHackMe örnekleri internete erişim sağlamadığından, bu adımı uygulamanız beklenmez, çünkü başarısız olacaktır.)
- GPG anahtarını indirip
apt-key
ile güvenilir olarak ekleyelim:
wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
- Şimdi bu anahtarı güvenilir listeye ekledik, artık Sublime Text 3’ün deposunu
apt
kaynak listemize ekleyebiliriz. İyi bir uygulama, eklediğimiz her topluluk/üçüncü taraf deposu için ayrı bir dosya oluşturmaktır.
2.1. /etc/apt/sources.list.d
dizininde sublime-text.list
adında bir dosya oluşturalım ve depo bilgilerini şu şekilde ekleyelim:
2.2. Ve şimdi Nano veya seçtiğiniz bir metin düzenleyicisini kullanarak Sublime Text 3 deposunu bu yeni oluşturulan dosyaya ekleyin ve kaydedin:
2.3. Bu girişi ekledikten sonra, apt
‘in bu yeni girişi tanımasını sağlamak için apt update
komutunu kullanmamız gerekiyor.
2.4. Başarıyla güncellendikten sonra, apt install sublime-text
komutunu kullanarak eklediğimiz ve güvenilir olarak işaretlediğimiz yazılımı yüklemeye başlayabiliriz.
Paketleri kaldırmak, bu sürecin tersini yapmak kadar kolaydır. Bu işlem add-apt-repository --remove ppa:PPA_Name/ppa
komutunu kullanarak veya daha önce oluşturduğumuz dosyayı manuel olarak silerek yapılır. Kaldırdıktan sonra, sadece apt remove [yazılım-adı]
komutunu kullanabiliriz; örneğin apt remove sublime-text
.
TASK 8 -: Sisteminizi Yönetme: Log’lar
Linux Temelleri Bölüm 1’de günlük dosyalarına ve bunların bulunabileceği yerlere kısaca değinmiştik. Ancak, hızlıca tekrar göz atalım. /var/log
dizininde bulunan bu dosya ve klasörler, sisteminizde çalışan uygulama ve hizmetlere ait günlük bilgilerini içerir. İşletim Sistemi (OS), bu günlükleri otomatik olarak yönetmede oldukça iyi hale gelmiştir ve bu işleme “dönüşüm” denir.
Ubuntu makinesinde çalışan üç hizmetten bazı günlükleri özetledim:
- Apache2 web sunucusu
- Başarısız girişimleri izlemek için kullanılan fail2ban hizmetine ait günlükler
- Bir güvenlik duvarı olarak kullanılan UFW hizmetine ait günlükler
Bu hizmetler ve günlükler, sisteminizin sağlığını izlemek ve korumak için harika bir yol sağlar. Ayrıca, bir web sunucusu gibi hizmetlerin günlükleri, her bir isteğe dair bilgi içerir — bu da geliştiricilerin veya yöneticilerin performans sorunlarını teşhis etmelerine veya bir saldırganın etkinliğini araştırmalarına olanak tanır. Örneğin, ilgi çekici iki tür günlük dosyası şunlardır:
- Erişim günlükleri (access log)
- Hata günlükleri (error log)
Elbette, işletim sisteminin kendisi hakkında ve kullanıcıların gerçekleştirdiği eylemler hakkında bilgi saklayan günlükler de vardır. Örneğin, kimlik doğrulama denemeleri gibi.
- Siteyi ziyaret eden kullanıcının IP adresi nedir?
10.9.232.111
- Hangi dosyaya eriştiler?
catsanddogs.jpg
GÖREV 9 -: Sonuçlar ve Özetler
Linux Temelleri modülünün sonuna hoş geldiniz. Linux ile etkileşime girdikçe tanışıklığınız artacaktır. Linux, göreceli kolaylıkla çok güçlü şeyler yapma potansiyeline sahiptir (umarım bu modül boyunca bunu keşfetmişsinizdir).
Özetlemek gerekirse, bu odada aşağıdaki konulara giriş yaptınız:
- Terminal metin düzenleyicilerini kullanma
- Python web sunucusu kullanarak içerik indirme ve sunma gibi genel yardımcı araçlar
- Süreçlere bir bakış
- Sisteminizin bakımını ve otomasyonunu crontab’lar, paket yönetimi ve günlükleri gözden geçirme kullanarak yapma
Linux araçları veya yardımcı programlarıyla ilgili diğer TryHackMe odalarında öğrenmeye devam edin, bu ve diğer konular hakkında yazılarımı takipte kalın.