Linux Yöneticisi - Kabuk Komut Dosyası

Bash Kabuğuna Giriş

GNU Linux'un çeşitleri gibi, kabukların da birçok çeşidi vardır ve uyumlulukları farklılık gösterir. CentOS'taki varsayılan kabuk, Bash veya Bourne Again Shell olarak bilinir. Bash kabuğu, Stephen Bourne tarafından geliştirilen Bourne Shell'in modern, modifiye edilmiş bir versiyonudur. Bash, Ken Thompson ve Dennis Ritchie tarafından Bell Labs'ta geliştirilen Unix işletim sisteminde orijinal Thompson Shell'in doğrudan yerini aldı (Stephen Bourne ayrıca Bell Labs tarafından istihdam edildi)

Herkesin sevdiği bir kabuğu vardır ve her birinin kendine özgü güçleri ve zorlukları vardır. Ancak çoğunlukla, Bash tüm Linux dağıtımlarında varsayılan kabuk olacak ve en yaygın olarak bulunacak. Tecrübe ile herkes kendileri için en iyi olan kabuğu keşfetmek ve kullanmak isteyecektir. Ancak aynı zamanda herkes Bash kabuğunda ustalaşmak isteyecektir.

Diğer Linux kabukları şunları içerir: Tcsh, Csh, Ksh, Zsh ve Fish.

Herhangi bir Linux kabuğunu uzman düzeyinde kullanma becerilerini geliştirmek, bir CentOS yöneticisi için son derece önemlidir. Daha önce de bahsettiğimiz gibi, Windows'tan farklı olarak Linux özünde bir komut satırı işletim sistemidir. Kabuk, bir yöneticinin (veya kullanıcının) işletim sistemine komutlar vermesini sağlayan bir kullanıcı arabirimidir. Bir Linux sistem yöneticisi bir havayolları pilotuysa, kabuğu kullanmak, uçağı otomatik pilottan çıkarmaya ve daha manevra kabiliyeti olan uçuş için manuel kontrolleri almaya benzer.

Bash gibi bir Linux kabuğu, Bilgisayar Bilimi terimlerinde bir Command Line Interpreter. Microsoft Windows ayrıca DOS (orijinal DOS işletim sistemiyle karıştırılmamalıdır) ve PowerShell adında iki komut satırı yorumlayıcısına sahiptir.

Bash gibi çoğu modern mermi, constructsdaha karmaşık kabuk komut dosyalarının hem genel hem de karmaşık görevleri otomatikleştirmesine izin verir .

Yapılar şunları içerir -

  • Komut dosyası akış denetimi (ifthen ve else)
  • Mantıksal karşılaştırma işlemleri (eşitlikten büyük, küçüktür)
  • Loops
  • Variables
  • İşlemi tanımlayan parametreler (komutlu anahtarlara benzer)

Komut Dosyası Diline Karşı Kabuk Betiğini Kullanma

Yöneticiler genellikle bir görevi gerçekleştirmeyi düşünürken kendilerine şunu sorarlar: Bir kabuk betiği mi yoksa Perl, Ruby veya Python gibi bir betik dili mi kullanmalıyım?

Burada belirlenmiş bir kural yoktur. Komut dosyası yazma dilleri ile kabuklar arasında yalnızca tipik farklılıklar vardır.

Kabuk

Shell , Linux işletim sisteminde sed , grep , tee , cat ve diğer tüm komut satırı tabanlı yardımcı programlar gibi Linux komutlarının kullanımına izin verir . Aslında, hemen hemen her komut satırı Linux yardımcı programı kabuğunuzda komut dosyası olarak yazılabilir.

Bir kabuk kullanmanın harika bir örneği, DNS çözümlemesi için ana bilgisayarların listesini kontrol etmek için hızlı bir komut dosyası olabilir.

DNS adlarını kontrol etmek için basit Bash Komut Dosyamız -

#!/bin/bash 
for name in $(cat $1);
   do 
      host $name.$2 | grep "has address" 
   done 
exit

DNS çözümlemesini test etmek için küçük kelime listesi -

dns 
www 
test 
dev 
mail 
rdp 
remote

Google.com alanına karşı çıktı -

[rdc@centos ~]$  ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote

[rdc@centos ~]$

Kabuğumuzdaki basit Linux komutlarından yararlanarak, bir kelime listesinden DNS adlarını denetlemek için 5 satırlık basit bir komut dosyası oluşturabildik. Bu, güzel bir şekilde uygulanmış bir DNS Kitaplığı kullanırken bile Perl, Python veya Ruby'de biraz zaman alırdı.

Komut Dosyası Dili

Bir komut dosyası dili, kabuğun dışında daha fazla kontrol sağlayacaktır. Yukarıdaki Bash betiği, Linux ana bilgisayar komutu etrafında bir sarmalayıcı kullandı . Ya daha fazlasını yapmak ve kabuğun dışında etkileşim kurmak için host gibi kendi uygulamamızı yapmak istersek ? Bu, bir betik dili kullanacağımız yerdir.

