Linux komutları

Bu makalenin alt başlıkları

Bu başlık altında anlatılacak tüm konular Linux konularıdır ve Raspberry Pi özelinde hiçbir sınırlama içermez. Bir Linux bilgisayarının ana yönetim üssü komut satırıdır. Komut satırında kullanabileceğiniz yüzlerce komut ve seçenek, bir işi hızlı ve etkili yoldan gerçekleştirebilmeniz için tek yoldur. Linux konusunda deneyimli kullanıcılar her zaman bu yolu tercih ederler; çünkü komut satırı Linux bilgisayarına dolayısıyla Raspberry Pi’a tam erişim sağlar.

Bu kısımda sadece en çok kullanılan temel komutlar anlatılmıştır. Diğerlerine ise kitap içerisinde konusu geldikçe değinilmiştir. Komutları deneyebilmeniz için bir komut konsoluna ihtiyacınız olacak. Bu konsolu, önceki başlıklarda anlatıldığı gibi bir SSH terminal bağlantısı ile veya doğrudan Raspberry Pi’a bağlı bir klavye ve monitör aracılığı ile açabilirsiniz. Komut konsolunu açtığınızda sizi aşağıdaki gibi bir komut istemi hazırda bekleyecektir.

[email protected]:~ $

Komutların temel kullanımları gösterilirken kullanılan [ ] ve < > sembollerinin anlamı, komutla birlikte kullanılacak olan seçenek ve parametrelerin zorunlu olup olmadığını göstermek içindir. Eğer bir komut argümanı [ ] ile belirtilmişse seçimliktir yani kullanılması zorunlu değildir. Eğer < > karakterleri ile belirtilmişse, komut bu argümana ihtiyaç duymaktadır ve mutlaka kullanılmalıdır. Aksi takdirde komut argüman/seçenek eksik hatası verecektir.

Linux’ta komutlar bulundukları yere göre iki kategoriye ayrılır. Dâhili komutlar ve harici komutlar. Dâhili komutlar üzerinde çalışılan komut kabuğunun kaynak kodları arasına yerleştirilmiş komutlardır. Dâhili komutların görevini icra etmesini sağlayan bilgisayar kodları ayrı bir disk dosyasında saklanmaz, kullanılan komut kabuğunun kodları içine gömülmüştür. Dolayısıyla dâhili bir komut çalıştırıldığında ayrı bir işlem (process) de yaratılmaz. Örneğin ls, cd, pwd, kill, alias, echo ve help gibi komutlar dâhili komutlardır.

Harici komutlar ise kendi disk dosyalarında saklanır. Harici komutlar çalıştırılmadan önce diskten okunarak belleğe yüklenir ve ayrı bir işlem olarak çalıştırılırlar. Genellikle sistemde /bin ve /sbin dizinlerinde saklanırlar.

Bu başlıkta açıklanan komut satırı araçlarını ve seçeneklerini ayıklayarak detaylı açıklamasını görsel olarak sunan explainshell.com web sitesi kullanışlı olabilir. Site, komut ve seçenekleri ilgili yardım sayfalarından ayıklayarak anlaşılır bir şekilde gruplandırmaktadır. Uzun bir bash komutunun görevini ve mantıksal olarak hangi bölümlerden oluştuğunu incelemek için kullanabilirsiniz.

www.explainshell.com

ls komutu ile dosya ve dizinleri listelemek ^

ls (list) komutu bir dizinin içeriğini listelemek için kullanılan en temel komutlardan biridir. Temel kullanımı aşağıdaki gibidir:

ls [seçenekler] [dosya/dizin]

Ev dizininizde (~) ls komutunu –la seçenekleri ile çalıştırdığınızda aşağıdakine benzer bir çıktı verir.

[email protected]:~ $ ls -la
total 20
drwxr-xr-x 2 pi   pi   4096 May 10 13:21 .
drwxr-xr-x 4 root root 4096 May 10 13:21 ..
-rw-r--r-- 1 pi   pi    220 May 10 13:21 .bash_logout
-rw-r--r-- 1 pi   pi   3523 May 10 13:21 .bashrc
-rw-r--r-- 1 pi   pi    675 May 10 13:21 .profile

man ls komutu ile seçeneklerin detaylarına bakabileceğiniz ls komutunun en çok kullanılan seçenekleri aşağıdaki gibidir.

-l : dosya ve dizinleri, sahiplik bilgileri, boyutu, oluşturulma tarihini ve erişim izinler ile birlikte detaylı olarak listeler.

-a: . ile başlayan, Linux’ta gizli olarak addedilen dosyaları da listeler. Bir dosyanın adı . (nokta) ile başlayabilir. Dosya adı nokta ile başlıyorsa ls çıktısından gizlenir.

-R: İçinde bulunulan dizin ve alt dizinlerini öz yinelemeli olarak listeler.

-h: (human readable) dosya boyutunu Kilobyte, Megabyte gibi büyüklükler cinsinden görüntüler.

-l seçeneği ile sunulan detaylı listelemede sol sütunda dosya türünü simgeleyen çeşitli harfler yer alır. Bunların anlamları şöyledir:

Harf/SembolHarfin/sembolün anlamı
bBlok dosya
cKarakter dosya
dDizin
lSembolik bağlantı
sSoket haberleşme dosyası
Normal dosya

ls çıktısı –l seçeneği ile detaylı listelendiğinde yedi sütundan oluşan bir gösterim sunar. Bu sütunların neler olduğu aşağıda açıklanmıştır:

-rw-r–r– 1 pi   pi   3523 May 10 13:21 .bashrc

  • -rw-r–r–: Bu sütun erişim izinlerini gösterir. Sütunun ilk karakteri dosya türünü belirtir. Ardından gelen rwx harfleriyle oluşturulan üç grup, sırasıyla dosyanın sahibinin, grubunun ve diğerlerinin erişim izinlerini belirtir. r okuma izini, w yazma iznini, x ise çalıştırma iznini gösterir. Bun bilgilere göre; dosyanın sahibi olan pi kullanıcısı dosya üzerinde, okuma ve yazma (rw-) izinlerine, dosya sahibinin gurubu olan pi sadece okuma iznine (r–) ve sistemdeki diğer herhangi kullanıcılar da aynı şekilde sadece okuma iznine (r–) sahiptir.
  • 1: Bağlantı sayısını gösterir. Bu bir dosya olduğu için sadece içinde bulunduğu dizin ile bağlantılıdır ve dosya sisteminin veri yapısında bulunduğu konumu tanımlayan bir bağlantıya sahiptir. Bu bağlantı dosyanın içinde bulunduğu dizine ait bir ilişkiyi tanımlar. Dizinlerin bağlantı sayısı ise en az 2’dir. Biri ilgili dosya sistemi veri yapısı içindeki konumunu tanımlayan bağlantı, diğeri de içinde bulunduğu üst dizini (..) ifade eder
  • pi: Dosyanın sahibi olan kullanıcının adını gösterir. ls komutu –n seçeneği ile kullanıldığında kullanıcı adı yerine kullanıcısının id numarası görüntülenir.
  • pi: Dosyanın sahibi olan grubun adını gösterir.
  • 3523: Dosya boyutu. Byte cinsinden dosya boyutunu gösterir. Dizinler için görüntülenen boyut dizinin içinde bulunan dosyaların boyutunu değil, sadece dizinin meta bilgilerinin (inode numarası, erişim izinleri, sahibi vb.) kapladığı alanı gösterir.
  • .bashrc: Dosyanın adıdır. Nokta ile başlayan dosyalar gizli dosyalardır.

ls –l çıktısının en başında yer alan . ve .. sembolleri sırasıyla içinde bulunulan dizini ve bir üst dizini ifade eder. Böylece listelenen dizinin içinde bulunduğu üst dizinin ve kendisinin detaylı özellikleri görülebilir.

Bir dizin içindeki belli türdeki girdilerin listelenmesi için grep aracının regular expression  özelliğinden faydalanılabilir. Örneğin aşağıdaki komut çifti ile bulunulan dizin listelenmekte ve sembolik (symbolic link) olanlar filtrelenmektedir.

[email protected]:~ $ ls -l |  grep ^l
 2025 pi         20   0 12236  3996  3204 S  0.0  0.4  0:04.82 sshd: [email protected]/0                                         │lrwxrwxrwx  1 pi pi     4 May 23 01:40 temp -> /tmp

Benzer şekilde grep’e vereceğiniz diğer seçme kuralları ile dizin ve dosyaları da aşağıdaki gibi listeletebilirsiniz. Grep’e verilen argüman, ls’den dönen satırın ilk karakterinin belirtilen kurala uyup uymadığını kontrol etmektedir.

[email protected]:~ $ ls -l |  grep ^d
[email protected]:~ $ ls -l |  grep ^-

cd komutu ile dizin değiştirmek ^

cd komutu (change directory) komut konsolunda dizinler arasında geçiş yapmayı sağlar. cd komutunun temel kullanımı aşağıdaki gibidir:

cd [seçenekler] [dizin]

cd komutu kendisine parametre olarak dizin/dosya yolunu alır. Bu sayede dosya sisteminde istediğiniz gibi dolaşabilirsiniz. “.” (nokta) ve “.. “ (çift nokta) özel dizin isimleridir. “.” İçinde bulunulan dizin anlamına gelirken “..” bir üst dizini ifade eder. Komut kabuğunda “~” (Tilda) sembolünün de özel bir anlamı vardır. Bu sembol geçerli kullanıcının ev dizinini ifade eder. Aşağıdaki örnekte pi kullanıcısı önce “..” ile bir üst dizin olan /home dizinine, daha sonra kök dizine / ve ardından da tekrar kendi ev dizinine geçiş yapmıştır. Bu geçişler sırasında geçerli dizinin komut isteminde de görüntülendiğine dikkat ediniz.

[email protected]:~ $ pwd
/home/pi
[email protected]:~ $ cd ..
[email protected]:/home $ pwd
/home
[email protected]:/home $ cd /
[email protected]:/ $ pwd
/
[email protected]:/ $ cd
[email protected]:~ $ pwd
/home/pi

Yukarıdaki örnekte yer alan son cd komutunda herhangi bir parametre verilmemiştir. cd parametresiz olarak kullanıldığında “~” ile olduğu gibi kullanıcının ev dizinine gider.

mkdir komutu ile dizin yaratmak ^

mkdir (make directory) komutu yeni bir dizin oluşturmak için kullanılır. Temel kullanımı aşağıdaki gibidir.

mkdir [seçenekler] <dizin adı>

Aşağıdaki örnekte pi kullanıcısının ev dizininde bulut isimli bir dizin oluşturulmuştur.

[email protected]:~ $ mkdir bulut
[email protected]:~ $ cd bulut/
[email protected]:~/bulut $
-p parametresi ile bir dizin ağacı da oluşturabilirsiniz.
[email protected]:~ $ mkdir -p a/b
[email protected]:~ $ cd a
p[email protected]:~/a $ cd b/
[email protected]:~/a/b $

Terminolojik açıdan doğrusunu söylemek gerekirse Linux’ta dizin (directory) tabiri tercih edilir. Çoğu kullanıcı dizin ve klasörü birbirine karıştırmaktadır. Klasör (folder), daha çok Windows işletim sistemlerinde kullanılan bir terimdir. Bu iki terim genel olarak aynı anlamda kullanılsa da bazı farklılıkları vardır. Örneğin Linux’ta, dosya sisteminde fiziksel olarak var olan bir dosya/dizin kapsayıcısını ifade ederken, Windows’ta Kontrol Panel, Yazıcılar ya da Ağ Komşuları gibi görsel bileşenleri ifade etmek için de kullanılmaktadır.

Dizin (Directory) ve Klasör (Folder) Farkı


pwd komutu ^

Komut kabuğunda çalışırken aktif/geçerli dizinin adını ve yolunu görüntüler.

[email protected]:~ $ pwd
/home/pi

Yukarıdaki komut içinde bulunulan ev dizinin (~), fiziksel disk üstündeki tam yolunu görüntülemiştir. Bir yazılım için kurulum betiği hazırlanırken, kurulumun aktif kullanıcının ev dizininde gerçekleşmesi için çokça tercih edilir. Aşağıda buna bir örnek yer almaktadır.

[email protected]:~ $ yedek_dizini=$(pwd)/yedekler
[email protected]:~ $ echo $yedek_dizini
/home/pi/yedekler

Komut kabuğundan çalıştırılan yukarıdaki örnek aktif kullanıcının ev dizinini elde edip sonuna /yedekler alt dizinini eklemektedir.

touch komutu ile dosya yaratmak ^

Linux komut kabuğunda bir dosya yaratmak için birçok yol bulunmakla birlikte bunlardan en çok kullanılan touch ve > dosya yönlendirme karakteridir. touch’ın kullanımı aşağıdaki gibidir:

touch [seçenekler] [dosya/dosyalar]

Touch temel olarak, belirtilen dosyanın değiştirme (-m) ve erişim (-a) zamanlarını (timestamps) değiştirir. Ancak seçeneksiz olarak kullanıldığında dosyayı boş olarak oluşturur. Aşağıdaki örneğe göz atın:

[email protected]:~ $ touch ece_gunes_koca.txt
[email protected]:~ $ ls -la ece*
-rw-r--r-- 1 pi pi 0 Apr 19 14:30 ece_gunes_koca.txt

-a (Access) seçeneği dosyanın erişim zamanını değiştirmek için kullanılır. Aşağıdaki örnekte belirtilen dosyanın erişim zamanı o andaki zaman ile değiştirilmiştir.

[email protected]:~ $ touch -a ece_gunes_koca.txt
[email protected]:~ $ stat ece_gunes_koca.txt
Access: 2019-04-19 14:33:52.164193147 +0100
Modify: 2019-04-19 14:30:19.135846620 +0100

Benzer şekilde; –m seçeneği kullanılarak dosyanın değiştirilme zamanı güncel zaman bilgisi ile değiştirilebilir.

touch komutu ile güncel zaman bilgisi yerine belli bir zamanı ayarlamak gerektiğinde ise –t (time) seçeneğinden faydalanılır. –t seçeneğinin değeri YYMMDDHHMM biçiminde verilir. Aşağıdaki örneği inceleyelim:

[email protected]:~ $ touch -m -t 2712161450 ece_gunes_koca.txt
[email protected]:~ $ stat ece_gunes_koca.txt
Modify: 2027-12-16 14:50:00.000000000 +0000

cat komutu ile dosya görüntülemek ^

cat (concatenate) komutu Linux işletim sisteminin en sık kullanılan komutlarından biridir. Cat komutu dosya oluşturma, dosyanın içeriğini görüntüleme, dosyaları birleştirme ve içeriğini bir çıktıya (dosya/program) yönlendirmek için kullanılabilir. Kullanım şekli aşağıdaki gibidir:

cat [seçenekler] [dosya/dosyalar]

