Linux Terminal İçin Yardımcı 11 Komut ve Kullanım Senaryoları

Utku Kamacı
Kod Gemisi
Published in
6 min readDec 21, 2018

1. curl

curl komutunu kullanarak uygulamanın endpointini veya upstream service endpoint’e olan bağlantısını kontrol edebiliriz. curl komutunu kullanarak başka bir servise erişimin sağlanıp sağlanmadığı kontrolünü gerçekleştirebilir veya servisin sağlık statüsünün kontrolünü yapabiliriz.

Örneğin komutu kullanarak uygulamamızın MongoDB’ye erişemediğini 500 HTTP hata kodunu vermesiyle kontrol edebiliriz.

$ curl -I -s myapplication:5000HTTP/1.0 500 INTERNAL SERVER ERROR

-I opsiyonu curl sonucunun header kısmını gösterirken -s opsiyonu da sonucun body kısmını susturur. Local bilgisayarımızda veritabanının endpointini aşağıdaki gibi kontrol edebiliriz:

$ curl -I -s database:27017HTTP/1.0 200 OK

Problemin çözümü için uygulamamızın veritabanı dışında uygulama hostundan başka noktalara ulaşıp ulaşamadığını kontrol edebiliriz.

$ curl -I -s https://kodgemisi.comHTTP/1.1 200 OK

Yukarıdaki sonuca göre uygulamamız diğer noktalara erişim sağlayabiliyor. Aşağıdaki gibi uygulama hostundan veritabanına erişmeyi deniyoruz:

$ curl database:27017curl: (6) Couldn't resolve host 'database'

Yukarıdaki gibi bir sonuç aldığımızda uygulamamız veritabanına ulaşamıyor. Bunun sebebi; veritabanı URL kullanım dışı/mevcut değil veya host(Container yada Sanal Makine) hostname olarak çözümleyebileceği bir nameserver’a sahip olmamasıdır.

2. python -m json.tool / jq

curl komutu çalıştırıldığında API çağrısı sonucunu okumak zor olabilir. Pretty-print formatında istenilen sonucun bulunması gerektiği durumlarda pyhon kurulumuyla beraber hazır gelen json kütüphanesi aracılığıyla bu sorunu kolaylıkla çözebiliriz.

$ cat test.json{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]}

Python kütüphanesini kullanabilmek için çıktıyı -m (module) opsiyonu ile | (pipe) içinde yazmamız yeterlidir. Örneğin;

$ cat test.json | python -m json.tool{"properties": {"age": {"description": "Age in years","minimum": 0,"type": "integer"},"firstName": {"type": "string"},"lastName": {"type": "string"}},"required": ["firstName","lastName"],"title": "Person","type": "object"}

Daha detaylı json parse işlemleri için jq paketini sunucuya kurarak pipe içinde bu komutu da çalıştırabiliriz.

$ cat test.json | jq{"title": "Person","type": "object","properties": {"firstName": {"type": "string"},"lastName": {"type": "string"},"age": {"description": "Age in years","type": "integer","minimum": 0}},"required": ["firstName","lastName"]}

3. env

env komutu ile environment değişkenleri tanımlayabilir veya var olanları listeleyebiliriz. Environment değişkenlerini kontrol ederek çalışma esnasında hata alan uygulamaları kontrol edebiliriz. Aşağıdaki örnekte uygulamanın hostunda tanımlanmış environment değişkenlerini listelemekteyiz. Uygulama Python3 kullanmaktadır ve MongoDB veritabanına bağlanması için environment değişkenleri tanımlanmıştır.

$ envPYTHON_PIP_VERSION=9.0.1HOME=/rootDB_NAME=testPATH=/usr/local/bin:/usr/local/sbinLANG=C.UTF-8PYTHON_VERSION=3.4.6PWD=/DB_URI=mongodb://database:27017/test

4. netstat