Ayrıca, yüksek düzeyde korunan bir betik diliyle, eylemlerimizin çoğunlukla farklı sistemlerde çalışacağını biliyoruz. Örneğin Python 3.5, aynı kitaplıkların kurulu olduğu Python 3.5 çalıştıran diğer tüm sistemlerde çalışacaktır. BASH komut dizimizi hem Linux hem de HP-UX üzerinde çalıştırmak istiyorsak öyle değil.

Bazen bir komut dosyası dili ile güçlü bir kabuk arasındaki çizgiler bulanıklaşabilir. CentOS Linux yönetim görevlerini Python, Perl veya Ruby ile otomatikleştirmek mümkündür. Bunu yapmak gerçekten oldukça sıradan. Ayrıca, zengin kabuk komut dosyası geliştiricileri Bash'de basit, ancak başka türlü işlevsel bir web sunucusu arka plan programı yaptılar.

Komut dosyası oluşturma dilleri ve kabuklardaki görevleri otomatikleştirme deneyimiyle, bir CentOS yöneticisi, bir sorunu çözme ihtiyacı duyduğunda nereden başlayacağını hızlıca belirleyebilecektir. Bir projeye kabuk betiği ile başlamak oldukça yaygındır. Ardından, bir proje daha karmaşık hale geldikçe bir betik (veya derlenmiş) diline geçin.

Ayrıca, bir projenin farklı bölümleri için hem bir betik dili hem de kabuk betiği kullanmakta sorun yoktur. Bir örnek, bir web sitesini kazımak için bir Perl betiği olabilir. Daha sonra sed , awk ve egrep ile ayrıştırmak ve biçimlendirmek için bir kabuk komut dosyası kullanın . Son olarak, bir web GUI kullanarak formatlanmış verileri MySQL veritabanına eklemek için bir PHP betiği kullanın.

Kabukların arkasındaki bazı teorilerle, CentOS'taki bir Bash kabuğundan görevleri otomatikleştirmek için temel yapı taşlarıyla başlayalım.

Giriş Çıkışı ve Yeniden Yönlendirme

Standart çıktı başka bir komuta işleniyor -

[rdc@centos ~]$ cat ~/output.txt | wc -l 
6039 
[rdc@centos ~]$

Yukarıda, biz geçti cat'sstoud için wc ile işlenmesi için boru karakteri. WC sonra çıktı işlenmiş kedi terminali output.txt hat sayısı baskı. Dikey çizgi karakterini, bir komuttan sonraki komut tarafından işlenecek olan bir "boru" çıkışı olarak düşünün .

Komut yeniden yönlendirme ile uğraşırken hatırlanması gereken temel kavramlar aşağıdadır -

Numara Dosya tanımlayıcı Karakter
0 standart girdi <
1 standart çıktı >
2 standart hata
standart çıktı ekle >>
yeniden yönlendirme ata &
standart boruyu stdin'e |

Bunu birinci bölümde gerçekten yeniden yönlendirme veya yeniden yönlendirme atamasından bahsetmeden tanıtmıştık. Linux'ta bir terminal açarken, kabuğunuz aşağıdakiler için varsayılan hedef olarak görülür -

  • standart giriş <0
  • standart çıktı> 1
  • standart hata 2

Bunun nasıl çalıştığını görelim -

[rdc@centos ~]$ lsof -ap $BASHPID -d 0,1,2 
 COMMAND   PID   USER    **FD**   TYPE DEVICE   SIZE/OFF   NODE      NAME 
 bash    13684    rdc    **0u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **1u**   CHR  136,0      0t0     3      /dev/pts/0 
 bash    13684    rdc    **2u**   CHR  136,0      0t0     3      /dev/pts/0
 
[rdc@centos ~]$

/ dev / pts / 0 bizim sözde terminalimizdir. CentOS Linux buna bakar ve açık terminal uygulamamızı, klavye ve ekran bir seri arabirim üzerinden takılı gerçek bir terminal gibi düşünür. Bununla birlikte, bir hiper yönetici gibi donanımı bir işletim sistemine özetler / dev / pts , terminalimizi uygulamalara özetler.

Yukarıdaki lsof komutunun altında görebiliriz.FDüç dosya tanımlayıcısının da sanal terminalimize (0,1,2) ayarlandığı sütun. Artık komutlar gönderebilir, komut çıktısını ve komutla ilgili tüm hataları görebiliriz.

Aşağıda STDIN ve STDOUT örnekleri verilmiştir -

STDOUT

