Komut Satırı Araçları

Cem Topkaya
13 min readJan 20, 2021

--

  • sort
  • unique
  • wc (Word count) Kelime Sayaç
  • tee
  • nc — ncat netcat Kullanımı
  • socat
  • nc (netcat) ile port tarama
  • ncat ile Uzak Makinede Kabuk Komutları Çalıştırmak
  • nmap ile port tarama
  • ncat ile web istekleri yapmak
  • ncat ile web sunucusu
  • ncat ve socat ile port yönlendirme (port forwarding)
  • netstat ile hangi proses hangi portu kullanılıyor
  • Komut satırında çok satırlı (multiline) dosya oluşturma
  • cat İle Çok Satırlı Dosya Oluşturma (creating file with cat)
  • seq Komutu
  • tr (Transpose) Komutu
  • terminal komutlarını yeni satırda yazmak

sort

Girdi olarak gelen veriyi sıralayarak çıktı yaratır

-r Tersine sıralar-n Sayıya göre sıralar-f Karakterlerin büyük küçük olmasına dikkat etmeden sıralar

-u Anahtarıyla tekrar eden aynı satırları bir taneye indirir

Referans: https://www.geeksforgeeks.org/sort-command-linuxunix-examples/

unique

Girdi olarak gelen verinin içindeki tekrarlı satırları tek olacak şekilde çıktıya yönlendirir

wc (Word count) Kelime Sayaç

# wc --help
Usage: wc [OPTION]... [FILE]...
or: wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. A word is a non-zero-length sequence of
characters delimited by white space.
With no FILE, or when FILE is -, read standard input.The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
-c, --bytes print the byte counts
-m, --chars print the character counts
-l, --lines print the newline counts
--files0-from=F read input from the files specified by
NUL-terminated names in file F;
If F is - then read names from standard input
-L, --max-line-length print the maximum display width
-w, --words print the word counts
--help display this help and exit
--version output version information and exit

tee

2'li Priz gibi düşünebiliriz. Soldan gelen stdOut bilgisi sağ tarafa yönlendirilmeden önce dosya/konsol(/dev/tty)/boşluk(/dev/null) gibi bir çıktıya yönlendirlir.

tee komutu tek yönlü olarak akış sağlar (soldan sağa).

  • INPUT olarak gelen bilgiyi dosyaya yazıp OUTPUT’u boşluğa gönderebilir
Tee komutuyla aşağıdaki komut aynı işi yapacaktır$ command > cikti.txtTee komutu hem dosyaya/terminale/... yazıp hem başka bir programa stdIn olacak şekilde girdi olarak yönlendirebilir. Aşağıdaki komut hem cikti.txt dosyasına yazar hemde tee'den gelen stdOut'u uzayın boşluğuna yönlendirir.$ command | tee cikti.txt > /dev/nullancak cikti.txt dosyası veya dosyayı yazdırmak istediğimiz dizin root kullanıcısının yetkisindeyse sistem, "permission denied" hatası verecektir. Bu hatayı geçmek için tee komutu kullanmamız gerekir. tee komutunu sudo ile çalıştırarak çıktıyı dosyaya yazabiliriz.$ command > sudo tee -a cikti.txt$ echo "newline" | sudo tee -a /etc/file.conf
executable_on_ek-a, executable_on_ek-b, executable_on_ek-hede gibi çalıştırılabilir dosyaları bulalım:
$ x=( $(find . -name "cnr*") ); echo "${x[@]}"
./cnrgelin ./cnrgorun ./cnryiyin ./cnricin

içlerinde dönerek her exenin bağlı olduğu kütüphaneleri tee'ye göndeririz ve tee bizim için tum gelenleri "kutupler.txt" dosyasına ekleyerek oluşturur
$ for a in $(find . -name "cnr*"); do ldd $a | tee -a kutupler.txt; done
  • INPUT olarak gelen bilgiyi 1 veya * sayıda dosyaya yazıp sonraki komuta geçirebilir
$ command | tee dosya1.txt dosya2.csv dosya3.cem
  • Komuttan gelen bilgiyi hali hazırda olan bir dosyaya -a veya --append anahtarıyla ekleyebilir
$ command | tee -a dosyaAdi.txt 
  • Eğer hataları da tee uygulamasına yönlendirmek istersek