netstat komutu ağ statüsünü gösterir. Bununla kullanılan ağ portlarını ve bu portlara gelen bağlantıları listeleyebiliriz. netstat komutunu kullanabilmek için net-tools paketinin kurulu olması gerekmektedir. Aşağıdaki örnekteki gibi netstat komutunu protocol, process ve port opsiyonları(-tulpn) ile kullandığımızda Apache HTTP sunucusunun 80 portunu kullandığını görmekteyiz:

Aşağıdaki sunucuda ise docker container’ı — docker-proxy 8080 portunu kullanmaktadır:

Aşağıdaki komut gibi parametreleri birleştirip script yazılarak daha kapsamlı sonuçlar elde edilebilir:

netstat -an | grep ESTABLISHED | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | awk ‘{ printf(“%s\t%s\t”,$2,$1) ; for (i = 0; i < $1; i++) {printf(“*”)}; print “” }’

Yukarıda yazılmış olan komut her host için bağlantıları ascii yazı grafiği ile listelemeye yarar.

Örnek çıktı:

64.74.153.141	3	***
192.168.10.10 5 *****

5. lsof

lsof komutu uygulama ile bağdaştırılmış açık dosyaları listeler. Bazı Linux dağıtımlarında lsof kurulu gelmediği için elle kurmak gerekebilir. Linux, genellikle sistem ile yapılan her etkileşim bir dosyaymış gibi davranır. Sonuç olarak uygulama bir dosyaya yazdığında veya bir ağ bağlantısı açtığında lsof bu etkileşime dosya gibi davranır. netstat, komutunda kullandığımız gibi lsof komutunu portları listelemek için kullanbiliriz. Örneğin; lsof komutunu httpd process ID’sini(/usr/sbin/httpd) öğrenmek için kullanabiliriz.

lsof ayrıca httpd’nin çalışması için gerekli bütün dosyaları da listeler. Açık dosyalar listesinde açık dosya ismi ile process’in kaynağını (origin) görebiliriz. Bu örnekte Apache gösterilmektedir.

6. dig / nslookup

Domain name server (DNS) uygulama sunucularında URL adresinin çözümlenmesine yardımcı olur. URL’in çözümlenmediği durumlarla karşılaşabilir. Sonuç olarak uygulama için bağlantı sorunlarına yol açacaktır. “cannot resolve” hatası alındığında hata detaylarını öğrenmek ve çözümlemek için dig (DNS lookup utility) or nslookup (query Internet name servers) komutlarını kullanabiliriz. Komutları kullanabilmek için BIND Utilities paketinin kurulu olması gerekmektedir. Örnekolarak mydatabase için bu komutları kullanacağız.

$ nslookup mydatabaseServer:   10.0.2.3Address:  10.0.2.3#53** server can't find mydatabase: NXDOMAIN

nslookup komutu mydatabase’in çözümlenemediğini göstermektedir. dig komutu da aynı sonucu vermektedir.

$ dig mydatabase; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> mydatabase;; global options: +cmd;; connection timed out; no servers could be reached

Bu hatanın birçok sebebi olabilir. Çözümlenmesi için Sistem Yöneticisi ile iletişme geçilmesi gerekmektedir. Local test için bu sorun hostun nameserver tanımlarının doğru yapılmadığından kaynaklanabilir.

7. iptables

iptables ile Linux host için ağ firewall’ı gibi trafiği bloklayabilir veya izin verebiliriz. Bu araç ile belirli uygulamaların istekleri alması veya iletmesi engellenebilir. Açıklamak gerekirse; eğer uygulamamız başka bir enpointe erişemiyorsa iptables bu endpointe trafiği engellemiş olabilir. Örneğin; hostun kodgemisi.com adresine erişimi için curl komutu ile bağlantıyı test edelim:

$ curl -vvv kodgemisi.com* About to connect() to kodgemisi.com port 80 (#0)* Trying 212.237.33.168...* Connection timed out* Failed connect to kodgemisi.com:80; Connection timed out* Closing connection 0curl: (7) Failed connect to kodgemisi.com:80; Connection timed out

“Connection time out” hatası almaktayız. iptables komutunu -S opsiyonu ile çalıştırıp trafiği engelleyen bir kural olup olmadığını kontrol ediyoruz.

$ iptables -S-P INPUT DROP-P FORWARD DROP-P OUTPUT DROP-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

İlk 3 kural trafiğin varsayılan olarak drop edildiğini göstermektedir. Diğer kurallar ise SSH ve DNS trafiğini göstermektedir. Bu durumda Sistem Yöneticisi ile iletişime geçip external endpointlere erişim için izin veren kural tanımı için talepte bulunmak gerekir.

8. sestatus

Genellikle host içinde barındırılan uygulamaların SELinux (Linux güvenlik modülü) tanımı enforced durumunda bulunmaktadır . SELinux host üzerinde çalışan processlere minimum erişim yetkisi sağlar. Böylelikle potensiyel tehlikeli processlerin sistemde bulunan önemli dosyalara erişimi engellenmiş olur. Bazı durumlarda bir uygulama belirli bir dosyaya erişmeye çalıştığında hata ile karışılaşılabilir. SELinux’un uygulama erşimini engelleyip engellemediğini kontrol etmek için,tail ve grep komutlarını kullanarak “denied” mesajını /var/log/audit dosya uzantısındaki logları incelememiz gerekiyor. sestatus komutu ile SELinux etkin olup olmadığını kontrol edebiliriz. Aşağıdaki örnekte SELinux status karşısında enabled yani etkin yazmaktadır.

$ sestatusSELinux status:                 enabledSELinuxfs mount:                /sys/fs/selinuxSELinux root directory:         /etc/selinuxLoaded policy name:             targetedCurrent mode:                   enforcingMode from config file:          enforcingPolicy MLS status:              enabledPolicy deny_unknown status:     allowedMax kernel policy version:      28

9. w

Tek harften oluşan komut olmasına rağmen sırasıyla uptime ve who komutlarını çalıştırmaya yarar.

[root@centos ~]# w15:05:42 up  4:49,  3 users,  load average: 0.02, 0.01, 0.00 
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
server tty7 :0 14:06 4:43m 1:42 0.08s pam: gdm-passwo
server pts/0 :0.0 14:18 0.00s 0.23s 1.65s gnome-terminal
server pts/1 :0.0 14:47 4:43 0.01s 0.01s bash

10. rsync

rsync komutu -P yani progress kutusu opsiyonuna sahip kopyalama aracıdır. Bunun dışında birden fazla sistemde dosyaları senkronize halde tutmak için de kullanılır.

cp komutu yerine kalıcı kullanım için alias tanımlanabilir.

alias cp=’rsync -aP’

-z opsiyonu sıkıştırma, -v opsiyonu verbose çıktı için ve -r opsiyonu recursive işlem içindir.

[root@centos~]# rsync -zvr IMG_5267\ copy\=33\ copy\=ok.jpg ~/Desktop/ sending incremental file list 
IMG_5267 copy=33 copy=ok.jpg
sent 2883830 bytes received 31 bytes 5767722.00 bytes/sec
total size is 2882771 speedup is 1.00

rsync ile boyutu büyük olan dosyalar kopyalanırken oluşabilecek hataları gözlemleyebiliriz.

Aşağıdaki komut örnekleri ile klasör içeriğinde kopyalamak istemediğimiz dosyaları exclude opsiyonu ardından belirtebiliriz:

[root@centos~]# rsync -avz --exclude 'klasor' kopyalanacakDizin/ hedefDizin/[root@centos~]# rsync -avz --exclude 'dir*' source/ destination/
building file list ... done
created directory destination
./
file1.txt
file2.txt

11.mkpasswd

mkpasswd, belirleyeceğimiz karakter sayısında random parola oluşturmamıza yarar. -l opsiyonu ile karakter sayısını yazabiliriz.

[root@centos~]# mkpasswd -l 10aPo+8oAxxC[root@centos ~]# mkpasswd -l 20 j0tR6aqKk&hm&mqUrZmk

--

--