Aşağıdaki örnekte cat aracı kullanılarak bir dosya oluşturulmaktadır. Dosya, cat aracının okuduğu standart girdi, “>” yönlendirme işleci ile gunes.txt dosyasına yönlendirilmektedir. Standart girdinin okunmasını sonlandırmak için metin girişi bittiğinde Ctrl+D tuş bileşimine basılır.

[email protected]:~ $ cat > gunes.txt
Merhaba gunes!

Aşağıdaki örnekte de gunes.txt isimli dosyanın içeriği ekrana basılmaktadır.

[email protected]:~ $ cat gunes.txt
Merhaba gunes!

Aşağıdaki örnekte ise, gunes.txt dosyasının içeriği bulut.txt dosyasına kopyalanmakta, ardından gunes.txt ve bulut.txt dosyaları tomurcuklar.txt dosyasında birleştirilmektedir.

[email protected]:~ $ cat gunes.txt > bulut.txt
[email protected]:~ $ cat gunes.txt bulut.txt > tomurcuklar.txt

-n seçeneği ile standart çıktıya basılan dosya içeriğinin her bir satırında, satır numarası ve enter karakterleri yerine de $ sembolünün görüntülenmesi sağlanabilir.

[email protected]:~ $ cat -ne tomurcuklar.txt
     1  Merhaba gunes!$
     2  Merhaba gunes!$

tail komutu ile dosya içeriğini görüntülemek ^

tail komutu bir dosyanın son 10 satırını standart çıktıya yönlendirir. Özellikle günlük (log) dosyalarını canlı takip etmek için kullanışlıdır. Günlük dosyaları birçok program ve servis tarafından sürekli güncellendiğinden dosyanın sonuna yeni satırlar eklenir. tail aracı da dosyadaki değişiklikleri kontrol ederek güncellemeleri standart çıktıya yönlendirir. Kullanım şekli aşağıdaki gibidir:

tail [seçenekler] [dosya/dosyalar]

Aşağıdaki tail örneğinde sistem günlük dosyalarından biri olan /var/log/messages’ın son 10 satırı görüntülenmiştir:

[email protected]:~ $ tail /var/log/messages
May  2 17:17:08 raspberrypi kernel: [   11.325095] Bluetooth: HCI UART protocol H4 registered
May  2 17:17:08 raspberrypi kernel: [   11.325101] Bluetooth: HCI UART protocol Three-wire (H5) registered
May  2 17:17:08 raspberrypi kernel: [   11.325328] Bluetooth: HCI UART protocol Broadcom registered
[…]

tail aracına –f seçeneği verildiğinde ise, dosya canlı olarak izlemeye alınır ve dosyanın sonuna yeni satırlar eklendiğinde ekranda görüntülenir. Komutu sonlandırmak için Ctrl+C tuş bileşimi kullanılabilir.

[email protected]:~ $ tail -f /var/log/messages
May  2 17:17:08 raspberrypi kernel: [   11.325095] Bluetooth: HCI UART protocol H4 registered
May  2 17:17:08 raspberrypi kernel: [   11.325101] Bluetooth: HCI UART protocol Three-wire (H5) registered
May  2 17:17:08 raspberrypi kernel: [   11.325328] Bluetooth: HCI UART protocol Broadcom registered
[…]

-n seçeneği ise dosyanın sonundaki kaç satırın görüntüleneceğini ayarlar. Aşağıdaki örnekte messages dosyası gerçek zamanlı olarak izlemeye alınmakta ve dosyanın son 3 satırı ekranda görüntülenmektedir. –c parametresi ile de satır yerine gösterilecek karakter sayısı belirtilebilir.

[email protected]:~ $ tail -n 3 -f /var/log/auth.log
May  3 13:17:01 raspberrypi CRON[1296]: pam_unix(cron:session): session closed for user root
May  3 13:17:05 raspberrypi smbd[1294]: pam_unix(samba:session): session closed for user nobody
May  3 13:17:05 raspberrypi smbd[1295]: pam_unix(samba:session): session closed for user nobody

head komutu ile dosya içeriğini görüntülemek ^

head komutu tail komutuna benzer. Tek farkı dosyanın sonunu değil, başını görüntülemesidir. tail aracında olduğu gibi canlı (gerçek zamanlı) izleme özelliği yoktur; bu nedenle –f seçeneği işlevsizdir. Aşağıdaki örnekte açılış süreci ile ilgili kayıtların tutulduğu /var/log/boot.log dosyasının ilk 3 satırı ekrana basılmaktadır. Dosyanın başından itibaren belli sayıda karakteri görüntülemek için ise –c seçeni kullanılabilir.

[email protected]:~ $ head -n 3 /var/log/boot.log
[  OK  ] Started Raise network interfaces.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.

grep komutu ile metin filtrelemek ^

grep komutu standart girdisine yönlendirilen metnin veya dosyanın satırlarında belli bir düzenli ifadeyi aramak için kullanılır. Kullanım şekli aşağıdaki gibidir:

grep [seçenekler] arama_deseni [dosya/dosyalar]

Aşağıdaki örnek kullanıcı hesaplarının tutulduğu /etc/passwd dosyasında “pi” ifadesi geçen satırları listelemektedir. Büyük küçük harf duyarlılığını iptal etmek için –i seçeneğinden yararlanılabilir.

[email protected]:~ $ grep pi /etc/passwd
pi:x:1000:1000:,,,:/home/pi:/bin/bash
[email protected]:~ $ grep -i PI /etc/passwd
pi:x:1000:1000:,,,:/home/pi:/bin/bash

-c (count) seçeneği aranan ifadenin kaç satırda geçtiği sonucu döndürür.

[email protected]:~ $ grep -c bash /etc/passwd
2

-r (recursive) seçeneği ise belirtilen dizin ve tüm alt dizinlerindeki (öz yinelemeli olarak) dosyalarda arama yapılmasını sağlar.

[email protected]:~ $ grep bash -r /etc/ -c

cp komutu ile dosya/dizin kopyalamak ^

cp (copy) komutu dosya ve dizinlerin kopyasını oluşturmak için kullanılır. Temel kullanımı aşağıdaki gibidir:

cp [seçenekler] [kaynak dosya/dosyalar] [hedef dosya/dosyalar]

cp, aynı anda birden fazla dosyayı da kopyalayabilir. Aşağıdaki ilk örnek /etc/passwd dosyasını kullanıcının ev dizinine passwd.ydk ismiyle kopyalamakta, ikinci örnek ise aynı dizindeki hosts ve services dosyalarını kullanıcının ev dizinindeki yedekler dizini altına kopyalamaktadır. /etc/hosts dosyası bilgisayar adı <-> IP adresi çiftlerinin saklandığın bir dosyadır. /etc/services dosyası ise standart ağ servislerinin adlarını ve çalıştıkları protokolle (tcp/udp/icmp) port numaralarını listeler.

[email protected]:~ $ cp /etc/passwd ~/
[email protected]:~ $ cp /etc/hosts /etc/services ~/yedekler

cp komutu tamamı man cp komutu ile görülebilecek birçok seçeneğe sahiptir. Bu seçeneklerin en çok kullanılanları aşağıdaki gibidir:

  • -r (recursive): Dizinleri alt dizinleri ile birlikte (özyinelemeli) kopyalar.
  • -n (no clobber): Hedef dizinde aynı isimde bir dosya varsa üzerine yazmaz.
  • -i (interactive): Hedef dizinde aynı isimde bir dosya varsa üzerine yazmak için izin ister.
  • -v (verbose): Kopyalama sırasında kaynak ve hedef dosyaların patikalarını ekrana basar.
  • -p (preserve): Kaynak dosyanın mod, sahiplik ve erişim izni bilgilerini koruyarak kopyalar.
  • -d (no dereference): Kaynak dosyanın hard link ’ini hedefe yazar.
  • -s (symbolic): Kaynak dosyanın soft linkini hedefe yazar.
  • -b (backup): Hedef dosya mevcutsa sonuna ~ karakterini ekleyerek yedek kopyasını kaydeder.

mv komutu ile dosa/dizin taşımak ^

mv komutu, cp komutundan farklı olarak dosyayı belirtilen hedefe kopyaladıktan sonra kaynak dosyayı siler. Kullanımı ve seçenekleri cp komutu ile aynıdır.

cp [seçenekler] [kaynak dosya/dosyalar] [hedef dosya/dosyalar]

mv komutunun kullanım alanlarından biri de dosya ve dizinleri yeniden adlandırmaktır (rename). Aşağıdaki örnekte ev dizininde yer alan passwd dosyasının adı passwd-yedek olarak değiştirilmektedir.

[email protected]:~ $ ls passwd*
passwd
[email protected]:~ $ mv passwd passwd-yedek
[email protected]:~ $ ls passwd*
passwd-yedek

mv komutunun çok sık kullanılan seçeneklerinden birisi de –f (force) dur. Hedef dosya veya kaynak dosya kullanımda olduğunda ya da yazma korumasına sahip olduğunda doğal olarak taşınamaz ve üzerine yazılamaz. –f seçeneği mv komutunu çalıştıran kullanıcının yetkileri dâhilinde, dosyanın üzerine yazmak için ısrar eder ve bu işlemi yaparken kullanıcıdan onay istemez. Bu anlamda çalıştırmadan önce 2 kez düşünülmesi gereken bir seçenektir..

rm komutu ile dosya/dizin silmek ^

rm (remove) komutu dizin ve dosyaları silmek için kullanılır. Kullanım şekli ve seçenekleri aşağıdaki gibidir:

mv [seçenekler] [dosya/dizin]

Aşağıdaki komut ev dizininde yer alan okubeni.txt adlı dosyayı silmek için çalıştırılabilir:

[email protected]:~ $ rm okubeni.txt

Söz konusu bir dizin olduğunda ise –r seçeneği kullanılır. Aşağıdaki örnek ev dizininde yer alan dizin1 adlı dizini ve tüm içeriğini silmektedir.

[email protected]:~ $ rm -r dizin1/

-i seçeneği ise silinecek her dizin ve dosya için kullanıcıdan onay ister. Aşağıdaki örneği inceleyiniz:

[email protected]:~ $ rm -ri dizin1/
rm: descend into directory 'dizin1/'? yes
rm: remove regular file 'dizin1/dosya1.txt'? yes
rm: remove regular file 'dizin1/dosya2.txt'? yes
rm: remove directory 'dizin1/'? yes

Sistem yöneticisi olarak çalıştırılan aşağıdaki komut, bir Linux’u kısa sürede kullanılamaz duruma getirecek kadar tehlikelidir. Tüm dizinleri içerisinde bulunduran / (kök) dizin, –f seçeneği ile kullanıcıdan onay alınmadan tamamen silinmektedir.

[email protected]:~ $ sudo rm -rf /

ln komutu ile hard link ve soft link yaratmak ^

Bir dosyaya kolay erişim için sağlamak veya bazı dosya sistemi işlerini yerine getirmek için hard link ve soft linkler kullanılır. Bu linkleri oluşturmak için de ln (link) komutu kullanılır. Komutun temel kullanım şekli aşağıdaki gibidir.

ln [seçenekler] <dosya/dizin> [link adı]

Dosya linklerini daha iyi anlayabilmek için, bir dosyanın dosya sistemi üzerinde nasıl var olduğunu (temsil edildiğini) anlamak gerekir. Bir dosya, dosya sistemi üzerinde iki kısım şeklinde varlık gösterir, ilki dosyanın adı ve diğeri de dosyanın içeriğini oluşturan veridir. Aşağıdaki görsel bu durumu ifade etmektedir.

Herhangi bir dosyanın disk üzerindeki varlık şekli

Aşağıda sembolik linke örnek için, veri.txt adındaki dosyaya, slink.txt (sembolik link) adında bir kısa yol oluşturan (shortcut) komut verilmiştir. Sembolik dosya linkleri, ls çıktısında l harfi ile gösterilirler.

[email protected]:~ $ echo "Merhaba bulut güneş" > veri.txt
[email protected]:~ $ ln -s veri.txt slink.txt
[email protected]:~ $ ls -l
lrwxrwxrwx 1 pi pi  8 Jun 11 21:22 slink.txt -> veri.txt
-rw-r--r-- 1 pi pi 22 Jun 11 21:20 veri.txt

Dosyanın içeriğine ulaşmak için slink.txt adı aşağıdaki gibi kullanılabilir.

[email protected]:~ $ cat slink.txt
Merhaba bulut güneş

Şimdi de aynı dosyaya hard link oluşturalım. Bu durumda –s seçeneğini kullanmayacağız.

[email protected]:~ $ ln veri.txt hlink.txt
[email protected]:~ $ ls -l
total 8
-rw-r--r-- 2 pi pi 22 Jun 11 21:20 hlink.txt
lrwxrwxrwx 1 pi pi  8 Jun 11 21:22 slink.txt -> veri.txt
-rw-r--r-- 2 pi pi 22 Jun 11 21:20 veri.txt

Dikkat ederseniz ls çıktısında hlink.txt’nin dosya türü sütununda l harfi yerine normal dosya türünü ifade eden – (tire) sembolü görüntülenmektedir.

Soft link ile hard linkin en önemli farkı; veri.txt silindiğinde slink.txt işlevsiz kalır; fakat hlink.txt adlı hard link dosyaya erişmeye devam eder.

[email protected]:~ $ rm veri.txt
[email protected]:~ $ ls -l
-rw-r--r-- 1 pi pi 22 Jun 11 21:20 hlink.txt
lrwxrwxrwx 1 pi pi  8 Jun 11 21:22 slink.txt -> veri.txt
[email protected]:~ $ cat hlink.txt
Merhaba bulut güneş
[email protected]:~ $ cat slink.txt
cat: slink.txt: No such file or directory

Sözünü ettiğimiz dosya linklerinin kullanım amaçlarını özetlersek şunları söyleyebiliriz:

  • Bir dosyanın farklı kullanıcılar ya da programlar tarafından farklı dosya isimleri ile erişilebilir olmasını sağlayabilirler. Örneğin ayarlar.ini ve settings.ini dosyalarına ihtiyaç duyan iki farklı programımız olsun. Bu dosya adlarının programlar içerisinde sabit olarak tanımlanmış olduğunu ve kullanıcı tarafından değiştirilemediğini düşünün. Bu durumda aynı yapılandırma dosyasını iki programın da kullanımına sunmak için yapılması gereken örneğin ayarlar.ini kaynak dosyasının settings.ini adında bir sembolik ya da hard linkini oluşturmaktır. Böylece her iki program da farklı patika ve isimleri kullanarak aynı dosyaya ulaşabilirler.
  • Önceki örneğe benzer olarak; sistemde kayıtlı farklı kullanıcıların (kullanıcı hesabının) aynı dosyaya erişim gerçekleştirmesini istediğimiz de hard link kullanmak mantıklı olacaktır. Böylece dosya, disk üzerinde gereksiz yere fazladan yer yer kaplamamış olur hem de üçüncü bir kişi kaynak dosyayı sildiğinde diğer kullanıcılar dosyaya erişebilmeye devam ederler.
  • Dosya bağlantıları uzun dizin ya da dosya patikalarını kısaltmak için kullanılabilir. Bazen üzerinde çalışmak istediğimiz dosyaların kolayca ulaşabileceğimiz bir disk konumunda olmasını isteyebiliriz (örn., /home/pi dizini). Fakat dosya /usr/local/programx/conf/dosya.ini gibi disk konumunda yer alıyorsa, her seferinde bu patikayı komut satırına yazmamız fazladan zaman alır. Bu durumda ilgili dosyaya bir link oluşturarak ev dizimiz içinden kolayca erişebiliriz. Yani, sembolik bağlantıları bir dizine ulaşmak içinde kullanabiliriz. Örn; ln –s /usr/local/programx/conf ayarlar