$ program [arguments...] 2>&1 | tee outfile# tee --help
Usage: tee [OPTION]... [FILE]...
Copy standard input to each FILE, and also to standard output.
-a, --append append to the given FILEs, do not overwrite
-i, --ignore-interrupts ignore interrupt signals
-p diagnose errors writing to non pipes
--output-error[=MODE] set behavior on write error. See MODE below
--help display this help and exit
--version output version information and exit
MODE determines behavior with write errors on the outputs:
'warn' diagnose errors writing to any output
'warn-nopipe' diagnose errors writing to any output not a pipe
'exit' exit on error writing to any output
'exit-nopipe' exit on error writing to any output not a pipe
The default MODE for the -p option is 'warn-nopipe'.
The default operation when --output-error is not specified, is to
exit immediately on error writing to a pipe, and diagnose errors
writing to non pipe outputs.

Dosya sistemi hakkında bilgi veren ‘df’ komutu soldaki çıktıyı üretecek.

`df -h` çıktısı tee komutuna yönlendiriliyor.

`tee dosya.txt` komutuyla `df -h` nin çıktısını dosyaya yazıp | operatörüyle başka bir komuta yönlendirebilir.

Dosyanın içeriği ile ilk çıktının aynı olduğunu görürüz!

Referanslar

nc — ncatnetcat Kullanımı

Ncat, komut satırında çalışarak X ağından Y ağına veri okuyup yazabilen, çeşitli özelliklerle dolu bir ağ oluşturma aracıdır.ncat, netcat’in daha gelişmiş, yeniden geliştirilmiş uygulaması olarak Nmap Projesi için yazılmıştı.

Docker Kapları Arasında nc Nasıl Çalışıyor?

Dikkat etmemiz gereken iki docker kabı arasında iletişim kurmak için host.docker.internal kullanılmasıdır. Mac için özel bir ağ durumu olması sebebiyle (örn. Mac için Docker Desktop, kapsayıcılara trafik yönlendiremez ve mac içinde docker0 diye bir ağ arayüzünün olmaması vs.) host.docker.internal kullanılıyor. Windows için IP adresi yazılabilir. Örneğin docker içinde bir nginx sunucu ayağa kaldırıyor olsaydık internet gezgini adresi olarak http://host.docker.internal:80 kullanacaktık.

nc (netcat) ile port tarama

Uzak makinede açık portları bulmak için:

nc -vv -z  host02 1-30

ncat ile Uzak Makinede Kabuk Komutları Çalıştırmak

Sanki uzak makinede SSH sunucusu kuruluymuş gibi kabuk komutlarını iki ncat uygulaması arasında gönderip uzak makinede koşturulmasını sağlayabiliriz.

Windows 10 içinde aynı zamanda WSL (Windows Subsytem Linux) adı altında bir sanal Linux işletim sistemi koşuyor.

WSL’in konsoluna erişmek için wsl komutunu çalıştırıyorum.

Nmap paketi yüklü ise ncat komutu çalışacak!

Nmap yüklemek için “sudo apt install nmap” çalıştırmak gerekebilir.

İki pencere açarak üstteki pencerede sanki başka bir makineymiş gibi sunucu olarak ncat çalıştıracağım.
Alttaki pencerede bir komut satırı daha açıp ncat ile istemci gibi bağlanacağım.

İstemciden göndereceğim komutlar sunucuda çalışabilsin diye ncat uygulamasına /bin/bash uygulamasını — exec anahtarıyla vereceğim.

Komutların çıktılarını alttaki pencerede yani istemci gibi çalışan ncat’in olduğu komut satırında görebileceğim.

nmap ile port tarama

nmap paketi içinde ncat uygulaması gibi çeşitli uygulamalar gelmekte.

nmap -sSV -T4 -F -d --version-trace -n 192.168.0.33

–sV parametresi ile servis sürüm tespiti,

-T4 parametresi ile zamanlama ayarlaması,

-F parametresi ile popüler 100 port taraması,

-d parametresi ile debug modda çalışma yapılır.

–version-trace parametresi kullanılarak sürüm tespiti sırasındaki işlemleri ekrana detaylı basar.

ncat ile web istekleri yapmak

printf ile HTTP istek paketimizi hazırlıyoruz, | operatörüyle nc/ncat uygulamasına yönlendiriyoruz. Buradaki nc komutu istemci olarak çalışır çünkü -l anahtarıyla port dinlemek için kullanılmamıştır.

$ printf "GET / HTTP/1.0\r\n\r\n" | nc google.com 80
printf “GET / HTTP/1.0\r\n\r\n” | nc google.com 80

ncat ile web sunucusu

printf ile HTTP mesajını ncat’in 8999 portunu dinleyecek şekilde ayarladıktan sonra gelen isteklere yönlendiriyoruz.

$ printf "HTTP/1.1 200 OK\n\n<h1>ncat ile web sunucusu</h1>" | ncat -l 8999

