Linux’ta bir kullanıcı oluşturulduğunda, o kullanıcıya bir kabuk tanımlanır. Sistem yöneticisi, kullanıcı için varsayılan bir kabuk belirlemiş de olabilir. Kullanıcı daha sonra, kendisine tanımlanmış ön tanımlı kabuğunu geçersiz kılarak başka bir kabuk çalıştırmayı seçebilir.
Hatırlatma: Kabuk, kullanıcı ile işletim sistemi çekirdeği arasında iletişim kuran, metin olarak verilen komutları yorumlayan yardımcı bir programdır. Dosya işlemleri(yazma, okuma, silme, listeleme vb.), sistemde çalışan işlem parçalarını listeleme veya müdahale etme gibi işlerin kontrolünün ve takibinin yapılmasını sağlar. Buna benzer ön tanımlı işlemlerin komutlarını sağladığı gibi, sonradan sisteme dahil edilmiş programların gereksinim duyduğu komutları da sistem çekirdeğine gönderir.
Not: Linux ortamında çalışan bash, csh, sh, ksh, tcsh, zsh, fish gibi bir çok kabuk programı var. Bunların içinde en popüler olanı bash kabuğudur ve çoğu dağıtımda ön tanımlı olarak gelir. Sisteminize birden fazla kabuk kurabilir ve bunların ön tanımlı olarak çalışma durumunu değiştirebilirsiniz.
Kullanıcı, kabuğu değiştirmeden önce mevcut kabuğun ne olduğunu ve değiştirmek istediği kabuğun sistemde yüklü olup olmadığını öğrenmek isteyebilir. Bu işlemler için mevcut kabuğu öğrenme başlığını, kabuk değiştirme konusu için de ön tanımlı kabuğu değiştirme başlığını okuyabilirsiniz.
MEVCUT KABUĞU ÖĞRENME
Linux sistemlerde sıkça kullanılan bazı değerler, sistem değişkeni olarak adlandırılan yapılarda barındırılır. Ön tanımlı bir çok değer, sistem açılışında bu değişkenlere aktarılır ve sistemin çalıştığı süre içinde buraya başvuran herhangi bir işlem tarafından kullanılabilir. İhtiyacınız olan bilginin tutulduğu sistem değişkeninin içeriğini ekrana yazdırarak, sisteminizdeki ön tanımlı değerini görüntüleyebilirsiniz. Değişkenleri ekrana yazdırmak için echo
komutunu kullanabilirsiniz.
$SHELL
Sistem Değişkeni
Sisteminizde ön tanımlı olarak belirlenmiş kabuğun çalıştırılabilir dosya yolunu, $SHELL
sistem değişkenine bakarak öğrenebilirsiniz.
$ echo $SHELL
/bin/bash
Yukarıdaki örnekte, sistemde ön tanımlı olarak ayarlanmış olan Bash kabuğuna ait çalıştırılabilir dosyasının, kök dizinde bulunan /bin
dizini içinde olduğu görülmektedir.
$0
Bağımsız Değişkeni
Ön tanımlı kabuk değiştirildiğinde bir sonraki sistem açılışında aktif olur. Eğer ön tanımlı kabuğu değiştirdiyseniz ve sistemi henüz yeniden başlatmadıysanız, $SHELL
değişkeni size yeni belirlediğiniz değeri döndürecektir. Ancak o anda hala geçerli kabuk değişimden önceki kabuktur. Bu bilgiye ulaşmak için de $0
değişkenine bakabilirsiniz. $0
değişkeni, çalışan kabuk veya kabuk betiğinin çağrıldığı komutu taşır. Dolayısıyla bir kabuk çalışırken bu değişken, çalışan kabuğun çağrıldığı komutu taşıyacaktır. Bu komut da genelde, kabuğun adı olmaktadır.
$ echo $0
fish
/etc/shells
Dosyası
Diyelim ki sisteminizde ön tanımlı kabuk olarak csh var ve siz bunu bash ile değiştirmek istiyorsunuz. Değiştirme işleminden önce bash kabuğunu sisteminize yüklemiş olmanız gerekiyor. Ön tanımlı kabuğu değiştirmeden önce, gerekli kabuğa sahip olduğunuzdan emin olmanız gerekir.
Kabuklar genellikle /bin
dizini altına yüklenir. Ancak farklı Linux dağıtımlarında bu durum değişebilir. Bazı dağıtımlarda /usr/bin
veya /usr/local/bin
gibi farklı konumlara da yüklenmiş olabilir. Bu nedenle ön tanımlı yapacağınız kabuğun kurulu olduğu dizini de öğrenmeniz gerekli.
Sisteminizde hangi kabukların yüklü olduğu bilgisi, /etc
dizini altındaki shells
dosyasında tutulur. Bu dosyanın içeriğini, cat
komutunu kullanarak ekrana yazdırabilirsiniz. cat /etc/shells
komutunu girdiğinizde, sisteminizde mevcut tüm kabuklar listelenecektir. Liste içinde, ön tanımlı olmasını istediğiniz kabuğun çalıştırılabilir dosya yolunu görüyorsanız sisteminizde yüklü demektir. Eğer görünmüyorsa gerekli kabuğu sisteminize yüklemeniz gerekiyor.
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen
/usr/bin/fish
whereis
Komutu
Tanımlamak istediğimiz kabuğun dizin yolu /etc/shells
dosyasında kayıtlı olmasına rağmen, sistemimizden kaldırılmış olabilir. İşaret edilen dizinde yüklü olduğundan emin olmak için, whereis
komutunu kullanabilirsiniz. Bu komut belirtilen bir programın çalıştırılabilir dosyasının, kaynak ve manual dosyalarının bulunduğu konumları görüntüler.
$ whereis bash
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
İlk sırada görülen /bin/bash
, bash kabuğunun çalıştırılabilir dosyasının dosya yolunu gösteriyor. Bu bilgiye ihtiyacımız olacak çünkü ön tanımlı kabuk bilgisini girerken kabuğun tam yolunu girmemiz gerekecek. Bu yolu bir yere not edelim.
ÖN TANIMLI KABUĞU DEĞİŞTİRME
Yeni kabuğun yerini belirledikten sonra, root veya süper kullanıcı şifresine sahip olduğunuz sürece herhangi bir kullanıcı için ön tanımlı kabuğu değiştirebilirsiniz.
Kullanıcıların ön tanımlı kabuk bilgileri /etc/passwd
dosyasında tutulur. Burada bulunan bilgiyi el yordamıyla değiştirebileceğiniz gibi, usermod
veya chsh
komutlarını kullanarak da bu işlemi yapabilirsiniz.
1. ‘chsh’ Komutunu Kullanarak Değiştirme
chsh
herhangi bir kullanıcının giriş kabuğunu veya varsayılan komut kabuğunu değiştirir. -s
veya -shell
parametreleri ile kullanarak, kullanıcı adını belirterek ve yukarıdaki mevcut kabuğu öğrenme başlığında anlatıldığı şekilde elde edilen, kabuğun çalıştırılabilir dosya yolunu girerek kullanıcının ön tanımlı kabuğunu değiştirebilirsiniz. Her kullanıcı kendi şifresiyle, kendi giriş kabuğunu bu komut ile değiştirebilir. Yönetici haklarına sahipseniz, root da dahil olmak üzere diğer bütün kullanıcıların ön tanımlı kabuklarını değiştirebilirsiniz. Kullanıcı adımızın firat
olduğunu ve ön tanımlı kabuğu bash
olarak değiştirmek istediğimizi düşünelim. Bu durumda komutu aşağıdaki gibi kullanabiliriz.
chsh -s /bin/bash firat
Not: Komutu çalıştırdıktan sonra $ grep 'firat' /etc/passwd
komutu ile, kullanıcının kabuk programı değişikliğini gözlemleyebilirsiniz. Yaptığınız değişikliğin etkinleşmesi için, kullanıcı oturumunu yenilemeniz gerekiyor.
2. ‘usermod’ Komutu ile Değiştirme
usermod
, kullanıcı hesaplarını değiştirmek için kullanılan bir komuttur. -s
veya -shell
seçenekleri ile kullanarak ve kullanıcı adını belirterek, kullanıcının ön tanımlı kabuğunu değiştirebilirsiniz. usermod
komutunu kullanabilmek için süper kullanıcı olmanız veya yönetici haklarına sahip olmanız gerekir. Eğer süper kullanıcı değilseniz komutu sudo
komutu ile beraber kullanın. firat
kullanıcısının ön tanımlı kabuğunu bash olarak belirlemek istiyorsak, komutu aşağıdaki gibi kullanabiliriz.
sudo usermod -s /bin/bash firat
Not: Komutu çalıştırdıktan sonra $ grep 'firat' /etc/passwd
komutu ile, kullanıcının kabuk programı değişikliğini gözlemleyebilirsiniz. Yaptığınız değişikliğin etkinleşmesi için, kullanıcı oturumunu yenilemeniz gerekiyor.
3. ‘/etc/passwd’ Dosyasını Elle Düzenleme
Dikkat: /etc/passwd
dosyası yönetici haklarıyla düzenlenir. Bu işlem yukarıdaki komutları kullanmaktan daha risklidir. Yönetici hakları ile bu dosya düzenlenirken sadece mevcut kullanıcının değil, root
da dahil diğer tüm kullanıcıların kimlik bilgileri değiştirilebilir. Kontrolsüz bir müdahale, problemlere yol açabilir.
Dosyanın içeriğini görmek için cat
komutunu kullanabilirsiniz.
firat@q4os-desktop:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
messagebus:x:105:108::/var/run/dbus:/bin/false
pulse:x:106:111:PulseAudio daemon,,,:/var/run/pulse:/bin/false
firat:x:1000:1000:Firat S.,,,:/home/firat:/usr/bin/fish
usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/bin/false
Görüldüğü gibi, firat kullanıcısının bulunduğu satırda en son sırada ön tanımlı kabuk uygulamasının dosya yolu bulunuyor. Herhangi bir metin editörüyle bu dosyayı açarak, kullanıcının bulunduğu satırdaki kabuk bilgisini değiştirdiğinizde ve sistemi yeniden başlattığınızda ön tanımlı kabuğu değiştirmiş olursunuz. /etc/passwd
dosyası her kullanıcı tarafından görüntülenebilir ancak düzenlemek için yönetici hakları gerektirir. Bu nedenle dosyayı yönetici hakları ile açmanız gerekiyor. Bu işlemi sudo
komutu ile yapabilirsiniz.
sudo gedit /etc/passwd
Bu komut ile passwd
dosyası yönetici haklarıyla açılır ve bütün içeriğinin değiştirilip kaydedilmesine izin verilir. Kullanıcı adınızın bulunduğu satırın en sonunda yer alan kabuk dizin yolunu değiştirmeniz gerekiyor. Tabi değiştirmek istediğiniz kabuğun yüklü olduğu dizini de biliyor olmalısınız. Bu bilgiyi, mevcut kabuğu öğrenme başlığı altında anlatılan cat /etc/shells
ve whereis <kabukadı>
komutları sayesinde öğrenebilirsiniz.
Diyelim ki firat
kullanıcısının giriş kabuğunu bash olarak değiştireceğiz. Yukarıda firat
kullanıcısının yazılı olduğu satırın sonunda yer alan kabuk dosya yolunu, aşağıdaki gibi değiştirmemiz gerekiyor.
firat:x:1000:1000:Firat S.,,,:/home/firat:/bin/bash
Ve dosyayı kaydediyoruz.
Not: Yaptığınız değişikliğin etkinleşmesi için, kullanıcı oturumunu yenilemeniz gerekiyor.
4. Yönetici Haklarınız Yoksa, Süper Kullanıcı Değilseniz ve Kök Erişiminiz Yoksa
Bu durumda, /etc/passwd
dosyasına ulaşamaz ve değiştiremezsiniz. Sadece mevcut kabuğu yürütme seçeneğiniz vardır. Ancak komut satırına kabuk adını yazıp çalıştırarak, istediğiniz kabuğa geçiş yapabilirsiniz. Aşağıda bash kabuğu kullanan bir kullanıcı, sistemde yüklü olan fish kabuğunu kullanmak için fish
komutunu veriyor. Fish kabuğu komutla birlikte karşılama mesajını vererek çalışmaya başlıyor ve sonraki satırda bizden komut bekliyor. Artık bu dakikadan sonra verilen komutlar, fish kabuğu tarafından işlenecek.
firat@ubuntu-f:~$ fish
Welcome to fish, the friendly interactive shell
firat@ubuntu-f ~>
Aynı komut satırında exit
komutunu verdiğinizde ise, fish kabuğundan çıkarak tekrar eski kabuğa (bash) dönebilirsiniz.
firat@ubuntu-f ~> exit
firat@ubuntu-f:~$
İkinci ve biraz daha kalıcı bir yöntem olarak, kabuğun başlatma dosyalarına gerekli komutları ekleyerek, mevcut varsayılan kabuk başlatıldığında diğer kabuğun çalışması sağlanabilir. Ancak bu işlem ön tanımlı kabuğu değiştirmez, sadece kabuğu kullanmanızı sağlar.
İlk olarak mevcut kabuğu öğrenme başlığında anlatıldığı gibi, kullanmak istediğiniz kabuğun dosya yolunu bulmanız gerekiyor. Daha sonra da mevcut kabuğunuzun yapılandırma dosyalarını bulun.
Yapılandırma dosyaları hakkında: Linux’ta çalışan bir kabuk, “çalışma şekline” göre farklı kategorilere ayrılır. Her şekilde de çalışan program aynı olmasına rağmen, çalışma şekli bakımından bir kategoriye dahil olur.
- Giriş kabuğu (login shell)
- Giriş kabuğu olmayan kabuk (no login shell)
Ayrıca kullanıcı ile etkileşimi yönünden de iki kategoriye ayrılır.
- Etkileşimli kabuk (interactive shell)
- Etkileşimsiz kabuk (non-interactive shell)
Kabuk programları başlatıldığında, dahil olduğu kategorilere göre yürüttüğü bazı yapılandırma dosyaları vardır. (Aşağıdaki bilgiler bash kabuğu için geçerlidir. Diğer kabukların kullandığı yapılandırma dosyalarını, bu sayfada bulunan ‘Configuration files’ başlığı altındaki tablodan inceleyebilirsiniz.)
Giriş kabuğu (Login shell):
-
Etkileşimli veya etkileşimsiz olarak bir bash kabuğu çağırmak için
--login
seçeneği kullanılır. Böylesi durumlarda bash, sırasıyla bazı komut dosyalarını okunur. ilk olarak genel ayarlar için/etc/profile
dosyası mevcutsa, bu dosyadaki komutları okuyarak yürütür. Daha sonra kullanıcıya özel ayarlar için sırasıyla,~/.bash_profile
,~/.bash_login
,~/.profile
dosyalarını arar ve bulduğu ilk sıradaki dosyanın komutlarını okuyarak yürütür. Bu dosyalar,~/bashrc
dosyasını dahili olarak çağırdığı için herhangi birinin okunması durumunda~/bashrc
dosyası da okunmuş olur.--noprofile
seçeneği kullanılarak, başlangıçtaki bu davranış etkisiz hale getirilebilir. Giriş kabuğundan çıkılması durumunda, eğer mevcutsa~/.bash_logout
dosyasını okur ve içindeki komutları yürütür.
Giriş kabuğu olmayan kabuk (No login shell):
-
Etkileşimli olarak başlatıldığında,
~/.bashrc
dosyası mevcutsa içindeki komutları okur ve yürütür. (–norc seçeneği kullanılarak bu davranış etkisiz duruma getirilebilir). Eğer farklı bir dosyanın yürütülmesi isteniyorsa,--rcfile <dosyaismi>
seçeneği ile~/.bashrc
dosyası yerine farklı bir dosyanın okunması ve komutlarının çalıştırılması sağlanabilir. -
Etkileşimsiz olarak başlatıldığında,
$BASH_ENV
değişkenini arar. Değişken mevcut ise, taşıdığı değeri bir dosya adı olarak arar. Eğer dosya adı mevcutsa içindeki komutları okur ve yürütür.
Yapılandırma dosyaları içinden rc dosyalarını kullanmanız daha yerinde olacaktır. Çünkü yapılandırma dosyaları etkileşimli, etkileşimsiz ve giriş olan, giriş olmayan kabuklar tarafından okunur. Hedef kabuk programınıza bağlı olarak, bash kabuğu kullanacaksanız ~/.bashrc
dosyasını, csh kabuğunu kullanacaksanız ~/.cshrc
dosyasını kullanmanız gerekir. Diğer kabukların kullandığı yapılandırma dosyalarını, bu tablodan inceleyebilirsiniz.
Diyelim ki mevcut kabuğunuz bash ve siz fish kabuğunu başlatmak istiyorsunuz. O halde ~/.bashrc
dosyasını açarak aşağıdaki komutları eklemeniz gerekiyor.
SHELL=/usr/bin/fish
exec /bin/bash --login
Eğer mevcut kabuğunuz csh ve siz bash kabuğunu başlatmak istiyorsunuz. Bu durumda da ~/.cshrc
dosyasını açarak aşağıdaki kodları eklemeniz gerekecekti.
setenv SHELL /bin/bash
exec /bin/bash --login
Genellikle çoğu kabuk ~/.login
veya ~/.profile
dosyalarını okuduğu için, bu dosyaları da kullanabilirsiniz. Ancak içine ekleyeceğiniz komutlar, ön tanımlı kabuğunuzun anladığı dilde olmalı. Ayrıca yeni yürütülecek kabuk da, başlatıldığında kendi yapılandırma dosyalarını okuyacağı için, artık bu dosyaları da kişiselleştirmeniz ve yapılandırmanız gerekmektedir.
Düzenlediğiniz yapılandırma dosyalarını etkinleştirmek için tekrar yorumlamanız gerekir. Bu işlemi source
komutuyla yapabilirsiniz.
source ~/.bashrc
Bilgi: Bir komut dosyası çalıştırıldığında, bir alt kabukta çalışır. İşlem tamamlandığında alt kabuk kapanır ve denetim orijinal kabuğa geri döner. Komut dosyasında ayarlanan herhangi bir şey alt kabuk için geçerli olacağından, kabuk kapatıldığında bu ayarlar kaybolur. Komut dosyasını bir alt kabukta değil de geçerli kabukta çalıştırmak için source
komutu kullanılır. Bu komutla çalışırılan komut dosyasında yapılan ayarlar, geçerli kabuk için geçerli olacaktır.
Not: Yapılandırma dosyalarında yaptığınız değişikliklerde varsayılan ayarlara dönmek isterseniz, genellikle /etc/skeleton
, /etc/skel/
ya da /etc/default
dizinleri altında bulunan aynı isimdeki dosyaları kullanabilirsiniz. Bu dosyalar, giriş sırasında ayarlanan standart ortam değişkenlerini tanımlayan betiklerdir. Bu dosyaları, içeriği değiştirilmiş dosyalarla yer değiştirdiğinizde sisteminiz ilk kurulumundaki tanımlara sahip olacaktır.
Kaynaklar:
http://www.belgeler.org/bashref/bashref_startup.files.html
https://tr.opensuse.org/Bash
http://yapbenzet.kocaeli.edu.tr/wp-content/uploads/LINUX_AG_YONETIMI_HAFTA_8.pdf
http://www.belgeler.org/bashref/bashref_interactive.shells.html