Örneğin rm komutu ile bir dosya silindiğinde sadece dosyanın adı silinir, verisi silinmez. Fark edecek olmalısınız ki; bir dosya silme işlemi onu oluşturmaya nazaran oldukça hızlı gerçekleşir. Sözde silme işleminde dosyanın verisinin yer aldığı disk alanı yeni dosyaların yazılması için serbest bırakılır ve üzerine yeni bir veri yazılıncaya kadar eski veriler orada kalmaya devam ederler. Silinen dosyaları kurtaran programlar da, tam da bu işi yaparlar. Yani, dosya adı silinmiş (silindi olarak işaretlenmiş); ama verisi mevcut olmaya devam eden dosyaları araştırarak bulur ve bir dosya adı ile ilişkilendirir.

Dosya silme hakkında

find aracı ile dosya araması yapmak ^

find aracı dosya sistemi üzerinde belirtilen özelliklere uyan dosyaları aramak için kullanılır. Temel kullanım şekli aşağıdaki gibidir:

find [aranacak dizin] [seçenekler]

find aracı kullanılarak dosyanın adına, türüne, boyutuna, erişim izinlerine, oluşturulma, değiştirilme ve son erişim zamanına göre aramalar gerçekleştirilebilir. Aranacak dosyanın türünü belirten -type seçeneği kullanılarak yapılan aşağıdaki arama örneğinde, passwd dosyası / (kök) dizinden başlanarak aranmaktadır.

[email protected]:~ $ find / -type f -name passwd

-type seçeneği kullanılarak belirtilebilecek dosya türleri şunlardır:

  • f : Normal dosya.
  • d: Dizin.
  • b: Blok dosyası.
  • c: Karakter dosyası.
  • l: Sembolik bağlantı dosyası.

Arama -type seçeneği kullanılmadan gerçekleştirilirse, dosya, dizin ve link gibi tüm dosya sistemi bileşenleri üzerinde arama yapılır. Örneğin sadece dizin isimlerinde arama yaparken aşağıdaki gibi kullanabilirsiniz:

[email protected]:~ $ sudo find / -type d -name passwd

Aynı aramayı büyük/küçük harf duyarsız olarak gerçekleştirmek için –iname seçeneğinden faydalanabilirsiniz:

[email protected]:~ $ sudo find / -type d -iname passwd

find aramayı gerçekleştirirken sistemin tüm dizinlerini dolaşmaya çalışır. Bu sırada kendisinin çalıştıran kullanıcının yetkisine (pi kullanıcısı) veya kısıtlı erişim izinlerine bağlı olarak araştırdığı dizinlerde “Permission denied” uyarısı oluşabilir. Özellikle, kök (/) dizinin tamamında gerçekleştirilen aramalarda bu uyarı ile çokça karşılaşılabilir. Bu uyarıları almamak için sudo ile find komutunun yetkisini yükseltebilirsiniz.

find ve kardeşi “persmission denied”

find, aşağıdaki gibi hiçbir seçenek verilmeden çalıştırılırsa o anda bulunulan dizindeki her şeyi listeler:

[email protected]:~ $ find

Sadece uzantısı conf olan dosyalar listelenmek istenirse, * joker karakterinden faydalanılabilir:

[email protected]:~ $ sudo find / -type f -name '*.conf’

find komutu oldukça fazla seçeneğe sahiptir. man find yazılarak, yardım dokümanından bu seçenekler hakkında bilgi edinilebilir. find komutunun çok kullanılan bazı seçenekleri ve görevleri aşağıdaki gibidir:

  • -user: Belli bir kullanıcının sahibi olduğu dosyaları aramak için kullanılır. Parametre olarak sistemde kayıtlı olan bir kullanıcının adı verilir.
  • -group: Belli bir kullanıcı grubuna ait olan kullanıcıların sahip olduğu dosyaları aramak için kullanılır.
  • -size: Belirtilen dosya boyutundaki dosyaları bulmak için kullanılır. Boyut kısaltması olarak c, k, M ve G harfleri sırasıyla byte, Kilobyte (KB), Megabyte (MB) ve Gigabyte (GB) birimleri yerine kullanılır. Size seçeneği ile “den büyük” veya “den küçük” anlamına gelen + ve – işaretleri de kullanılabilir. Örneğin, tüm sistemde 100MB’dan daha büyük dosyaları bulmak için find / -size +50M, 10 byte’tan küçük dosyaları bulmak için ise find / -size 10c komutları çalıştırılabilir.
  • -perm: Erişim izinlerine göre arama yapmak için kullanılır. Perm seçeneği parametre olarak u, g ve o harfleri ile sembolize edilen ve sırasıyla kullanıcı (user), grup (group) ve diğerleri (others) anlamına gelen yetki gruplarına ait erişim izinlerini arayabilir. Her bir yetki gurubu için aranacak rwx (okuma, yazma ve çalıştırma) izinleri ayrı ayrı tanımlanabilir.

Sistemde herkesin yazma izni olan dosyaları bulmak için şu komut yazılabilir:

[email protected]:~ $ sudo find / -perm –o=w

Sistem genelinde, root kullanıcısına ait olan ve herkes tarafından çalıştırılabilir dosyaları bulmak için ise:

[email protected]:~ $ sudo find / -type f -user root -perm -o=x

Dosya ve dizinlerin r (okuma),w (yazma), x (çalıştırma) izinlerinin dışında suid ve guid adı verilen bazı özel erişim izinleri de olabilir. Bu izinler detaylı ls çıktısının erişim izinleri sütununda s harfi ile gösterilir. Suid ve guid bit’leri genel olarak bir programın, çalıştıran kullanıcıdan bağımsız olarak dosyanın sahibi olan kullanıcının hakları ile çalıştırılmasını sağlar. Örneğin su aracına sudo ile yetki vererek çalıştırmak yerine, aracın diskte kayıtlı olan çalıştırılabilir dosyasının suid biti ayarlanırsa herhangi bir kullanıcı su aracını, root yetkileri çalıştırabilir. Bu aynı zamanda bir güvenlik açığıdır. Çünkü su aracının hâlihazırdaki sahibi root’dur. Guid ise aynı işlemi dosyanın sahipler gurubu üzerinde gerçekleştirir.

suid ve guid bit’leri potansiyel olarak bir güvenlik açığı sebebidir ve çok özel durumlar haricinde kullanılmamalıdır. Aşağıdaki komut, sahibi veya grubu root olan ve suid/guid bit’leri ayarlanmış tüm dosyaları listeler:

sudo find / -type f -user root -group root -perm /6000 -exec ls -l {} \;

suid(Setuid) ve guid (Setgid) bit’leri

Aşağıdaki find örneği, sistemdeki büyük dosyaları araştırmak için kullanışlıdır. Komutun bileşenlerinden bahsetmek gerekirse find aracı 10MB’dan büyük dosyaları bulur, exec seçeneğine verilen ls –lh parametresi, bulunan dosyaları detaylı olarak MB cinsinden listeler, awk ise liste içinden sadece dosya adını ve boyutunu seçerek konsola basar.

[email protected]:~ $ sudo find / -type f -size +10000k -exec ls -lh {} \; | awk '{print $NF ": " $5}'

! operatörü arama seçeneğinin önüne yazılarak arama şartı tersine çevrilebilir. Buna göre aşağıdaki örnek sistemdeki uzantısı txt olan ve root kullanıcısına ait olmayan tüm dosyaları listeler.

[email protected]:~ $ sudo find / ! -user root -name '*.txt';

Sistem genelinde sahibi ve grubu tarafından okunabilir ve yazılabilir; fakat çalıştırılamaz olan dosyaları bulmak için, aşağıdaki gibi üçlü bir şart belirtilebilir.

[email protected]:~ $ sudo find / -perm -a+r+w ! -perm -a+x -exec ls -l {} \;

find komutunun, zamana bağlı aramalar gerçekleştirmek için kullanılabilecek bazı seçenekleri ve görevleri aşağıda verilmiştir:

  • newerXY: Referans olarak belirtilen dosyanın değiştirilme/erişilme zamanını baz alarak arama gerçekleştirir. X ve Y a, B, c, m, t değerlerinden birisi olabilir. X arama yapılacak dosyalar için, Y ise referans dosya ya da zaman bilgisi için kullanılır. Bu değerlerin anlamları şöyledir: a (Access) erişim zamanını, B (birth) oluşturulma zamanını, c (change) meta bilgisi  (inode meta-data) değişme zamanını, m (modification) dosya içeriği değişme zamanını ve t ise belli bir zamanı dikkate alır. Örneğin bulut.txt isimli dosyanın erişim (okuma) zamanından sonra değiştirilen (m) dosyaları  / (kök) dizinden başlayarak aramak için find / -newerma gunes.txt komutu yazılabilir.
  • amin: Dakika cinsinden belirtilen süre kadar önce/sonra erişilen (access/okunan) dosyalarda arama yapar.
  • cmin: Dakika cinsinden belirtilen süre kadar önce/sonra meta bilgisi değişen (change) dosyalarda arama yapar.
  • mmin: Dakika cinsinden belirtilen süre kadar önce/sonra içeriği değişen (modification) dosyalarda arama yapar.
  • atime: Gün cinsinden belirtilen süre kadar önce/sonra erişilen (access) dosyalarda arama yapar.
  • mtime: Gün cinsinden belirtilen süre kadar önce/sonra içeriği değişen (modification) dosyalarda arama yapar.
  • ctime: Gün cinsinden belirtilen süre kadar önce/sonra meta bilgisi değişen (change) dosyalarda arama yapar.

Time ile biten seçeneklerde zaman belirtimi için d (day), m (month), y (year) kısaltmaları kullanılabilir. Time ve min ile biten seçeneklerin her ikisinde de + ve – işaretleri ile aramanın belirtilen zaman bilgisinden öncesini mi yoksa sonrasını mı kapsayacağı belirtilebilir. Örneğin;

  • -ctime +10 seçeneği, oluşturulma tarihi 10 günden daha eski dosyaları,
  • -ctime -10 seçeneği, oluşturulma tarihi 10 günden daha yeni olan dosyaları,
  • -ctime 10 seçeneği ise oluşturulma tarihi 240 saat ile 264 saat arasında olan dosyaları seçer.
  • -ctime 0 seçeneği ise son 24 saat içerisinde oluşturulmuş dosyaları seçer.

Yukarıdaki bilgiler ışığında; /home dizininde, gunes.txt dosyasının oluşturulma zamanından sonra değiştirilen dosyaları listelemek için şu komut yazılabilir:

[email protected]:~ $ sudo find /home/ -type f -newermc gunes.txt

Son 10 gün içinde içeriği değiştirilen dosyaları bulmak için şu komut yazılabilir:

[email protected]:~ $ sudo find / -type f -mtime -10 -exec ls -l {} \;

Komutun sonunda –exec seçeneği, ardından gelen ls –l komutundan da anlaşılacağı üzere, sonuçların detaylı dosya özellikleri ile listelenmesini sağlar. find komutunun bulduğu her sonuç için exec seçeneği ile belirtilen komut çalıştırılabilir. Örneğin ls yerine cat komutunu verdiğinizde bulunan her bir dosyanın içeriği ekrana basılacaktır. Komut satırının en sonunda yer alan “{} \;” ifadesi ise “{}“ ve “\;” olmak üzere iki kısımdan oluşur. “{}“ ifadesi find tarafından bulunan her bir dosya yerine geçer, “\;” ifadesindeki “\” ise “;” karakterinin kabuk tarafından komut ayracı olarak yorumlanmaması içindir. “;” ifadesi exec seçeneğine verilen parametrenin sonunu belirtir.

Aşağıdaki komut ise /tmp dizininde yer alan ve bir haftadır hiç erişilmeyen (access) dosyaların silinmesini sağlar.

[email protected]:~ $ sudo find /tmp -type f -ctime +7 -exec rm {} \;

whereis komutu ^

whereis komutu ya da aracı, bir başka komutun çalıştırılabilir dosyasının, kaynak kodlarının ve yardım sayfalarının hangi dizinde olduğunu bulmak için kullanılır. Komutun temel kullanım şekli aşağıdaki gibidir:

whereis [seçenekler] <komut>

Örneğin sistemde yüklü pwd komutu ile ilgili kaynakları bulmak için şu komut çalıştırılabilir.

[email protected]:~ $ whereis pwd
pwd: /bin/pwd /usr/include/pwd.h /usr/share/man/man1/pwd.1.gz

Yukarıdaki komutun çıktısında sırasıyla pwd çalıştırılabilir dosyasının konumu, kaynak kodunun konumu ve dokümantasyonunun konumu listelenmiştir.–b, -m, -s seçenekleri ile sırasıyla çalıştırılabilir dosya (binary), kullanım kılavuzu (manual) ve kaynak kodlarda (source code) arama yapılması sağlanabilir. Örneğin aşağıdaki komut, pwd komutunun sadece yardım dosyasının konumunu görüntüler.

[email protected]:~ $ whereis -m pwd
pwd: /usr/share/man/man1/pwd.1.gz

locate komutu ^

locate komutu, find komutuna benzer bir göreve sahiptir. Sistemde dosya ve dizin araması yapmak için kullanılır. locate dosya ve dizinleri, find komutundan farklı olarak, daha önceden bir listesini (indeks) kaydettiği bir veri tabanında arar. find gibi sistemde canlı bir arama gerçekleştirmediği, sadece kendi veri tabanında arama yaptığı için aramaları çok daha hızlı sonuçlandırır. Temel kullanımı aşağıdaki gibidir:

locate [seçenekler] <dosya/dizin>

locate komutunun arama yaptığı veri tabanı updatedb adı verilen bir araç ile güncellenir. Bu araç veri tabanını /var/cache/locate/locatedb konumunda saklar.

[email protected]:~ $ ls -l /var/cache/locate/locatedb
-rw-r--r-- 1 root root 1921295 May 17 15:18 /var/cache/locate/locatedb

En güncel dosyalarda arama yapmak için updatedb aracının zaman zaman çalıştırılması gerekir ki güncel dosyaların adları veri tabanına eklenebilsin. locate aracı aşağıdaki gibi sisteme kurulduktan sonra /etc/cron.daily/ dizini altına otomatik olarak locate adında bir zamanlanmış cron görevi ekler. Bir script’den ibaret olan bu görev, Linux tarafından her gün bir kez çalıştırılır. Böylece sistemdeki dizin ve dosyaların güncel bir listesi tutulmuş olur. Sisteme locate aracını yükemek ve hızlıca bir dosya araması (örn.:pwd aracı) gerçekleştirmek için aşağıdaki komutlar çalıştırılabilir.