Yukarıdaki gibi sabit girdiğimiz <h1> etiketi yerine cat ile html/json gibi bir dosyasının içeriğini de gönderebiliriz. HTTP paketinde header bilgileri yeni satırlar (\n) ile ayrılıyorken başlık ile gövde arası boş bir satır ile ayrılıyor bu yüzden yeni satıra da bir yeni satır ekleyip HTTP paketine gövdeyi yazıyoruz (\n\n)

%s ile printf komutu ilk parametre olan formatlı metin bilgisini alıyor ve sonraki parametreleri formatın içindeki %s ile belirtilen yerlere parametre olarak yazıyor.

$ printf "HTTP/1.1 200 OK\nContent-Type: application/json\n\n%s" "$(cat veri.json)"
$ printf "HTTP/1.1 200 OK\nContent-Type: application/json\n\n%s" "$(cat veri.json)" | nc -l 8999

ncat ile giden veriyi görüntüleme

Aşağıdaki ekranda ncat 50000 portunu dinler ve gelen mesajı ekrana yazar. http://localhost:50000 isteğini yapan chrome internet gezgini karşısında ncat -l 127.0.0.1 50000 prosesini bulur ve HTTP isteği

socat

Socat, iki çift yönlü bayt akışı oluşturan ve aralarında veri aktaran komut satırı tabanlı bir yardımcı programdır. Akışlar, farklı türde veri havuzları ve kaynaklarından oluşturulabildiğinden ve akışlara çok sayıda adres seçeneği uygulanabildiğinden, socat birçok farklı amaç için kullanılabilir.

socat indirmek için sourceforge adresini ziyaret edelim.

Bir http/s sunucusu ayaklandırmak için aşağıdaki kodu çalıştıralım ve socat ile araya girelim.

# socat -v tcp-l:5000,fork,reuseaddr tcp:127.0.0.1:60666

-v Anahtarı sol taraftan gelen isteği ve sağ taraftan gelen cevabı terminalde görüntüler.

readline Anahtarını kullanarak hedef sunucuya gidecek isteği biz elle girebiliriz.

# socat -v readline tcp:127.0.0.1:60666

socat Örnek komutları:

ncat ve socat ile port yönlendirme (port forwarding)

Hızlısından nasıl yönlendirebiliriz, komutları yazalım:

ncat ile nc arasındaki farkı yardım argümanı ile aşağıda görebiliyoruz.

socat’in özelliklerini de gözümüzün önünde tutalım

netstat İle Hangi Proses Hangi Portu Kullanılıyor

Ref: www.tecmint.com

Önce netstat yüklü olmalı:

$ sudo yum install net-tools	#RHEL/CentOS 
$ sudo apt install net-tools #Debian/Ubuntu
$ sudo dnf install net-tools #Fedora 22+

Şimdi portları listeleyebiliriz:

$ netstat -ltnp | grep -w ':80'

l : netstat’a yalnızca dinlenen soketleri göstermesini söyler.

t : tcp bağlantılarını görüntülemesini söyler.

Sadece TCP leri listeler:

n: sayısal adresleri göstermesi talimatını verir.

p : Hangi işlemin bu port üstünde dinleme yaptığını ve işlem adının gösterilmesini sağlar.

grep -w : tam dizeyle eşleşmeyi gösterir (“: 80” ).

Varsayılan olarak bağlı olduğu portları gösterir (CONNECTED)

  • l Anahtarı sadece dinlediklerimizi listeler.

Komut satırından çok satırlı (multiline) dosya oluşturma

https://superuser.com/a/895868/38133

Yukarıdaki gif dosyasında birden fazla satırda yazı yazmak için echo’dan sonra tırnağı açık bırakmak gerektiğini görüyoruz. Ama aşağıdaki gibi çok satırlı bir girdiyi dosya yaratarak içine yazmak için > karakterini var olan dosyanın sonuna eklemek için >> karakterlerini kullanıyoruz

cat İle Çok Satırlı Dosya Oluşturma (creating file with cat)

cat İle bir dosya oluşturmak için > karakterini tıpkı yukarıdaki echo kullanımında olduğu gibi kullanıyoruz. Eğer bir dosyaya append (ekleyerek) devam etmek istersek >> karakterlerini kullanacağız. EOF (End Of File) veya EOT (End Of Transmission — Ctrl+D) ile aktarımın başladığını veya tamamlandığını belirtiriz.

EOF ve EOT Ayrımı

EOT genellikle devreleri serbest bırakmak, terminallerin bağlantısını kesmek veya alıcı terminalleri bekleme durumuna getirmek gibi diğer işlevleri başlatmak için kullanılır. Günümüzde en yaygın kullanımı, bir Unix terminal sürücüsünün dosyanın sonunu işaret etmesini ve böylece giriş bekleyen programlardan çıkmasını sağlamaktır.