[root@centosLocal centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT. 
[root@centosLocal centos]#

Hem göndermek de mümkündür stdout'u ve stderr'yi ayrı dosyalara -

bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt 
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#

Tüm dosya sistemi aranırken iki hatayla karşılaşıldı. Her biri daha sonra incelenmek üzere ayrı bir dosyaya gönderilirken, döndürülen sonuçlar ayrı bir metin dosyasına yerleştirildi.

Stderr'i bir metin dosyasına göndermek , uygulama derleme gibi terminale çok fazla veri çıkaran şeyler yaparken faydalı olabilir. Bu, terminal geri kaydırma geçmişinden kaybolabilecek hataların incelenmesine izin verecektir.

STDOUT'u bir metin dosyasına aktarırken dikkat edilecek bir not, >> ve >. Çift ">>" bir dosyaya eklenirken, tekil biçim dosyayı bozar ve yeni içerikler yazar (böylece önceki tüm veriler kaybolur).

STDIN

[root@centosLocal centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.

[root@centosLocal centos]#

Yukarıdaki komutta, metin dosyası stdin.txt yönlendirildi kedi için içeriğini yankılandı komuta STDOUT .

Dikey çizgi karakteri "|"

Dikey çizgi karakteri, çıktıyı ilk komuttan alacak ve bir sonraki komuta girdi olarak geçirecek ve ikincil komutun çıktı üzerinde işlemler gerçekleştirmesine izin verecektir.

Şimdi, kedinin standart çıkışını başka bir komuta "aktaralım" -

[root@centosLocal centos]# cat output.txt | wc -l
2
[root@centosLocal centos]#

Yukarıda, wc çıktısında hesaplamalar gerçekleştirir kedi borusundan geçirildi. Boru komutu, çıktıyı grep veya egrep'ten filtrelerken özellikle yararlıdır -

[root@centosLocal centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l  
9000 
[root@centosLocal centos]#

Yukarıdaki komutta, bir egrep filtresinden geçen 65535'ten tüm sayıları içeren bir metin dosyasından her 4 basamaklı sayıyı wc'ye geçirdik .

Çıktı & ile Yönlendirme

Çıktı, kullanılarak yeniden yönlendirilebilir &karakter. Çıktıyı hem STDOUT hem de STDERR'yi aynı dosyaya yönlendirmek istiyorsak, aşağıdaki gibi gerçekleştirilebilir -

[root@centosLocal centos]# find / -name passwd > out.txt 2>&1
[root@centosLocal centos]# cat out.txt  
find: /dev/fd/3: Not a directory 
find: /dev/fd/4: Not a directory 
/etc/passwd

[root@centosLocal centos]#

Kullanarak yeniden yönlendirme &karakter şu şekilde çalışır: ilk olarak, çıktı out.txt dosyasına yeniden yönlendirilir . İkinci olarak, STDERR veya dosya tanımlayıcısı 2, STDOUT ile aynı konuma, bu durumda out.txt'ye yeniden atanır .

Yeniden yönlendirme son derece kullanışlıdır ve büyük metin dosyalarını işlerken, kaynak kodunu derlerken, çıktıyı kabuk komut dosyalarında yeniden yönlendirirken ve karmaşık Linux komutları verirken artan sorunları çözerken kullanışlıdır.

Güçlü olsa da, yeniden yönlendirme yeni CentOS Yöneticileri için karmaşık bir hal alabilir. Bir Linux forumuna (Stack Overflow Linux gibi) alıştırma, araştırma ve ara sıra sorulan sorular, gelişmiş çözümlerin çözülmesine yardımcı olacaktır.

Bash Kabuk Yapıları

Artık Bash kabuğunun nasıl çalıştığına dair iyi bir fikrimiz olduğuna göre , komut dosyaları yazmak için yaygın olarak kullanılan bazı temel yapıları öğrenelim. Bu bölümde keşfedeceğiz -

  • Variables
  • Loops
  • Conditionals
  • Döngü kontrolü
  • Dosyalara okuma ve yazma
  • Temel matematik işlemleri

BASH Sorun Giderme İpuçları

BASH, özel bir betik diline kıyasla biraz zor olabilir. BASH komut dosyalarındaki en büyük takılmalardan bazıları, kabuğa aktarılmakta olan komut dosyası işlemlerinden yanlış şekilde kaçmamak veya kaçmamaktır. Bir senaryoya birkaç kez baktıysanız ve beklendiği gibi çalışmıyorsa, endişelenmeyin. Bu, günlük olarak karmaşık komut dosyaları oluşturmak için BASH kullananlarda bile yaygındır.

Hızlı bir Google araması veya bir soru sormak için uzman bir Linux forumuna kaydolmak, hızlı bir çözüme yol açacaktır. Birisinin tam olarak sorunla karşılaşmış ve çoktan çözülmüş olma ihtimali çok yüksektir.

BASH komut dosyası, yönetim görevlerini otomatikleştirmekten kullanışlı araçlar oluşturmaya kadar her şey için hızlıca güçlü komut dosyaları oluşturmanın harika bir yöntemidir. Uzman düzeyinde bir BASH komut dosyası geliştiricisi olmak zaman ve pratik gerektirir. Bu nedenle, mümkün olduğunda BASH komut dosyalarını kullanın, CentOS Administration araç kutunuzda bulunması harika bir araçtır.