[email protected]:~ $ sudo apt install locate
[email protected]:~ $ sudo updatedb
[email protected]:~ $ locate pwd

which komutu ^

which komutu, çalıştırılabilir program dosyalarını aramak için kullanılır. Arama işlemi sadece PATH ortam değişkeninde tanımlı dizinler içerisinde gerçekleştirilir. Kullanım şekli aşağıdaki gibidir.

which [seçenekler] [program adı]

/etc/profile dosyasında saklanan PATH ortam değişkeninin içeriğini görüntülemek için aşağıdaki gibi bir komut çalıştırabilirsiniz (diğer ortam değişkenleri için env komutunu kullanabilirsiniz)

[email protected]:~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

which komutuna örnek olarak, örneğin Python yorumlayıcısının çalıştırılabilir dosyasının yolunu görüntülemek isterseniz aşağıdaki komutu çalıştırabilirsiniz.

[email protected]:~ $ which python
/usr/bin/python

which komutunun -a seçeneği ile çalıştırılabilir dosyanın sembolik bağlantıları ile birlikte tüm dizin konumlarını listeler. Aşağıdaki örnekte Python ve less programlarının disk konumları listelenmektedir.

[email protected]:~ $ which -a python less
/usr/bin/python
/usr/bin/less
/bin/less

df komutu ^

df (disk free) aracı, diski oluşturan dosya sistemleri ve boş alan miktarları hakkında bilgi görüntüler. Kullanım şekli aşağıdaki gibidir.

df [seçenekler] [dosya adı]

df seçeneksiz olarak kullanıldığında o anda bağlı olan tüm dosya sistemlerini listeler.

[email protected]:~ $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        7528452 5361332   1795740  75% /
devtmpfs          443724       0    443724   0% /dev
tmpfs             448332       0    448332   0% /dev/shm
tmpfs             448332   11928    436404   3% /run
tmpfs               5120       4      5116   1% /run/lock
tmpfs             448332       0    448332   0% /sys/fs/cgroup
/dev/mmcblk0p1     44220   22541     21679  51% /boot
tmpfs              89664       0     89664   0% /run/user/1000

Seçenek olarak bir dosya adı verildiğinde ise, sadece dosyanın yer aldığı dosya sisteminin (disk bölümünün) bilgilerini görüntüler.

df aracının çok kullanılan bazı seçenekleri ve görevleri ise şöyledir:

  • -h: Disk alanı miktarını byte’ın üst katları ile daha anlaşılır olarak görüntüler.
  • -a: Gizli ve erişilemez durumdaki dosya sistemlerini de görüntüler.
  • -T: Dosya sistemlerinin türünü de listeler.
  • -P: POSIX standardına uygun bir biçimde listeleme yapar.
  • -l: Sadece yerel olarak bağlı dosya sistemlerini listeler, ağ kaynakları üzerinden bağlanmış dosya sistemlerini listelemez.
  • -i: Dosya sistemi boyut bilgilerini blok yerine INode cinsinden görüntüler.
  • –total: Çıktı sonunda boyut sütunlarının toplam miktarını da görüntüler.

du aracı ile disk kullanım durumunu listelemek ^

du (disk usage) aracı belirtilen dizini ziyaret ederek dosyaların diskte kapladığı alanı hesaplar. Bu hesaba özyinelemeli olarak alt dizinler de dâhil edilir. du seçeneksiz olarak kullanıldığında, o anda bulunulan dizinde yer alan alt dizinlerdeki dosyaların kapladığı alanı listeler. du aracı ile birlikte en sık kullanılan seçenekler ve çıktıları şöyledir.

-h (human readable) seçeneği ile dosya boyutunu KB, MB ve GB gibi birimler ile kısaltarak daha okunaklı biçimde görüntüler.

[email protected]:~ $ du –h /home/pi
12K     /home/pi/mjpg-streamer/.git/refs/remotes
28K     /home/pi/mjpg-streamer/.git/refs
3.6M    /home/pi/mjpg-streamer/.git/objects

-s seçeneği, alt dizinlerle birlikte tüm dosyaların toplam boyutunu listeler.

[email protected]:~ $ du -hs
8.7M    .

Daha önce de belirtildiği gibi du aracına herhangi bir dizin adı belirtilmezse, araç bulunulan etkin dizindeki dosyaların toplam boyutunu hesaplar. –s seçeneği ile dizin adı belirtildiğinde ise aşağıdaki gibi birinci seviye dizinlerin toplam boyutu listelenir (kök [root] dizin listelendiğinde sudo ile yetki yükseltilmiştir)