EOT, seri aygıtlar tarafından kullanılan bir dizi kontrol karakterinden biridir. Verilerin seri hatlar üzerinden iletimi veya dosyaların kağıt bant gibi bir seri kaynak üzerinde depolanmasıyla ilgili bir dizi başka kontrol karakterleri vardır. Bunlar SOH, STX, ETX, FS, RS, GS ve US gibi karakterleri içerir.

İletim kontrolü ve hata düzeltme için ek kontrol karakterleri kullanılır.

EOT (İletimin Sonu) karakteri; Seri bağlantıda iletimi sonlandırma isteğini gösterir. Seri bağlantılara genellikle bir dosya sürücüsü kullanılarak erişilir. Seri aktarım sona erdiğinde, dosya sürücüsü bunu bir EOF (Dosya Sonu) durumu olarak bildirir.

EOF bir karakter değildir. C bağlamında EOF, bir dosyada görünemeyen bir şeydir. Ancak EOT bir ASCII karakteridir.

Program bir terminalde varsayılan ayarlarla kurallı modda çalışıyorsa, uçbirim sürücüsü EOT karakterini (Ctrl+D veya ) tanır ve bir EOF koşulu oluşturur (bu, düşük seviyede read() ‘den 0 dönüş değeridir). Stdio kitaplığı, bu EOF koşulunu söz konusu işlev için uygun olan dönüş değerine çevirir (getchar () için EOF makrosu, fgets () için bir boş gösterici, vb.)

Ref: https://en.wikipedia.org/ , https://unix.stackexchange.com

HTML Code: &#9220; HTML Preview:

seq Komutu

$ seq --help
Usage: seq [OPTION]... LAST
or: seq [OPTION]... FIRST LAST
or: seq [OPTION]... FIRST INCREMENT LAST
Print numbers from FIRST to LAST, in steps of INCREMENT.

Ayraç (seperator) kullanarak aralığı yazdırmak:

$ seq -s <ayraç karakter|leri> <first> <increment> <last>

Ayraç eğer birden fazla karakter ise tırnak arasına alıyoruz

Format ile ondalıklı sayıları yazdırmak:

$ seq -f “Ondalık 2 Hane: %.2f” 100 10.5 200
$ for i in $(seq 0 1 10); do echo “Deger: “$i; done;

tr (Transpose)

$ tr [OPTION] SET1 [SET2]

Metin içinde yapılacak arama sonuçlarını:

  • -s, --squeeze-repeats ile teke indiriyor
  • -d ile karakterler siliniyor (tekrarların teke indirilmesinden farklı olarak)
$ tr --help
Usage: tr [OPTION]... SET1 [SET2]
Translate, squeeze, and/or delete characters from standard input,
writing to standard output.
-c, -C, --complement
use the complement of SET1
-d, --delete
SET1'deki karakterleri siler, transpose etmez
-s, --squeeze-repeats
Son belirtilen SET'de listelenen tekrarlanan karakterler dizisini, tek bir karakterle değiştirir
-t, --truncate-set1
ilk karakteri first truncate SET1 to length of SET2
SET'ler karakter dizileri olarak belirtilir. Çoğu kendini temsil ediyor.Yorumlanan karakterler:\NNN sekizlik değeri olan karakter NNN (1 ila 3 basamaklı sekizlik)
\\ backslash
\a audible BEL
\b backspace
\f form feed
\n new line
\r return
\t horizontal tab
\v vertical tab
CHAR1-CHAR2 CHAR1'den CHAR2'ye kadar tüm karakterler artan sırada
[CHAR*] SET2'de, CHAR'ın SET1'in uzunluğuna kadar kopyaları
[CHAR*REPEAT] CHAR kopyalarını TEKRARLA, 0 ile başlıyorsa sekizliyi (octal) TEKRARLA
[:alnum:] tüm harfler ve rakamlar
[:alpha:] tüm harfler
[:blank:] tüm yatay boşluk
[:cntrl:] tüm kontrol karakterleri
[:digit:] tüm rakamlar
[:graph:] boşluk hariç tüm yazdırılabilir karakterler
[:lower:] tüm küçük harfler
[:print:] boşluk dahil tüm yazdırılabilir karakterler
[:punct:] tüm noktalama karakterleri
[:space:] tüm yatay veya dikey beyaz boşluklar
[:upper:] tüm büyük harfler
[:xdigit:] tüm onaltılık basamaklar
[=CHAR=] CHAR'a eşdeğer tüm karakterler