[email protected]:~ $ sudo du -hs /*
9.1M    bin
23M     boot
182M    lib
50M     run
11M     sbin
[…]

-c seçeneği listelenen dizinlerin kapladığı toplam alanı çıktının sonuna ekler.

[email protected]:~ $ sudo du -hsc /*
9.1M    bin
23M     boot
182M    lib
50M     run
11M     sbin
[…]
1.2G    total

-m ve –l seçenekleri ise birinci sütuna basılan disk alanı miktarlarını sırasıyla MB ve KB cinsinden yazar.

Aşağıdaki kullanışlı örnek, bulunulan dizindeki en büyük 5 dosyayı ve boyutlarını listelemektedir.

[email protected]:~ $ sudo du -hsx * | sort -rh | head -5
115M    motion
30M     MagPi
9.6M    mjpg-streamer
3.1M    olaylar.txt
2.2M    wiringPi

scp komutu ile ağ üzerinden güvenli dosya kopyalama ^

scp (Secure Copy) uzak bilgisayarlar arasında güvenli şekilde dosya kopyalamak için kullanılır. Ağ veya internet üzerinden dosyaları şifreleyerek aktarır ve hedefine kopyalar. Dosya kopyalamak için SSH’ı kullanan scp, uzak bilgisayarda geçerli bir kullanıcı adı ve parolasına ihtiyaç duyar. Temel kullanımı şu şekildedir:

scp [email protected]_adresi:dosya_adi hedef_dizin/hedef_dosya

Bir örnek ile scp’nin nasıl kullanıldığına bakalım.

[email protected]:~ $ scp -r [email protected]:/home/pi ./yedek

Yukarıdaki komut girildiğinde 192.168.0.20 adresli Raspberry Pi bilgisayarının pi kullanıcısına ait parola sorulur. Parola doğru girildiğinde 192.168.0.20 bilgisayarı üzerindeki, /home/pi dizininin tamamı kopyalamayı başlatan Raspberry Pi’ın ~/yedek dizini altına kopyalanır. –r (recursive/özyinelemeli) seçeneği ile kopyalamaya alt dizler de dâhil edilir.

Aşağıdaki komut ise, önceki komutla alınan yedeği geri kopyalar.

[email protected]:~ $ scp –r ./yedek [email protected]:/home/pi

scp dosyaları ağ üzerinden kopyalarken şifreler. Şifreleme için kullanılan varsayılan algoritma Triple-DES’tir. –c seçeneğini (chiper) kullanarak algoritmayı değiştirebilirsiniz. Triple-DES yerine blowfish kullanıldığında kopyalama hızı artar. Ayrıca –C (büyük c) seçeneği ile sıkıştırma da etkinleştirilebilir. Böylece dosyalar kopyalanmadan önce sıkıştırılır ve hedefinde tekrar genişletilir. Bu, ağ band genişliği kullanımından tasarruf ettirerek kopyalama hızını artırırken, sıkıştırma için fazladan işlemci gücü kullanılır. Bu seçeneklerin kullanımı ile kazanılacak hız, her iki taraftaki bilgisayarın işlemci gücü ve kopyalanacak dosyaların boyutu ile sıkıştırılma oranına bağlı olarak değişkenlik gösterir. Yani, dosyalar sıkıştırıldıktan sonra normalden hızlı şekilde aktarılır; fakat sıkıştırma ve genişletme işlemi dosya türüne göre uzun sürebilir. Özellikle büyük ve ikili (binary) dosyaların sıkıştırılması uzun sürer. Hâlihazırda kaynak tarafta sıkıştırılmış olan dosyalarda yeniden sıkıştırılmaya çalışılacağından sıkıştırma işlemi normalden fazla vakit alabilir.

scp’nin başarımını artırmak

ps (process status) komutu ile işlemleri listelemek ^

ps (process status) komutu o anda hafızada bulunan/çalışmakta olan programları (işlemleri) ve işlem numaralarını (PID) listeler. ps işlemlerle ilgili bilgileri sanal bir dosya sistemi olan /proc dizininden okuyarak görüntüler. Kullanım şekli aşağıdaki gibidir:

ps [seçenekler]

ps seçenek belirtilmeden kullanıldığında içinde çalışılan komut kabuğuna ait işlemleri ve PID numaralarını listeler:

[email protected]:~ $ ps
  PID TTY          TIME CMD
 1186 pts/1    00:00:02 bash
 1759 pts/1    00:00:00 ps

Ekran çıktısında yer alan sütunların anlamları şunlardır:

  • PID: Tekil bir işlem numarasıdır. Linux çekirdeği çalıştırılan her işleme tekil bir kimlik numarası atar.
  • TTY: Kullanıcının oturum açtığı terminalin (teletype) türünü ve numarasını belirtir. pts uzak bağlantıyı TTY ise çalışılan bilgisayara fiziksel olarak bağlı klavye/fare üzerinden oturum açıldığı anlamına gelir.
  • TIME: CPU’nun ilgili işlemin çalıştırılması için ne kadar işlemci zamanı ayırdığını belirtir. Bu değer birikimli bir değerdir ve işlemin çalışmaya başladığı ilk andan itibaren sayılır.
  • CMD: İşlemi başlatan komutun adıdır.

ps aracı belki de komut kabuğunun en çok seçeneğe sahip aracıdır. Tüm seçeneklerini burada açıklamak mümkün değil; ancak bazı çok sık tercih edilen ve kullanışlı kombinasyonları bilmek faydalı olacaktır. Sistemde çalışan tüm işlemlerin dökümünü almak için -aux seçeneklerini kullanabilirsiniz.

[email protected]:~ $ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.6  27136  6148 ?        Ss   06:34   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    06:34   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   06:34   0:00 [kworker/0:0H]

-auxf ile işlemlere ait alt işlemleri ve seçeneklerini görüntüleyebilirsiniz:

[email protected]:~ $ ps auxf
USER       PID %CPU %MEM    VSZ   RSS START   TIME COMMAND
root       460  0.0  0.5  10208  4720 06:34   0:00 /usr/sbin/sshd -D
root      1043  0.0  0.6  11528  5720 08:39   0:00  \_ sshd: pi [priv]
pi        1053  0.0  0.4  11664  3952 08:40   0:01      \_ sshd: [email protected]/1
pi        1056  0.0  0.4   6176  4084 08:40   0:00          \_ -bash
pi        1343  0.0  0.3   7888  3076 10:20   0:00              \_ ps auxf

Sadece pi kullanıcısına ait işlemleri listelemek için;

[email protected]:~ $ ps uf -u pi
USER       PID %CPU %MEM    TTY      STAT START   TIME COMMAND
pi        1053  0.0  0.4    ?        S    08:40   0:02 sshd: [email protected]/1
pi        1056  0.0  0.4    pts/1    Ss   08:40   0:01  \_ -bash
pi        1482  0.0  0.3    pts/1    R+   10:47   0:00      \_ ps uf -u pi

ps aracından faydalanarak çalıştırabileceğiniz bazı kullanışlı komutlar ise şöyledir:

  • En çok bellek tüketen işlemleri görmek için;
    ps -aux –sort -pmem | head -n 10
  • En çok işlemci tüketen işlemleri görmek için;
    ps -aux –sort -pCPU | head -n 10

kill komutu ^

kill komutu, hafızada çalışmakta olan işlemleri (program) sonlandırmak için kullanılır. kill komutu işleme çeşitli sinyaller göndererek sonlanmasını ister. Temel kullanımı aşağıdaki gibidir:

kill [seçenekler] <pid>

kill komutu, zorunlu bir seçenek olarak çalışan işlemin PID (process id) numarasını alır. İşlemin PID numarasını öğrenmek için ps komutundan faydalanabilirsiniz. Aşağıdaki örnekte 1234 pid numaralı işlem sonlandırılmaktadır. kill komutuna bir sinyal türü belirtilmediğinde varsayılan olarak SIGTERM yani terminate (sonlandır) sinyali gönderilir.

[email protected]:~ $ kill 1234
-bash: kill: (1234) - No such process

kill komutu ile kullanılabilecek çeşitli sinyal türlerinin listesini görmek için –L seçeneği kullanılabilir.

[email protected]:~ $ kill -L
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
[…]

Bir işlemi sonlandırabilmek için o işlem üzerinde yetki sahibi olmak gerekir. Örneğin standart bir kullanıcı olan pi, root kullanıcısına ait işlemleri sonlandıramaz. Bunun için sudo ile yetki yükseltmesi yapılmalıdır. Diğer taraftan işleme gönderilen sinyal de sonlandırma sürecinde farklı davranışlar sergiler. Örneğin, en çok kullanılan 9 numaralı sinyal olan SIGKILL, işlemi anında sonlandırır. SIGTERM gönderildiğinde ise işlemin çalışmak ve kaynaklarını serbest bırakmak için birazcık daha zamanı olur; fakat sonunda o da sonlanır. İşletim sisteminin kapanma süreci de SIGTERM sinyallerinin çalışan tüm işlemlere gönderilmesi ile başlar. Kısa bir süre içinde kapanmayan işleme bu defa SIGKILL sinyali gönderilir.

Raspberry Pi üzerinde sudo yetkisi ile çalıştıracağınız aşağıdaki komut PID numarası belirtilen işlemi derhal sonlandırır.

[email protected]:~ $ kill -9 1234

Kullanıcı üzerinde yetki sahibi olduğu tüm işlemleri sonlandırmak isterse, PID numarasına -1 değerini verebilir. Bu durumda kullanıcıya ait tüm işlemler sonlandırılır.

[email protected]:~ $ kill -9  -1

Sinyaller sadece işlemleri sonlandırmak için kullanılmaz aynı zamanda işlemden bilgi almak için de kullanılabilir. Örneğin uzun süren bir göreve başlayan işlemin durumu hakkında bilgi almak için SIGUSR1 ve SIGUSR2 sinyalleri kullanılabilir. Tabii ki bu sinyallere bir cevap alınabilmesi için ilgili programın bu sinyalle cevap verecek bir kod yapısına sahip olması gerekir.

killall ve pkill komutları ^

killall komutunun çalışması kill komutuna benzerdir; fakat argüman olarak sinyal gönderilecek/sonlandırılacak işlemin PID numarası yerine, dosya adını alır. Temel kullanım şekli aşağıdaki gibidir:

killall [seçenekler] <işlem adı>

Örneğin Firefox web tarayıcısının çalışan tüm örneklerini sonlandırmak için basitçe aşağıdaki komutu çalıştırabilirsiniz:

[email protected]:~ $ killall chromium-browser

Sonlandırılmak istenen işleme ait disk dosyasının adının tam olarak yazılması gerekir ve bu ad büyük küçük harf duyarlıdır. Dosya adının bir kısmını belirterek sonlandırmak için ise pkill komutu kullanılır:

[email protected]:~ $ killall chromium

Killall, belli bir kullanıcıya ait işlemlerin hepsinin tek hamlede sonlandırılması için de kullanılabilir. Dikkat: bu komut çalıştırıldığında pi kullanıcısının tüm işlemleri sonlandırılacak ve oturumları kapatılacaktır.

[email protected]:~ $ killall -u pi

jobs, bg (background) ve fg (foreground) komutları ^

fg komutu, Ctrl+Z tuş bileşimi ile arka plana itilen ve durmuş olan bir kabuk işleminin (kabuk programının) arka planda çalıştırılmaya devam edilmesini veya ön planda çalışan bir kabuk işleminin tekrar arka plana itilmesini sağlar.

Uzun çalışma süreleri ve ekran çıktıları ile konsol ekranını sürekli meşgul eden işlemler komut satırının kullanım konforunu olumsuz etkiler. Böyle bir komutun çalışması bitmeden konsola yeni bir komut girmek mümkün olmayabilir. Bu tür durumlarda ilgili program Ctrl+Z tuşları ile durdurulduktan sonra bg (background) komutu kullanılarak ilgili işlemin arka planda çalışmaya devam etmesi sağlanabilir. Böylece hem komut istemi, yeni komutların girişi için serbest kalır hem de program arka planda çalışmaya devam eder. Komutun temel kullanım şekli aşağıdaki gibidir:

bg [işlem numarası]

Aşağıdaki örnekte genel olarak jobs komutu ile kabuk oturumunda çalışan işlemler listelenmekte, ardından durmuş olan 1 numaralı işlemin, bg komutu ile arka planda çalışmasına devam etmesi sağlanmaktadır. Kabuk ortamında herhangi bir programı çalıştırdıktan sonra Ctrl+Z tuş bileşimine basarsanız program durur, komut satırı ile bağlantısı kopar ve arka planda beklemeye başlar.

Bir komutun sonuna & (ampersant) karakterini koyarak da arka planda çalışmasını sağlayabilirsiniz. Her iki durumda da arka plana düşmüş kabuk işlemleri (sadece mevcut kabuk oturumunda, kullanıcı tarafından komut istemi kullanılarak başlatılmış komutlar/programlar) eğer durmuş durumdalarsa, arka planda çalışmaya devam etmeleri sağlanabilir.

Aşağıdaki örnekte tar aracı (tape archive) kullanılarak bir yedek arşiv dosyası oluşturulmak istenmektedir. Ancak bu arşivin oluşturulması uzun sürecek ve komutun çalışması bitinceye kadar komut istemi kullanıcı tarafından kullanılamayacaktır. Bu sorunu çözmek için iki yöntem vardır. İlki komutun sonuna & yazarak işlemi arka planda çalışmaya itmektir. Diğeri ise, aşağıda olduğu gibi komut çalışmaya başladıktan sonra Ctrl+Z tuş bileşimini kullanarak tar programını durdurmaktır. Bu durumda komut istemi yeni komut girişi için serbest kalır. Bundan sonra bg komutuna jobs –l listesindeki işlem numarası verilerek, tar komutunun kaldığı yerden arka planda çalışmaya devam etmesi sağlanmıştır.

[email protected]:~ $ tar -czf home_yedek.tar.gz *
^Z
[1]+  Stopped                 tar -czf home_yedek.tar.gz *
[email protected]:~ $ jobs -l
 [1]+  1259 Stopped                 tar -czf home_yedek.tar.gz *
[email protected]:~ $ bg %1
 [1]- tar -czf home_yedek.tar.gz * &
[email protected]:~ $ jobs -l
[1]-  1259 Running                 tar -czf home_yedek.tar.gz * &

fg komutu (foreground), arka planda itilmiş olan kabuk işlemlerini/programlarını tekrar ön plana getirir. Böylece kullanıcı, ilgili programın arabirimi ile yeniden etkileşime geçebilir. Komutun kullanım şekli bg ile aynıdır. Aşağıdaki örnekte 1 numaralı arka plan işlemi fg komutu ile tekrar ön plana alınmıştır.

[email protected]:~ $ jobs -l
[1]+  1330 Running                 tar -czf home_yedek.tar.gz * &
[email protected]:~ $ fg %1
tar -czf home_yedek.tar.gz *

Arka planda çalışan işleri sonlandırmak için kill komutu da kullanılabilir. Bir kabuk işini (job) sonlandırmak için kill komutuna iş numarası argüman olarak verilebilir.

[email protected]:~$ kill %1

mount komutu ile dosya sistemlerini bağlamak ^

mount komutu, bir depolama donanımını (hdd, USB flaş bellek, SD kart vb.), hatta bir ağ konumu üzerinde bulunan dosya sistemini, bir Linux dizini (genellikle /mnt ve /media altındaki dizinler ile) ile ilişkilendirmek için kullanılır. Bu yapılan işlem bir dosya sistemini bir Linux dizinine bağlamaktan ibarettir. Bir dosya sistemi dizine bağlandığında o dizin kullanılarak erişilebilir olur. İçindeki dosyalar okunabilir ve kaydedilebilir. Dosya sistemi ile işimiz bittiğinde ise dosya sistemi bağlandığı dizinden ayrılır, bu işleme de ayırma (unmount) adı verilir. mount aracı birçok dosya sistemini farklı tür konumlardan bağlayabilir. Komutun temel kullanım şekli aşağıdaki gibidir:

mount [seçenekler] <aygıt> <dizin>

Kullanım şekli şablonunda yer alan <aygıt> parametresi, içerisinde dosya sistemi barındıran bir aygıtı ifade eder, <dizin> ise bu aygıtın hangi dizin aracılığı ile erişilebilir olmasını istediğimiz dizindir. Aşağıda Raspberry Pi’a bağlanmış bir USB diskin mount komutu ile bir dizine nasıl bağlandığı örneklendirilmiştir.

[email protected] ~ $ cd /mnt/
[email protected] ~ $ sudo mkdir usbdisk
[email protected] /mnt $ sudo mount /dev/sda1 usbdisk/
[email protected] /mnt $ cd usbdisk/
[email protected] /mnt/usbdisk $ ls
filmler muzikler programlar notlarım.txt

mount komutuna verdiğimiz aygıt dosyası adı olan /dev/sda1 Linux çekirdeği tarafından otomatik olarak atanmıştır ve aygıt USB port’a takıldıktan sonra lsblk komutunun çıktısında görülebilir. Aygıtta yer alan dosya sistemi /mnt/usbdisk adlı dizine bağlandıktan sonra bu dizin üzerinde her türlü dosya sistemi komutu çalıştırılabilir. Dosya oluşturulabilir, kopyalanabilir ve çalıştırılabilir. Bağladığımız aygıtla işimiz bittiğinde, aygıtı USB port’undan çıkarmadan önce ayırmamız gerekir (unmount). Bunun için aşağıdaki komut verilebilir.

[email protected] ~ $ sudo umount /dev/sda1

mount komutunun diğer seçeneklerinin kullanımı ile ilgili bilgilerden kitap da yeri geldiğinde bahsedilmiştir.

chmod komutu ile erişim izinlerini ayarlamak ^

chmod (change mode) komutu kullanıcı hesaplarının dosya ve dizinler üzerindeki erişim izinlerini ayarlamak için kullanılır. Çok kullanıcılı olan tüm işletim sistemlerinde, kullanıcı hesaplarının dosya sistemi bileşenleri üzerindeki yetkilerinin sınırlandırılması, erişim sınırlarının net şekilde belirlenmesi gerekir. Bu, sistemin kararlılığı ve güvenliği açısından çok önemlidir. Aksi takdirde yetkisi olmayan kullanıcılar ya da programlar başkalarına ait dosyalara erişebilir, bilinçli ya da bilinçsiz olarak hak ihlallerinde bulunabilir, sistemin çalışma kararlılığını sekteye uğratacak işlemler gerçekleştirilebilir. Bu mekanizma, Linux dağıtımlarında sistem genelinde oldukça katı şekilde uygulanır. Bu da Linux’un daha kararlı, uzun ömürlü ve güvenli olmasını sağlar. Erişim izinleri ile sağlanan mekanizma sayesinde, bir kullanıcı sadece kendi dosyaları üzerinde işlem yapabilir veya başka kullanıcı hesaplarına ait dosya/dizinler üzerinde izin verilen ölçüde erişimde (okuma, yazma ve çalıştırma) bulunabilir. Benzer şekilde, sistemde çalışan programların da bir sahibi vardır ve bu sahip, programı çalıştıran kullanıcının kendisidir. Yani, programlar çalıştıran kullanıcının yetkilerine sahip olurlar ve o yetkiler ile işlem yaparlar (örn., Dosya sistemine erişim sağlarlar). Programların dosya sistemi üzerindeki erişim izinleri de dosyalarınkine benzer şekilde çalışır.

# root Kullanıcısı

Tüm Linux tabanlı işletim sistemlerinde var olan bir yönetici hesabı olan root, sistemdeki en yetkili kullanıcıdır ve yetki düzeyi komut isteminde keskin köşeli bir kare karakteri (# – sharp) ile sembolize edilir. Sitemin çalışması sırasında root kullanıcı hesabına herhangi bir kısıtlama uygulanmaz. Bazı önemli sistem servisleri de bu kullanıcı hesabının yetkilerini kullanarak çalışır. Dolayısıyla, root kullanıcı hesabı chmod ile tanımlanan hiçbir erişim iznine tabi değildir. Dosya sistemi üzerinde özgürce işlem yapabilir. Bu nedenle # yetki düzeyinde işlem yaparken çok dikkatli olunması gerekir (Bknz: su aracı)

chmod komutunu incelemeden önce erişim izinleri hakkında kısa bir bilgi vermekte fayda vardır. Bir Linux dosya sisteminde erişim haklarını tanımlayan 3 tür izin grubu vardır, bunlar: sahibi (user/owner), grubu (group) ve diğerleri (others) şeklindedir ve sırasıyla u, g ve o harfleri ile temsil edilirler. Ayrıca bu üç grubu içine alan, hepsi (all) isimli özel bir kapsayıcı tanımı da vardır. Her bir izin grubu ise kendi içinde sırasıyla rwxXst harfleri ile temsil edilen çeşitli erişim izinlerine sahiptir. Dosya ve dizinler üzerinde farklı etkiler gösteren bu izinlerin görevleri aşağıdaki gibidir:

  • r (read): Dosyanın okunulabilmesini, dizinlerin ise içeriğinin listelenebilmesini sağlar.
  • w (write): Dosyanın içeriğinin değiştirilebilmesini, dizinlerde ise yeni bir dizin veya dosyanın yaratılabilmesini sağlar.
  • x (execute): Dosyanın çalıştırılabilmesini, dizinlerde ise dizinin içine girilebilmesini sağlar.
  • s (suid): Çalıştırlabilir dosyaların, dosya sahibinin yetkileri ile çalıştırılmasını sağlar.
  • t (sticky): Dosyanın sahibinden başkası tarafından silinememesini sağlar.

Buraya kadar verilen bilgileri bir örnek üzerinden incelemek gerekirse; aşağıdaki gibi ev dizini içerisinde ls –la komutunu çalıştıralım:

[email protected]:~ $ ls -la
total 86324
drwxr-xr-x 29 pi   pi       4096 May 20 15:24 .
drwxr-xr-x  4 root root     4096 May 10 13:21 ..
-rw-r--r--  1 root root      435 Dec 18 12:09 alan_hareketler.txt
-rw-r--r--  1 pi   pi        361 Dec 18 17:04 alarmi_tetikle.py
-rw-r--r--  1 pi   pi          3 Apr 19 13:56 ataturk.txt
-rwxr-xr-x  1 pi   pi        228 Jan  4 14:47 autostart.sh
-rwxr-xr-x  1 pi   pi        109 Feb 12 18:53 betik.sh
-rw-r--r--  1 pi   pi         28 Dec  1 12:24 detected.txt
-rwxr-xr-x  1 pi   pi         59 Dec 18 12:08 hareket_algilandi.sh
drwxr-xr-x  2 pi   pi       4096 Nov 13  2018 MagPi
drwxr-xr-x  2 pi   pi       4096 Nov 13  2018 Music

Örneğin,  ataturk.txt dosyasının erişim izinlerini inceleyelim. Bu dosyanın sahibi ve grubu pi, erişim izinleri ise “-rw-r–r–“ şeklindedir. Bu izin sütunun başındaki ilk ifade (yani – işareti) satırda listelenen dosya sistemi bileşeninin türünü ifade eder ve bu tür b,c,d,l,s ve – (tire) den biri olabilir. Bu konu ls komutunda detaylı olarak açıklanmıştır. Listelenen satırın sıradan bir dosya olduğunu ifade eden ilk karakteri görmezden gelirsek erişim izni sütununu aşağıdaki gibi üç parçaya ayırabiliriz.

  • rw -: İlk parça dosyanın sahibinin erişim izinlerini belirtir. Bu durumda dosyanın sahibi olan pi dosyayı okuyabilir ve yazabilir; fakat çalıştıramaz.
  • r–: İkinci parça, dosya erişim grubunun erişim izinlerini belirtir. Bu durumda pi isimli kullanıcı grubu (yani bu gruba üye olan tüm kullanıcılar) dosyayı sadece okuyabilir.
  • r–: Üçüncü parça, diğer kullanıcıları ifade eder. Sistemdeki herhangi bir kullanıcı bu dosyayı okuyabilir.

Aynı örneği kullanarak erişim izinlerini dizinler açısında irdelemek gerekirse; Çıktının en başındaki  . (nokta) ile listelenen satır, içinde bulunulan dizini ( /home/pi) sembolize eder. Sahibi ve grubu pi olan bu dizinin erişim izinlerine bakacak olursak “drwxr-xr-x” sütununu görürüz. İlk sembol olan d harfi (directory) listelenen satırın bir dizine ait olduğunu ifade eder. Ardından gelen erişim izinlerinin anlamları şöyledir:

  • rwx: Dizinin sahibi olan pi kullanıcısı tarafından listelenebileceğini, içerisine dosya/dizin kaydedilebileceğini ve cd komutu ile dizine giriş yapabileceği anlamına gelir.
  • r-x: Dizinin erişim grubunda yer alan herhangi bir kullanıcının dizini listeleyebileceği ve dizine giriş yapabileceği anlamına gelir.
  • r-x: pi kullanıcısı ve pi grubu dışındaki herhangi bir kullanıcının, dizine girebileceği ve dizini listeleyebileceği anlamına gelir.

chmod aracı dosya sistemi bileşenlerinin (dosya/dizin/bağlantı/soket) erişim izinlerini ayarlamak için kullanılır. Erişim izni tabiri bazı kaynaklarda mod kelimesi ile de ifade edilir. chmod komutunun temel kullanım şekli aşağıdaki gibidir:

chmod [seçenekler] <mod> <dosya>

Yukarıdaki ekran çıktısında gözüken ataturk.txt isimli dosyanın erişim izinlerini yeniden düzenleyelim. Dosyaya, sadece sahibi için (pi) izinler tanımlayalım. Bu durumda, pi dışındaki hiçbir kullanıcı dosyaya erişemeyecektir (root hariç). Bu işlem için yazılması gereken komut aşağıdaki gibidir:

[email protected]:~ $ chmod u=rwx,g=,o= ataturk.txt
[email protected]:~ $ ls -l ataturk.txt
-rwx------ 1 pi pi 3 Apr 19 13:56 ataturk.txt

Komutun gruplar için erişim izinlerini ayarlayan argümanları olan u,g ve o sırasıyla dosya sahibi, dosya grubu ve diğerleri için erişim izinlerini ayarlar. Örnekte yer alan,  u (user/owner) ‘ya verilen parametre olan rwx, dosya sahibinin dosya üzerinde okuma/yazma/çalıştırma işlemleri yapabileceği anlamına gelir. g (group) ve o (orhers) için boş geçilen parametre erişim izinlerini kaldırmıştır. Aynı işlem aşağıdaki komut ile de yapılabilir:

[email protected]:~ $ chmod a=-rwx,u=rwx ataturk.txt
[email protected]:~ $ ls -l ataturk.txt
-rwx------ 1 pi pi 3 Apr 19 13:56 ataturk.txt

Bu komutun öncekinden farkı u, g ve o için erişim izinlerini tek seferde tanımlayan a (all) kapsayıcısının kullanılmasıdır. Bu örnekte, tüm erişim kategorilerinden, tüm erişim izinleri topluca kaldırılmış ardından, sadece u (owner)’ya yani sahibine rwx izni verilmiştir.

Dizinler açısından erişim izinlerini ayarlamanın dosyalarınkinden farkı yoktur. Aşağıdaki örnek kullanıcının ev dizininin erişim izilerini sadece sahibinin erişebileceği şekilde ayarlamaktadır.

[email protected]:~ $ pwd
/home/pi
[email protected]:~ $ chmod a=-rwx,u=+rwx .
[email protected]:~ $ ls -la "."
total 86456
drwx------ 29 pi   pi       4096 May 21 13:52 .

Erişim izinlerini onluk gösterimle tanımlamak ^

Buraya kadar erişim izinlerinin ayarlanması için çeşitli semboller (a, u, o, g, r, w, x, st) kullanılmıştı. Erişim izinleri onluk-kip (octal-mode) adı verilen yöntemle de tanımlanabilir. İleri kullanıcıların çoğu yazımı daha kısa olan bu yöntemi tercih etmektedir. Bu sistemden kısaca bahsetmek gerekirse erişim izin türleri olan r, w, x sırasıyla 4,2 ve 1 onluk sayılarına karşılık gelir. Örneğin bir erişim grubu türüne tüm izinler (r, w, x) verilmek istenirse, onluk sayıların toplamı olan 7 (4+2+1) kullanılır. Bu toplam, sahip, grup ve diğerleri için ayrı ayrı hesaplanarak birleştirilir.

Son örneğimizde sadece dizinin sahibine tüm erişim izinlerini vermiştik. İzin tanımlayan bu komutu onluk gösterimde yazmamız gerekseydi komut şöyle olurdu:

[email protected]:~ $ chmod 700 .

700 (yedi, sıfır, sıfır) diziliminden oluşan erişim iznine göre;

  1. hane = 7: sahibe tüm izinleri (rwx = 4+2+1) verir.
  2. hane = 0: gruba hiçbir erişim izni vermez.
  3. hane = 0: diğerlerini hiçbir erişim izni vermez.

Başka bir örnek vermek gerekirse; ataturk.txt isimli dosyayı herkesin okuyabilmesini (grup ve diğerleri) ama değiştirememesini, sahibinin ise hem okuyup hem de değiştirebilmesini istiyorsak yazılması gereken izin değeri şöyle hesaplanabilir:

  1. hane (sahip) = 4 (okuma) + 2 (yazma) = 6
  2. hane (grup) = 4 (okuma) = 4
  3. hane (diğerleri) = 4 (okuma) = 4

Bulduğumuz onluk değerleri birleştirecek olursak 644 rakamları çıkar.

[email protected]:~ $ chmod 644 ataturk.txt
[email protected]:~ $ ls -l ataturk.txt
-rw-r--r-- 1 pi pi 3 Apr 19 13:56 ataturk.txt

Erişim izinleri için çevrim içi hesaplayıcı

permissions-calculator.org adresindeki hesaplayıcı sembolik (harfsel) ve onluk gösterimler için erişim izinlerini hesaplayabilir. Hesaplayıcı kullanışlı bir arabirime sahiptir ve aynı zamanda onluk gösterimleri de çözümleyebilir.

suid, guid izinleri ^

Bir dosya sistemi bileşeni için rwx dışında, suid, guid, sticky ve eXecute izinleri de vardır. Linux işletim sistemlerinde bir dosya oluşturulduğunda sahibi otomatik olarak oluşturan kullanıcı olarak ayarlanır. Benzer şekilde, kullanıcı bir program çalıştırdığında da program o kullanıcının sahipliği ile çalıştırılır ve program, çalıştıran kullanıcının erişim izinleri ile sınırlandırılır. Bu tüm işletim sistemlerinde var olan temel bir davranıştır. Daha somut örneklemek gerekirse; sahibi pi olan bir program (yani pi kullanıcısı tarafından çalıştırılmış olan program), pi kullanıcısının erişim izinleri ile çalıştırılır ve örneğin po kullanıcısının dosyalarını okuyamaz. Program dosyalarının çalışma izinleri ile ilgili olan bu davranış, gerektiğinde suid ve guid adı verilen erişim izinleri ile değiştirilebilir.

Örneğin, çalıştırılabilir bir dosyaya suid izni verilirse, o dosya çalıştıran kullanıcıdan bağımsız olarak dosyanın sahibi olan kullanıcının hakları ile çalışır. Bir dosyanın suid iznini ayarlamak için aşağıdaki komut verilebilir.

[email protected]:~ $ ls -l alarm.sh
-rwxr-xr-x 1 pi pi 0 May 21 17:49 alarm.sh
[email protected]:~ $ chmod u=+s alarm.sh
[email protected]:~ $ ls -l alarm.sh
---Sr-xr-x 1 pi pi 0 May 21 17:49 alarm.sh

Benzer komut, onluk gösterim ile de verilebilir. Bu durumda, suid için 4, guid için de 2 değeri kullanılır. suid’i onluk gösterim kullanarak ayarlamak için diğer erişim izni gruplarını da belirtmek gerekir.

[email protected]:~ $ chmod 4755 alarm.sh
[email protected]:~ $ ls -l alarm.sh
-rwsr-xr-x 1 pi pi 0 May 21 17:49 alarm.sh

Komut çalıştırıldıktan sonra dosya sahibinin izinlerini tanımlayan grubun x (execute) hanesinde s (suid bit) gösterilir. Sembolik gösterimle ayarlamak için diğer izin gruplarını belirtmeye gerek yoktur.

[email protected]:~ $ chmod u=+rws alarm.sh
[email protected]:~ $ ls -l alarm.sh
-rwSr-xr-x 1 pi pi 0 May 21 17:49 alarm.sh

Yukarıdaki çıktının x hanesinde yer alan s harfinin büyük olması dikkatinizi çekmiş olabilir. Bunun anlamı dosyanın sahibine çalıştırma izni verilmemiş olmasıdır. Dosyanın sahibine de çalıştırma izni vermek için u=+rwxs yazılabilir.

guid ise aynı işlemi, dosyaya erişim izni olan grubun üyeleri için yapar. guid iznini ayarlamak için de şu iki komuttan biri kullanılabilir.

[email protected]:~ $ chmod g=+rws alarm.sh
[email protected]:~ $ chmod 2755 alarm.sh

sticky (t) izni ^

sticky bit ya da sticky erişim izni ise, dizinler ve dosyalar üzerinde farklı etkiler gösterir. Bir dizinin sticky bit’i ayarlanırsa o dizin içerisinde herhangi bir kullanıcı kendi dosyasını oluşturabilir; fakat diğer kullanıcılar bu dosyayı düzenleyemezler. Linux sistemlerde geçici dosyaların tutulduğu /tmp dizininin sticky bit’i varsayılan olarak ayarlanmıştır ve diğerleri (others) erişim sütununda t harfi ile gösterilir. Bu durumu aşağıda görebilirsiniz. :

[email protected]:~ $ ls -la /tmp/
total 48
drwxrwxrwt 11 root root 4096 May 21 18:57 .
drwxr-xr-x 21 root root 4096 Nov 13  2018 ..

Bir dizinin sticky bitini ya da erişim iznini ayarlamak için sembolik ya da onluk gösterim kullanılabilir. Aşağıdaki her iki komut da pi kullanıcısının ev dizininde yer alan geçici adlı dizine sticky izni vermektedir.

[email protected]:~ $ mkdir gecici
[email protected]:~ $ chmod 1777 gecici/
[email protected]:~ $ chmod a=rwx,o=rwxt gecici
[email protected]:~ $ ls –l
drwxrwxrwt  2 pi   pi       4096 May 21 19:00 gecici

sticky bit, bir dosya için ayarlandığında ise dosya ön belleğinde (swap) bulunmaya devam eder. Normal bir dosya çalıştırılmadan önce veya bir başka program vasıtasıyla açılmadan önce diskten okunarak RAM’deki dosya ön belleğine (buffer) yüklenir. Dosya kullanımdan kalktığında ise ilgili bellek alanı boşaltılır. Eğer böyle bir dosyanın sticky bit’i ayarlanmışsa dosya kullanımdan kalksa dâhi RAM bellekten atılmaz. Böylece dosyaya ihtiyaç olması durumunda yeniden diskten okunmasına gerek kalmaz. Bu da dosya ile yapılacak işlemlerde sistem başarımı bir artırır.

chmod için kullanışlı seçenekler ^

chmod bazı kullanışlı parametrelere sahiptir. Burada sadece en sık ihtiyaç duyulanlar açıklanmıştır. Daha fazlası için man chmod komutu ile yardım alabilirsiniz.

-R seçeneği, öz yinelemeli (recursive) anlamına gelir ve aynı anda bir dizin ya da dosya topluluğunun erişim izinlerini ayarlamak için kullanılır. Örneğin aşağıdaki komut pi kullanıcısının ev dizinindeki tüm dosyalara ve alt dizinlerine 755 iznini tanımlar.

[email protected]:~ $ sudo chmod -R 755 *

-v seçeneği, bir dosyanın erişim izni değiştirilirken yapılan değişiklikleri görüntüler. Görüntülenen değişiklik dosyanın ilk hali ve son haline ait erişim izinlerini içerir:

[email protected]:~ $ chmod 777 ataturk.txt
[email protected]:~ $ chmod -v 755 ataturk.txt
mode of 'ataturk.txt' changed from 0777 (rwxrwxrwx) to 0755 (rwxr-xr-x)

chown ve chgrp ile dosya/dizinlerin sahibini tanımlamak ^

chown (change owner) komutu bir dosyanın/dizinin sahibini değiştirmek için kullanılır. Temel kullanım şekli aşağıdaki gibidir:

chown [SEÇENEKLER] <SAHİBİ[:[GRUBU]]> <dosyalar/dizinler>

Linux’ta bir dosya oluşturulduğunda, sahibi ve grubu olarak oluşturan kullanıcı tanımlanır. Sistemde po adlı bir kullanıcı olduğunu varsayarsak, pi kullanıcısın ev dizinindeki linux.txt dosyasının sahibini ve grubunu po olarak ayarlayalım:

[email protected]:~ $ chown po:po linux.txt
chown: changing ownership of linux.txt': Operation not permitted

Yukarıdaki komut, linux.txt’nin sahibinin ve grubunun po ile değiştirilmesine izin verilmediğini uyarmaktadır. Sıradan bir kullanıcı herhangi bir dosyanın (kendine ait olmayan) sahipliğini değiştiremez; fakat grubunu üyesi olduğu başka bir grup ile değiştirebilir. Bu işlemi koşulsuz yapabilecek tek kullanıcı root’dur. Bu nedenle chown komutunun yetkisini sudo ile yükseltmek gerekir.

[email protected]:~ $ sudo chown po:po linux.txt
[email protected]:~ $ ls -l linux.txt
-rwxr-xr-- 1 po po 7 May 21 23:38 linux.txt

chown komutunun en çok kullanılan seçeneklerinden biri de chmod’da olduğu gibi –R (recursive)’dir. Bu seçenek dosya ve dizinlerin sahiplik tanımlarını toplu olarak değiştirir. Örneğin aşağıdaki komut pi kullanıcısının dizinindeki her şeyin (alt dizinler de dâhil) sahibini ve grubunu pi olarak ayarlar.

[email protected]:~ $ sudo chown -R pi:pi *

su aracı ile kullanıcı değiştirmek ^

su (switch user) komutu, mevcut kabuk oturumu içinde, kullanıcı hesapları arasında geçiş yapmak için (switch) kullanılır. Geçiş yapılmak istenilen kullanıcı hesabının adını argüman olarak alan su komutu, argümansız olarak çalıştırıldığında root kullanıcısına geçiş yapar. Komutun temel kullanımı aşağıdaki gibidir:

su [seçenekler] [kullanıcı adı]

Aşağıdaki komutlar ile önce po kullanıcısına geçiş yapılmış ardından su argümansız çalıştırılarak root kullanıcına geçiş yapılmış, ardından 2 kere exit yazılarak sırasıyla po ve pi kullanıcı oturumlarına geri dönülmüştür

[email protected]:~ $ su po
Password:
[email protected]:/home/pi $ whoami
po
[email protected]:/home/pi $ su
Password:
[email protected]:/home/pi# exit
[email protected]:/home/pi $ exit
exit
[email protected]:~ $

su komutu ile her kullanıcı geçişi sırasında, geçiş yapılacak kullanıcı hesabının parolası sorulur. Ancak, sistemde en yetkili kullanıcı olan root kullanıcısı etkinken, geçiş yapılacak hesap için parola sorulmaz. Çünkü root sistemdeki en yetkili kullanıcıdır..

sudo aracı ile yetki yükseltmek ^

sudo (Super User Do) komutu belli bir kullanıcıya belli bir programı çalıştırmak için yetki vermek amacıyla kullanılır. Bu yetki sistemin en yetkili kullanıcısı olan root seviyesindedir. Yetkilendirme işlemi chmod ve chown komutları aracılığıyla yapılabilse de sudo yetkilerinin tanımlandığı /etc/suders dosyası merkezi bir yapılandırma/kontrol noktası yarattığı için daha kullanışlıdır. Aksi takdirde sudo aracı olmadan kullanıcılara yetki vermek gerektiğinde çalıştırılabilir dosyaların birden fazla kopyasını farklı sahip ve çalıştırma izinlerine sahip olacak şekilde çoğaltmak gerekirdi ki bu çok kötü bir yapılandırma şeklidir. sudo sadece istenilen kullanıcılara sadece istenilen araçları çalıştırmak için yetki vermeyi sağlar. sudo aynı zamanda yapılan işlemleri kayıt altına aldığından hangi kullanıcının yetkisini ne zaman ne şekilde kullandığı günlük dosyası aracılığı ile geçmişe dönük takip edebilmek mümkündür.

Farklı çalıştır ve sudo

sudo, Windows’tan alışık olduğumuz yönetici hakları ile çalıştır (Shift+Sağ Tuş) seçeneğine benzer. Windows’un aksine bir Linux bilgisayarı en baştan, sıradan kullanıcının (pi) sadece kendine ait dosyalar ile çalışabileceği şekilde tasarlanmıştır. Kullanıcının diğer dosyaları değiştirebilmesi için yetki alması gerekir. sudo, Raspberry Pi’da genellikle komutların başına yazılarak, ilgili komutun sistem yöneticisinin (root) yetkileri ile çalıştırılmasını sağlar.

Örneğin kitap boyunca da çokça kullanılan apt (ya da apt) aracı sistemde kalıcı değişiklikler yarattığından çalışabilmesi için root kullanıcısının yetkilerine ihtiyaç duyar. Fakat pi kullanıcısı root yetkilerine sahip olmayan sıradan bir kullanıcıdır. Raspiban’da pi kullanıcısı için sudo yetkileri tanımlanmıştır. Tek kullanıcılı olarak (pi) tasarlanan Raspberry Pi OS dağıtımında sudo tanımlarına ihtiyaç duyulmasının bir amacı da yanlışlıkla verilecek komutlardan sistemi korumaktır. Yani, yetki gerektiren bir işlem yapmak gerektiğinde komutun başına sudo ifadesini eklemek gerekir. sudo kendinden sonra seçenek olarak verilen programın yetkisini root’a yükselterek çalıştırır. Diğer türlü, sürekli olarak root yetkilerinde çalışacak bir pi kullanıcısı, kullanıcının yanlış verdiği komutlardan kaynaklı olarak kısa sürede zarar görebilirdi.

Örneğin, kitapta yeni bir paket yüklemeden önce update işlevi çalıştırılan apt aracı sudo kullanılmadan çalıştırıldığında permission denied uyarısı verir.

[email protected]:~ $ apt update
[...]
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
[...]

sudo aracı için kullanıcı yetkilerinin tanımlandığı dosya /etc/sudoders’dir. Bu dosya aşağıdaki örnekte görülebileceği gibi düz metin dosyası formatındadır ve mutlaka visudo aracı ile düzenlenmelidir.

[email protected]:~ $ sudo visudo
[...]
# User privilege specification
root    ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

sudoers dosyasının kullanıcı yetkilendirme ile ilgili satırının yazım biçimi aşağıdaki gibidir:

kullanıcı (bilgisayar)=(kullanıcı:grup) komutlar

Bu yazım biçimine göre yukarıdaki sudoers dosyasının içeriğinde yer alan “root    ALL=(ALL:ALL) ALL” satırını açıklamak gerekirse; root kullanıcısı herhangi bir bilgisayardan bağlanarak herhangi bir gruba ya da kullanıcıya ait olan herhangi bir komutu belirtilen kullanıcı ve grup yetkileri ile çalıştırabilir. Buradaki herhangi ifadesi ALL anahtar kelimesi ile ifade edilmektedir.

Dosya herhangi bir metin editöründe düzenlenebileceği gibi visudo düzenleyicisi ile düzenlenmesi tavsiye edilir. Çünkü visudo gerçekleştirilen yapılandırmanın yazım kurallarına uygunluğunu da kontrol eder. Yani, uygunsuz biçimde yaptığınız bir yapılandırma için sizi aşağıdaki gibi uyaracaktır.

[email protected]:~ $ sudo visudo
>>> /etc/sudoers: syntax error near line 9 <<<
What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)

Örneğin po kullanıcısının sudo yetkisi ile sistemin tarihini değiştirebilmesi için izin vermek isterseniz (ki öncelikle sisteme po adlı kullanıcı hesabını eklemelisiniz) sudoers dosyasını aşağıdaki gibi güncellemeniz yeterlidir.

[email protected]:~ $ sudo visudo
[…]
# User privilege specification
root    ALL=(ALL:ALL) ALL
po      ALL=(root:root) /usr/bin/timedatectl
[…]

Yukarıdaki örnekte po adlı kullanıcı, sudo aracılığı ile timdatectl programını root yetkisi ile çalıştırabilme izni kazanmıştır. Bunu denemek için po kullanıcısına geçiş yaparak sistemin zaman dilimini aşağıdaki gibi ayarlamayı deneyin.

[email protected]:~ $ sudo su po
$ sudo timedatectl set-timezone "Europe/Istanbul"
[sudo] password for po:

Sistemin saat dilimini ayarlamak için timedatectl komutunu verdiğinizde, po kullanıcısını parolasını girmeniz istenir. Eğer bu parolanın da sorulmasını istemiyorsanız sudoers dosyasına aşağıdaki gibi NOPASSWD anahtar kelimesini ekleyebilirsiniz:

[email protected]:~ $ sudo visudo
[…]
# User privilege specification
root    ALL=(ALL:ALL) ALL
po      ALL=(root:root) NOPASSWD:/usr/bin/timedatectl
[…]

Kullanıcıların sudo aracılığı ile işlettiği komutların günlük kayıtları Raspberry Pi OS dağıtımında /var/log/auth.log dosyasında tutulur. sudo ile kimin hangi komutu ne zaman çalıştırdığını görmek için aşağıdaki komutu çalıştırabilirsiniz:

[email protected]:~ $ cat /var/log/auth.log | grep "sudo:"
[…]
Jun  1 14:04:09 raspberrypi sudo:       po : TTY=pts/2 ; PWD=/home/pi ; USER=root ; COMMAND=/usr/bin/timedatectl set-timezone Europe/Istanbul
[…]

date komutu ve tarih/saat işlemleri ^

date komutu sistemin tarih ve saatini görüntülemek için kullanılır. Komut aynı zamanda, sistem zamanını oluşturan tarih ve saat bilgisini değiştirmek için de kullanılabilir. date komutunun temel kullanım şekli aşağıdaki gibidir:

date [seçenekler]

date komutu herhangi bir seçenek belirtilmeden kullanıldığında mevcut sistem zamanını varsayılan biçiminde görüntüler. Bunu aşağıda görebilirsiniz:

[email protected]:~ $ date
Sat  1 Jun 09:41:58 BST 2022

Sistem zamanını istenilen biçimde görüntülemek ve ayarlamak için bazı anahtarlar kullanılır. Öncelikle sistem zamanını kendi belirleyeceğimiz biçimde görüntüleyip daha sonra bu anahtarların görevlerini açıklayalım. Aşağıdaki örnek, sistem zamanını “Yıl/Ay/Gün Saat:Dakika:Saniye” biçiminde görüntülemektedir. Yıl, ay, gün, saat, dakika ve saniyenin belirtimi için sırasıyla Y,m,d,H,M ve S harfleri ve her harfin solunda % sembolü kullanılır. Diğer anahtarlar için man date komutu ile yardım alabilirsiniz.

[email protected]:~ $ sudo date "+%Y-%m-%d %H:%M:%S" --set="2018-06-01 14:20:00"
2018-06-01 14:20:00

Sistem zamanını ayarlamak için ise, date komutu aşağıdaki gibi set seçeneği ile sudo yetkisi verilerek çalıştırılabilir.

[email protected]:~ $ sudo date "+%Y-%m-%d %H:%M:%S" --set="2019-06-01 14:16:00"
2018-06-01 14:06:00

Bilgisayar sistemlerinin tarih ve zaman işlevleri ile ilgili bir başka konu da, sistem zamanının değişen saat dilimlerine adapte olarak dünyanın farklı coğrafyaları (boylam) ile eş güdümlü hale gelmesi ve en güncel (doğru) tarih/saat bilgisine sahip olunmasıdır. Özellikle internet ortamında güvenli iletişim için kullanılan şifreleme mekanizmalarının (SSL, TSL) temel taşlarından biri zaman bilgisidir. Veri, sistem zamanları doğru ayarlanmamış iki sistem arasında güvenli olarak aktarılamaz. Örneğin, sistem zamanını yanlış bir tarihe ayarlayarak HTTPS bir web sayfasını ziyaret etmeyi deneyebilirsiniz. Muhtemelen kullandığınız tarayıcı, güvenlik sertifikasının görevini yapamadığını ve sayfa iletişimin güvensiz olduğu konusunda uyarı verecek, sayfayı görüntülemeyi reddedecektir.

İçinde bulunduğumuz ülkenin şehirleri saat dilimi olarak İstanbul’u referans alır. İstanbul zamanı ise diğer coğrafyalar ile kıyaslamalı bir zaman bilgisi sağlaması için Londra’nın Greenwich şehrinin öğlen zamanını referans alır. Buna GMT (Greenwich Mean Time) adı verilir ve İstanbul dolayısıyla Türkiye, Greenwich’in 2 saat doğusunda yer aldığından, Türkiye göreceli zamanı GMT+2 olarak ifade edilir. GMT zaman dilimi UTC (Coordinated Universal Time) adı verilen bir standart ile tanımlanmıştır ve pratikte GMT ile UTC zamanları aynı sonucu verir.

Sistemin saat dilimini görüntülemek ve ayarlamak için raspi-config aracı kullanılabileceği gibi timedatectl aracından da faydalanılabilir. Aşağıdaki ekran çıktısında sistem zamanı bilgileri detaylı olarak görüntülenmektedir.

[email protected]:~ $ timedatectl
      Local time: Sat 2019-06-01 12:33:14 BST
  Universal time: Sat 2019-06-01 11:33:14 UTC
        RTC time: n/a
       Time zone: Europe/London (BST, +0100)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Yukarıdaki ekran çıktısında; komutu çalıştırdığımız Raspberry Pi bilgisayarının zaman dilimi, Londra (Europe/London) BST+1 (British Summer Time) olarak ayarlı olduğundan, evrensel zamandan (Universal time) 2 saat ileridedir (İngiltere zamanının [BST] kendisi de UTC’den 1 saat ileridedir). Ayrıca Raspberry Pi varsayılan olarak, NTP servisi ile sistem zamanını ağdaki bir zaman sunucusundan veya internetten otomatik olarak güncelleyecek şekilde yapılandırılmıştır. NTP servisinin çalışıp çalışmadığını aşağıdaki komut ile görebilirsiniz.

[email protected]:~ $ sudo systemctl status systemd-timesyncd

Sistemin zaman dilimini ayarlamak için ise mevcut zaman dilimlerini aşağıdaki gibi listeleyip, bulunduğunuz coğrafi konuma uygun bir zaman dilimi tanımlayabilirsiniz.

[email protected]:~ $ timedatectl list-timezones | grep Istanbul
Europe/Istanbul
[email protected]:~ $ sudo timedatectl set-timezone "Europe/Istanbul"

Zaman dilimini tanımladıktan sonra, NTP servisi sayesinde yıllın önceden belirlenmiş belli zamanlarında Raspberry Pi’ın sistem zamanı otomatik olarak ileri veya geri alınacaktır.

timedatectl SystemD’nin bir parçasıdır. SystemD konusunda anlatıldığı üzere; Linux kullanımı ve yönetimi konusunda ortak bir yöntem ve araçlar topluluğu sunan SystemD, her yeni Linux sürümünde kendini daha fazla hissetiriyor.

adduser, deluser ve passwd komutları ile kullanıcı hesabı işlemleri ^

Linux sistemlerde kullanıcı hesabıyla ilgili temel bilgiler (kullanıcı id, grup id, ev dizini, kabuk programı vb.) /etc/passwd dosyasında tutulur. Kullanıcının parolası ise /etc/shadow dosyasında karıştırılmış bir şekilde tutulur. Yani, Linux’un kullanıcı hesabı sisteminin bel kemiği bu iki dosya üzerine kuruludur. Bir kullanıcı hesabı eklemek, silmek veya değiştirmek için bu dosyalar doğrudan düzenlenebileceği gibi daha kolay yollar da vardır. Örneğin adduser komutu.

kullanıcı hesabı eklemek ^

İlk olarak sisteme yeni bir kullanıcı hesabının nasıl ekleneceğine bakalım. Bu işi yapan komutun adı adduser’dır ve temel kullanım şekli aşağıdaki gibidir:

adduser [SEÇENEKLER] <kullanıcı hesabı adı>

Komutun çalıştırılabilmesi için sudo yetkisi verilmesi gerekir. Sisteme po isminde bir kullanıcı eklemek için aşağıdaki komut verilir:

[email protected]:~ $ sudo adduser po
Adding user `po' ...
Adding new group `po' (1001) ...
Adding new user `po' (1001) with group `po' ...
The home directory `/home/po' already exists. Not copying from `/etc/skel'.
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for po
Enter the new value, or press ENTER for the default
        Full Name []: Ensei Tankado
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

Komut kullanıcı eklemek için çeşitli sorular sorar. Bunlardan ilki kullanıcı hesabının parolasıdır. Ardından boş geçilebilecek bazı hesap tanıtıcı bilgiler girilmesi istenir. Bunlar ad soyad (Full Name), oda numarası (Room Number), iş telefonu (Work Phone), ev telefonu (Home Phone) ve diğer. En son, bilgiler doğruysa enter tuşuna basılarak onaylanır. po hesabı eklendikten sonra cat ve grep aracı yardımıyla passwd ve shadow dosyaları aşağıdaki gibi görüntülenebilir.

[email protected]:~ $ cat /etc/passwd | grep po
po:x:1001:1001:Ensei Tankado,,,:/home/po:/bin/bash

passwd dosyasında, po adlı kullanıcı hesabına ait bilgiler : (iki nokta üst üste) karakteri ile ayrılmış alanlarda tutulur. Daha sonra hesap bilgilerini değiştirmek için passwd dosyası nano editörü ile açılarak doğrudan düzenlenebilir. Her bir satırında bir kullanıcı hesabına ait bilgilerin tutulduğu dosyadaki bilgilerin anlamları sırasıyla şunlardır:

  • po: kullanıcı hesabının adı.
  • x: Önceleri bu kısımda karıştırılmış parolalar tutulurdu; fakat güvenlik nedeniyle parolalar sadece sistem yöneticisinin okuma yetkisi olan shadow dosyasında tutulmaktadır. X’in anlamı karıştırılmış parolanın shadow dosyasında kayıtlı olduğudur.
  • 1001: kullanıcı id’sidir. Her kullanıcı sistemde tekil bir id (identification number) numarası ile temsil edilir. Oturum açmış kullanıcının id’si id komutu ile görüntülenebilir. Sistemin en yetkili kullanıcısı olan root’un id numarası 0’dır. Eğer bu id numarası 0 ile değiştirilirse po kullanıcısı root yetkilerini kazanacaktır.
  • 1001: grup id’sidir. Özel olarak belirtilmezse her kullanıcı için, kullanıcı adıyla aynı yeni bir kullanıcı grubu oluşturulur. Kullanıcı hesabını eklerken belli bir gruba dâhil etmek için addgrup seçeneğinden faydalanılabilir.
  • Ensei Tankado,,,: Kullanıcı hesabının ad,soyad, telefon gibi tanıtıcı bilgileri yer alır.
  • /home/po: Kullanıcın ev dizininin patikasıdır.
  • /bin/bash: Kullanıcı hesabının varsayılan komut kabuğudur. Eğer bu kabuk /bin/nologin veya /bin/false yapılırsa kullanıcı sistemde oturum açamaz.

Kullanıcının karıştırılmış (hashed) parolasının tutulduğu dosya sadece sistem yöneticisi tarafından okunabilir. Karıştırılmış olan bu parola okunabildiği takdirde John The Ripper gibi parola kırma aracıyla ya da Rainbow Table’lar aracılığı ile hızlıca kırılabilir. Bu nedenle parola seçerken içerisinde büyük küçük harf ve sembollerin bulunmasına dikkat etmelisiniz.

[email protected]:~ $ sudo cat /etc/shadow | grep po
po:$6$1a3FpliG$lq5hKTovi3JAYYnyS6VOJAjNb9QBkQJBkbP6j0j0T2ntvOj.WUOr/gbj9lT0ho5Zixsw7QXhgJ4t.k2NBMDvW1:18044:0:99999:7:::

finger adlı araç bir kullanıcı hesabı hakkında çeşitli bilgiler görüntüleyebilir:

[email protected]:~ $ sudo apt install finger -y
[email protected]:~ $ finger po
Login: po                               Name: Ensei Tankado
Directory: /home/po                     Shell: /bin/bash
Never logged in.
No mail.
No Plan.

finger aracının görüntülediği bilgiler yukarıda gözükmektedir. Login satırı kullanıcı hesabının sistemdeki geçerli adıdır. Directory, kullanıcının ev dizinidir. Ayrıca Shell kısmında kullanıcının varsayılan olarak hangi komut kabuğunu kullandığı yazmaktadır.

useradd vs adduser

Linux sistemlerde useradd adlı bir komut da yer alır. useradd komutu, adduser komutuna göre daha düşük seviyeli bir komuttur ve adduser’da olduğu gibi eklenecek hesaba dair detayları sormaz, doğrudan passwd ve shadow dosyalarına sade birer satır ekler. Bu araç özellikle kullanıcı ile etkileşimin istenmediği betiklerde kullanmak için faydalıdır.

kullanıcı hesabı silmek ^

deluser adlı araç, sistemde kayıtlı bir kullanıcı hesabını ya da grubunu siler. Temel kullanım şekli aşağıdaki gibidir:

deluser [seçenekler] kullanıdı/grup

Aşağıdaki komut sistemdeki po kullanıcısını siler; fakat kullanıcının ev dizinine ve buradaki dosyalara dokunmaz.

[email protected]:~ $ sudo deluser po
Removing user `po' ...
Warning: group `po' has no more members.
Done.
[email protected]:~ $ ls /home/
pi  po

deluser komutu ile kullanıcının ev dizinini de silmek için –remove seçeneği kullanılabilir. Ayrıca –force seçeneği ile hâlihazırda oturum açmış bir kullanıcı hesabını da silinebilir.

userdel vs deluser

userdel komutu ise deluser’dan farklı olarak hiçbir onay almadan passwd ve shadow dosyalarından ilgili girdi satırlarının yanında kullanıcının ev dizinini de siler.

Kullanıcı hesabının parolasını değiştirmek ^

passwd adlı araç kullanıcı hesaplarının parolalarını tanımlamak/değiştirmek için kullanılır. Temel kullanımı aşağıdaki gibidir:

passwd [seçenekler] [hesap adı]

Bir kullanıcı kendi hesabının parolasını değiştirmek isterse aşağıdaki gibi sadece passwd komutunu vermesi yeterlidir. Yeni parola tanımlamadan önce geçerli parolanın girilmesi istenir.

[email protected]:~ $ passwd
Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Eğer passwd aracına aşağıdaki gibi sudo yetkisi verilirse geçerli parolanın girilmesi istenmez ve root hesabının parolası değiştirilir.

[email protected]:~ $ sudo passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Belli bir kullanıcı hesabının parolasını değiştirmek için ise aşağıdaki gibi kullanıcı hesabının adı belirtilmelidir (örn.:pi).

[email protected]:~ $ sudo passwd pi
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

bilgi ve yardım komutları ^

Bir Linux bilgisayarının komut satırının kullanırken yardım alınabilecek birçok araç vardır. Bu araçlar ile Linux’un alt yapısını oluşturan her türlü bileşen ve sistemde yüklü dâhili ve harici komutlar/araçlar hakkında çok detaylı bilgiler görüntülenebilir. Çünkü Linux belgelendirme özelliği (dokümantasyon) çok güçlü bir işletim sistemidir. Açık kaynak araçlar da çoğunlukla böyledir. Öyle ki, çoğu zaman bir Linux özelliği ya da komutu hakkında yardım almanız gerektiğinde çevrim içi kaynaklara göz atmanız gerekmez; çünkü bu araçlar beraberinde kapsamlı bir yardım (manual) ya da kullanım kılavuzu (belgeleri) ile birlikte gelirler.

Belgeler (manuals) üzerinden bir komut ya da bileşen hakkındaki erişilebilecek bu bilgiler, çoğu zaman erişilebilecek en yalın ve doğru bilgileri içerir. Bu nedenle, bir komut ya da Linux özelliği hakkında daha fazla araştırma yapmanız gerektiğinde öncelikle sistemde hâlihazırda yüklü yardım sayfalarını kullanarak bunu gerçekleştirin. Sonraki başlıklarda, bu araştırmaları nasıl gerçekleştirebileceğiniz hakkında bilgiler verilmiştir.

man (manual) aracı ile kullanım kılavuzlarını görüntülemek ^

man aracı sistemde yüklü programların yardım dosyalarında araştırma yapmak için kullanılır. Yardım dosyaları (manuals) sistemde yüklü programlar, kullanım seçenekleri ve yapılandırma dosyaları yanında, Linux çekirdek API fonksiyonları (alt programlar/sistem çağrıları), Linux kavramları ve yüklü kütüphaneler hakkında yardım dosyalarını araştırır ve görüntüler. Yapılandırma dosyaları bir programın ya da işletim sisteminin nasıl çalışacağını/davranacağını söyleyen basit veri tabanları olarak düşünülebilir. Çekirdek API fonksiyonları ise Linux çekirdeğinin içine gömülmüş alt programlardırlar ve bir başka programdan çağrılarak çeşitli hizmetlerin yerine getirilmesini sağlarlar. Kütüphaneler ise bir yazılımın geliştirilmesi sırasında programcılar tarafından çağrılarak kullanılan alt programlar topluluğudur.

Yardım dosyaları programlar ve işletim sistemi ile eş zamanlı olarak güncellenirler. Böylece kullanıcılar sürüm farklılıklarından doğan değişikliklerden de haberdar olabilirler. man aracının temel kullanım şekli aşağıdaki gibidir:

man [seçenekler] <anahtar kelime[ler]>

man aracı en sık seçeneksiz olarak kullanılır, sadece arama yapılacak ifade parametre olarak verilir. Örneğin ls komutunun yardım dokümanlarını görüntülemek için aşağıdaki gibi çalıştırılır:

[email protected]:~ $ 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

man aracı yardım dokümanlarını bir sayfalayıcı (pager) yardımıyla ekrana basar ve bu ekranda yön tuşları ile gezinilebilir. Ekranın alt kısmında görüntülenen yardım dokümanının adı ve bulunulan sayfayı gösteren bir şerit vardır. Ekranın en üstünde ise görüntülenen yardım dokümanının adı ve 1’den 9’a kadar olan sayılar ile de yardım dokümanının türü görüntülenir. ls komutu için bu 1’dir.

Sayfalayıcıdan çıkmak veya alt sayfalardan geri dönmek için klavyeden q tuşuna basılır. man aracının kullandığı yardım dokümanlarının disk konumunu görmek için manpath komutundan yararlanılabilir. Raspberry Pi OS yardım dokümanlarını /usr/share/man dizininde depolar.

[email protected]:~ $ manpath
/usr/local/man:/usr/local/share/man:/usr/share/man:/usr/man

Belli bir konuya ait tüm yardım dokümanlarının disk konumunu öğrenmek için man aracına aşağıdaki seçenekler verilebilir. –where (ya da –w) seçeneği yardım dokümanının disk konumunu, –all (ya da –a) ise ifadenin geçtiği tüm yardım dokümanlarını bulur.

[email protected]:~ $ man --where chmod
/usr/share/man/man1/chmod.1.gz
[email protected]:~ $ man --where –all chmod
/usr/share/man/man1/chmod.1.gz
/usr/share/man/man2/chmod.2.gz

Yardım dokümanları türlerine göre 9 kısma ayrılmıştır. Her kısımda farklı tür yardım dokümanları yer alır. Örneğin yukarıdaki örnekte man1 (1. kısım) dizininde chmod kabuk komutu hakkında bilgiler yer alırken, man2 (2. kısım)  dizininde sistem çağrısı (çekirdek alt programı) olan chmod hakkında bilgiler yer alır. Bir Linux sisteminde, yardım dokümanları aşağıdaki gibi sınıflandırılmıştır.

  1. Çalıştırılabilir programlar ve kabuk komutları
  2. Sistem çağrıları (Linux çekirdeği tarafından sağlanan alt programlar)
  3. Kütüphane alt programları
  4. Özel dosyalar (örn.:/dev dizinindeki aygıtlar)
  5. Dosya formatları
  6. Oyunlar
  7. Makro paketleri
  8. Sistem yönetim komutları
  9. Standart olmayan çekirdek alt programları

Belli bir türdeki yardım dokümanını görüntülemek için aranacak anahtar kelimeden önce tür kodu yazılabilir. Tür komutu belirtilmediğinde ön tanımlı olarak 8 kodlu sistem yönetim yardım belgeleri içinde araştırma yapılır. Aşağıdaki örnekte sistem çağrısı olan mount alt programının yardım dosyası görüntülenmektedir.

[email protected]:~ $ man 2 mount
MOUNT(2)                          Linux Programmer's Manual                         
NAME
       mount - mount filesystem

Sistemde bir anahtar kelimeye ait hangi tür belgelerin olduğu ve kısa bir açıklaması hakkında araştırma yapmak için –f parametresinden faydalanılabilir. –f parametresi whatis komutu ile aynı çıktıyı üretir. Aşağıdaki çıktıda lsmod ve printf anahtar kelimelerine ait 4 yardım belgesinin sistemde yüklü olduğu gözükmektedir:

[email protected]:~ $ man -f lsmod printf
lsmod (8)            - Show the status of modules in the Linux Kernel
printf (3)           - formatted output conversion
printf (3avr)        - (unknown subject)
printf (1)           - format and print data

Yukarıdaki çıktıya ait sistemde Arduino IDE’nin yüklüdür. Arduino IDE ile beraber gelen yardım belgeleri 3avr türü ile sisteme tanıtılmıştır. Bir Arduino kütüphane fonksiyonu olan prinf hakkında yardım görüntülemek için man komutu aşağıdaki gibi kullanılabilir. Normalde tür kodu belirttiğimiz ilgili seçeneğe 3avr yazarız.

[email protected]:~ $ man 3avr printf

-k seçeneği ile içerisinde anahtar kelime geçen belgeler araştırılır, -f ‘de olduğu gibi tam bir eşleşme gerçekleşmesi beklenmez. –I seçeneği ise büyük/küçük harf duyarlı aramalar yapar. Bu nedenle genellikle uzun bir çıktı üretir.

[email protected]:~ $ man -k passwd
chgpasswd (8)        - update group passwords in batch mode
chpasswd (8)         - update passwords in batch mode
fgetpwent_r (3)      - get passwd file entry reentrantly
getpwent_r (3)       - get passwd file entry reentrantly
gpasswd (1)          - administer /etc/group and /etc/gshadow

-d seçeneği araştırılan yardım belgeleri üzerinde bulunan sonuçlar için detaylı listeleme yapar. Aranan ifadenin hangi dokümanın hangi bölümünde yer aldığını görüntüler.

LINFO projesi

www.linfo.org adresinde yayın yapan LINFO projesi (Linux Information Project), man aracının sağladığından daha kapsamlı ve geniş bir çevrim içi yardım hizmeti sunar. Bu sitedeki yardım dokümanları Linux ve diğer ücretsiz araçlar hakkında karşılaştırmalı ve kapsamlı bir yardımı, her seviyeden kullanıcıya hitap edecek şekilde sağlamayı amaçlamıştır.

help (yardım) komutu ^

help komutu, bash kabuğunun dâhili komutlarından biridir ve diğer dâhili komutların görevleri ve seçenekleri hakkında kısa bilgiler görüntüler. Örneğin dâhili komutlardan biri olan pwd hakkında bilgi görüntülemek için aşağıdaki komut verilebilir:

[email protected]:~ $ help pwd
pwd: pwd [-LP]
    Print the name of the current working directory.
[...]

Hemen hemen çoğu harici komut ise, kendi dâhili yardım sayfalarına sahiptir. Bu sayfalar komut hakkında sadece kısa bir tanıtım ve kullanım seçenekleri hakkında bilgileri içerir. Bu sayfalara erişim için komut adını yazdıktan sonra –help veya –h seçenekleri parametre olarak verilebilir.

[email protected]:~ $ mount --help

apropos aracı ^

apropos komutu yardım belgeleri üzerinde araştırma yaparak aranan ifade hakkında kısa açıklama görüntüler. apropos özellikle tam adı bilinmeyen komutları araştırmak için faydalıdır. man aracının –k seçeneği ile aynı çıktıyı üretir.

[email protected]:~ $ apropos mount
dphys-swapfile (8)   - set up, mount/unmount, and delete an swap file
filesystem (7)       - event signalling that filesystems have been mounted
free (1)             - Display amount of free and used memory in the system
fstrim (8)           - discard unused blocks on a mounted filesystem
fusermount (1)       - unmount FUSE filesystems
gvfs-mount (1)       - Mounts the locations

whatis aracı ^

whatis aracı tam adı bilinen komut ya da ifadeler hakkında kısa açıklama görüntülemek için kullanılır. man aracının –f seçeneği ile aynı çıktıyı üretir.

[email protected]:~ $ man -f mount
mount (8)            - mount a filesystem
mount (2)            - mount filesystem

Yazar: Özgür Koca

Yazar - Tankado.com

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.