-s Anahtarı tekrarlanan karakteri teke düşürürken -d anahtarı siler.

$ docker images | grep aaa
aaa latest 1adbb699484f 7 days ago 72.9MB
$ docker images | grep aaa | tr -s [:space:]
aaa latest 1adbb699484f 7 days ago 72.9MB
$ docker images | grep aaa | tr -d [:space:]
aaalatest1adbb699484f7daysago72.9MB

a, b ve boşluk [:space:] karakterlerinin tekrar edenlerini teke düşürür:

$ docker images | grep aaa
aaa latest 1adbb699484f 7 days ago 72.9MB
// tekrar eden a ve boşluk karakterlerini teke indirir:
$ docker images | grep aaa | tr -s a[:space:]
a latest 1adbb699484f 7 days ago 72.9MB
// tekrar eden a, b ve boşluk karakterlerini teke indirir:
$ docker images | grep aaa | tr -s ab:space:]
a latest 1adb699484f 7 days ago 72.9MB

truncate Örneği:

  • -t anahtarından sonraki parametre 1. küme ve sonraki parametrede 2. kümedir.
  • -t ‘abts’ ‘?!x’ : a harfi ?, b harfi ! , t ve s ile x değiştirilir
  • Eğer 2. kümedeki karakterler 1. kümedeki tüm karakterlere karşılık gelmiyorsa (yani aynı sayıda değillerse, yani 2. küme daha kısa ise) birinci küme ile ikincide eşleşen son karakterden sonraki tüm karakterler için ikinci kümenin son karakteri kullanılır

Varsayılan olarak tr, birinci ve ikinci kümeler farklı uzunluklarda ise ikinci kümenin son karakterini tekrarlayacaktır.

https://shapeshed.com/unix-tr/#how-to-truncate-a-search-pattern
$ echo "Bad\ File\ nAme.txt" | tr -d '\\' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'
bad_file_name.txt
$
$ echo "some_url_that_I_have" | tr "_" "-"
some-url-that-I-have
$
$
$ echo 'the cat in the hat' | tr -t 'abcdefgh' '123'
the 31t in the h1t
$
$
$ echo 'the cat in the hat' | tr 'abcdefgh' '123'
t33 31t in t33 31t
$
$
$ echo 'too many spaces here' | tr -s '[:space:]'
too many spaces here
$
$
$ echo 'clean this up' | tr -d 'up'
clean this
$
$
$ echo 'Phone: 01234 567890' | tr -cd '[:digit:]'
01234567890$
$
$
$ echo abcdefghijklmnop | tr -c 'a' 'z'
azzzzzzzzzzzzzzzz$
$
$
$
$ echo uppercaseme | tr '[:lower:]' '[:upper:]'
UPPERCASEME

Diğer Örnekler (kaynak: https://www.thegeekstuff.com/):

$ echo "thegeekstuff" |tr a-z A-Z
THEGEEKSTUFF
< inputfile ile girdi dosyasındaki
{ nun yerine (
} nun yerine ) değişimini yapar
> outpufile ile çıktı dosyasına yazar
$ tr '{}' '()' < inputfile > outputfile
$ echo "Boşluk yerine tab karakteri basar" | tr [:space:] '\t'
Boşluk yerine tab karakteri basar
Aşağıdaki üç örnek ilişkili ama zıt iş yapar:
--- 1. Örnek ----------------------------------------------------
$ echo "1. sayıları siler 432234 -d anahtarı" | tr -d [:digit:]
. sayıları siler -d anahtarı
--- 2. Örnek -----------------------------------------------------
-c anahtarı değil işlemi yapar
örnekte:
-c [:digit:] : "sayılar hariç seç" diyendir
-d : sil
$ echo "sayı hariç 432234 sil" | tr -cd [:digit:]
432234
--- 3. Örnek -----------------------------------------------------
[:print:] boşluk dahil tüm yazdırılabilir karakterlerdir
Ama -c [:print:] "yazdırılabilen karakterler hariç" sil (-d) demek
$ tr -cd [:print:] < file.txt

terminal komutlarını yeni satırda yazmak

En gıcık olduğum satırın yarısı veya daha fazlasının user@hostname:pwd$ ile kaplı olması.

satırın yarısı dizin !!!

Bunu .bashrc içinde en sonra şu satırı ekleyerek yeni satırda başlayacak şekilde ayarlayabiliyoruz:

PS1='
$(whoami)@$(hostname):$(pwd)
$ '

Yaptığınız değişikliklerin faal olması için $ source .bashrc komutunu çalıştırmanız yeterli.

--

--

Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.