tty ve pts Komutları ile Terminal Oturumlarını İzleme ve Yönetme

Bir gün prodüksiyon sunucusuna bağlandığınızda beklenmedik bir şey görürsünüz: sisteme sizin dışınızda biri daha bağlı. Kim bu? Ne yapıyor? Ne zamandır orada? İşte tam bu anda tty, who, w, ps gibi araçların değerini anlıyorsunuz. Terminal oturumu yönetimi, sistem güvenliğinin en gözardı edilen ama en kritik parçalarından biri.

TTY ve PTS: Temel Kavramlar

Linux’ta her terminal oturumunun bir kimliği vardır. Bu kimlik iki ana kategoride gelir.

TTY (TeleTYpewriter), fiziksel veya sanal konsolları temsil eder. Sunucunun başına geçip doğrudan klavyeyle bağlandığınızda, ya da Ctrl+Alt+F2 gibi kombinasyonlarla geçiş yaptığınızda tty1, tty2 gibi aygıtlar devreye girer. Bunlar /dev/tty1, /dev/tty2 şeklinde dosya sisteminizde yerini alır.

PTS (Pseudo-Terminal Slave), SSH bağlantıları, terminal emülatörleri ve benzeri “sahte” terminal oturumlarını temsil eder. Günümüz sysadmin hayatında neredeyse tüm uzak bağlantılar PTS üzerinden gelir. /dev/pts/0, /dev/pts/1 gibi aygıtlar bunlardır.

Bu ayrımı bilmek neden önemli? Çünkü bir güvenlik olayı sırasında “bu oturum fiziksel mi yoksa uzak mı?” sorusunun cevabını anında vermeniz gerekebilir.

Mevcut Oturumları Görmek

tty Komutu

En basit başlangıç noktası. Hangi terminalde çalıştığınızı gösterir.

tty

Çıktı şöyle görünür:

/dev/pts/2

Eğer bir script içinden çağırıyorsanız ve terminal yoksa not a tty der. Bu bilgiyi script’lerinizde kontrol etmek için kullanabilirsiniz:

if tty -s; then
    echo "İnteraktif terminal var, devam ediyoruz"
else
    echo "Bu bir cron job veya pipe, terminal yok"
    exit 1
fi

who Komutu

Sisteme kim bağlı, hangi terminalden, ne zamandan beri, nereden? Hepsini bir anda görürsünüz.

who
ahmet    pts/0        2024-01-15 09:23 (192.168.1.45)
mehmet   pts/1        2024-01-15 10:47 (10.0.0.23)
root     tty1         2024-01-15 08:00

Burada birkaç kritik bilgi var. root kullanıcısı tty1‘den bağlı, yani fiziksel konsoldan ya da KVM üzerinden. ahmet ve mehmet ise SSH ile uzaktan bağlı.

Kullanışlı who parametreleri:

  • -a: Tüm detayları gösterir, boot zamanı, ölü süreçler dahil
  • -b: Sistemin son boot zamanını gösterir
  • -d: Ölmüş (dead) süreçleri gösterir
  • -H: Sütun başlıklarını ekler
  • -q: Sadece kullanıcı isimlerini ve sayısını gösterir
  • -T: Terminal’in yazılabilir durumunu gösterir (+ yazılabilir, – yazılamaz, ? bilinmiyor)
who -aH

w Komutu

who‘nun daha detaylı abisi. Kullanıcıların ne yaptığını da gösterir.

w
 11:23:45 up 5 days, 2:14,  3 users,  load average: 0.15, 0.22, 0.18
USER     TTY      FROM             LOGIN@   IDLE JTIME  PCPU WHAT
ahmet    pts/0    192.168.1.45     09:23    2:15  0.10s  0.02s vim /etc/nginx/nginx.conf
mehmet   pts/1    10.0.0.23        10:47    0.00s  0.05s  0.01s w
root     tty1                      08:00    3:20  0.00s  0.01s bash

Bakın ahmet ne yapıyor: nginx.conf dosyasını düzenliyor. mehmet ise tam şu an w komutunu çalıştırıyor. Bu bilgi inanılmaz değerli. Birisi production config’ini düzenlerken siz de aynı dosyaya dokunmak üzereyseniz, önce w ile kontrol edin.

w parametreleri:

  • -h: Başlık satırını gizler
  • -s: Kısa format, giriş zamanı ve CPU bilgisi olmadan
  • -f: FROM sütununu (kaynak IP) gizler
  • -i: IP adresi yerine hostname gösterir
  • -u: Kullanıcı adı yerine PID gösterir

Oturum Detaylarını Derinlemesine İncelemek

last ve lastlog Komutları

Geçmiş oturumları incelemek için last komutu vazgeçilmezdir. /var/log/wtmp dosyasını okur.

last -n 20
ahmet    pts/2        192.168.1.45     Mon Jan 15 11:20   still logged in
mehmet   pts/1        10.0.0.23        Mon Jan 15 10:47   still logged in
root     tty1                          Mon Jan 15 08:00   still logged in
deploy   pts/3        172.16.0.5       Mon Jan 15 07:30 - 09:15  (01:45)
ahmet    pts/0        192.168.1.45     Sun Jan 14 22:10 - 23:45  (01:35)

-n 20 son 20 girişi getirir. Dikkatinizi çekti mi? deploy kullanıcısı sabah 07:30’da bağlanmış, 09:15’te çıkmış. Bu normal bir deployment penceresi mi yoksa şüpheli bir aktivite mi? Bunu anlamak için o zaman aralığındaki log’lara bakmanız gerekir.

# Sadece belirli bir kullanıcının geçmişini görmek
last ahmet

# Belirli bir terminalin geçmişini görmek
last pts/0

# Reboot geçmişini de dahil et
last -x

# Tarih ve saat formatını değiştir
last -F

lastlog ise her kullanıcının en son ne zaman giriş yaptığını gösterir:

lastlog

Hiç giriş yapmamış sistem kullanıcılarını grep -v "Never" ile filtreleyebilirsiniz:

lastlog | grep -v "Never logged in"

ps ile Terminal Bazlı Süreç İnceleme

Bir oturumda hangi süreçlerin çalıştığını görmek istediğinizde ps komutu devreye girer.

# Belirli bir terminaldeki süreçleri görmek
ps -t pts/1

# Tüm terminallerdeki süreçleri, terminal bilgisiyle birlikte
ps aux | grep pts

Daha sistematik bir yaklaşım:

ps -eo pid,tty,user,cmd,etime | sort -k2

Bu komut tüm süreçleri terminal’e göre sıralar. Bir terminalde yığılmış onlarca süreç varsa, o oturumda ciddi bir iş dönüyor demektir.

Gerçek Dünya Senaryoları

Senaryo 1: Yetkisiz Bağlantı Tespiti

Gece yarısı monitoring alarm verdi, sunucuya beklenmedik bir bağlantı gelmiş. Ne yaparsınız?

# Önce mevcut oturumları kontrol et
who -aH

# O kullanıcının ne yaptığını gör
w

# O kullanıcının açık dosyalarını incele (pts/3'teki kullanıcı için)
lsof -u suphelikullanici

# O terminaldeki süreçleri göster
ps -t pts/3 -f

Eğer gerçekten şüpheli bir durum varsa, o oturumu sonlandırmanız gerekebilir. Bunu nasıl yapacağımıza birazdan geleceğiz.

Senaryo 2: Biri nginx.conf’u Düzenliyor, Siz de Düzenlemeniz Gerekiyor

w

Çıktıda vim /etc/nginx/nginx.conf gördünüz. Kim bu?

# O kullanıcının PID'ini bul
ps aux | grep nginx.conf

# Kullanıcıyla iletişim kurabilirsiniz (wall veya write komutu ile)
write ahmet pts/0

write komutu açıldıktan sonra mesajınızı yazın, Ctrl+D ile gönderin:

write ahmet pts/0
nginx.conf'u düzenlemeden önce bana haber verir misin? Ben de bakacaktım.
^D

Senaryo 3: Uzun Süredir Idle Kalmış Oturumları Temizleme

Bazı geliştiriciler SSH oturumlarını kapatmayı unutur. Bu hem güvenlik riski hem de kaynak israfıdır.

# 2 saatten fazla idle kalan oturumları bul
who -u | awk '$6 > "02:00" {print $1, $2, $6}'

Daha gelişmiş bir yaklaşım için:

#!/bin/bash
# idle_sessions.sh - Uzun idle kalmış oturumları raporla

THRESHOLD=120  # dakika cinsinden

while IFS= read -r line; do
    user=$(echo "$line" | awk '{print $1}')
    tty=$(echo "$line" | awk '{print $2}')
    idle=$(echo "$line" | awk '{print $5}')
    
    # idle süresi saat:dakika formatındaysa ve eşiği geçiyorsa
    if [[ "$idle" =~ ^[0-9]+:[0-9]+$ ]]; then
        hours=$(echo "$idle" | cut -d: -f1)
        mins=$(echo "$idle" | cut -d: -f2)
        total_mins=$((hours * 60 + mins))
        
        if [ "$total_mins" -gt "$THRESHOLD" ]; then
            echo "UZUN IDLE: $user ($tty) - $idle süredir boşta"
        fi
    fi
done < <(who -u)

Oturumları Sonlandırmak

Bu kısım biraz güç kullanmayı gerektiriyor. Birinin oturumunu sonlandırmak için birkaç yöntem var.

pkill ile Sonlandırma

# Belirli bir terminaldeki tüm süreçleri sonlandır
pkill -t pts/3

# Belirli bir kullanıcının tüm oturumlarını sonlandır
pkill -u suphelikullanici

# Önce SIGTERM gönder, dinlemiyorsa SIGKILL
pkill -SIGTERM -t pts/3
sleep 5
pkill -SIGKILL -t pts/3

kill ile Hedefli Sonlandırma

Bazen terminal oturumunun ana sürecini (genellikle bash veya zsh) öldürmek daha temiz olur:

# pts/3 terminalindeki bash PID'ini bul
ps -t pts/3 | grep bash

# O PID'i öldür
kill -9 <PID>

Oturumu Askıya Almak (Daha Nazik Yaklaşım)

Birini direkt kesmek yerine önce uyarabilirsiniz:

# Tüm bağlı kullanıcılara mesaj gönder
wall "Sistem bakımı başlıyor, 5 dakika içinde bağlantılar kesilecek"

# 5 dakika bekle
sleep 300

# Oturumları sonlandır
pkill -t pts/1
pkill -t pts/2

/dev/pts Dizinini Doğrudan İncelemek

Merak ediyorsanız, pts aygıtlarına doğrudan bakabilirsiniz:

ls -la /dev/pts/
total 0
drwxr-xr-x  2 root tty    100 Jan 15 11:23 .
drwxr-xr-x 21 root root  4440 Jan 15 08:00 ..
crw--w----  1 ahmet  tty  136, 0 Jan 15 11:23 0
crw--w----  1 mehmet tty  136, 1 Jan 15 11:23 1
crw--w----  1 root   tty  136, 2 Jan 15 11:23 2
c---------  1 root   root   5, 2 Jan 15 11:23 ptmx

Her oturumun sahibi ve izinleri burada görünüyor. Dikkat edin: w bitine sahip olan sahibi, o terminale yazabilir. write komutu bu izni kullanır.

Hatta doğrudan bir terminale mesaj yazabilirsiniz:

echo "Sunucu 10 dakika sonra kapatılıyor!" > /dev/pts/1

Bu yöntemi dikkatli kullanın, karşı tarafın terminal çıktısını bozabilir.

script Komutu ile Oturum Kaydı

Güvenlik audit’i için veya eğitim amaçlı, bir terminaldeki tüm aktiviteyi kaydetmek isteyebilirsiniz.

# Oturumu kaydetmeye başla
script /var/log/session_$(date +%Y%m%d_%H%M%S)_$(whoami).log

# Kayıt sırasında her şey hem terminale hem dosyaya yazar
# Bitirmek için:
exit

Kaydı daha sonra oynatmak için scriptreplay kullanabilirsiniz, bunun için timing bilgisi de kaydetmeniz gerekir:

script --timing=/tmp/timing.log /tmp/session.log
scriptreplay /tmp/timing.log /tmp/session.log

Bu özellikle junior adminleri yetiştirirken veya bir olayı sonradan analiz ederken çok işe yarar.

strace ile Terminal Aktivitesini Derinlemesine İzleme

Bir adım daha ileri gidersek, bir oturumdaki sistem çağrılarını takip edebilirsiniz. Bu çok intrusif bir yöntemdir ve sadece gerçek güvenlik olaylarında kullanılmalıdır:

# pts/3'teki bash sürecinin PID'ini bul
SUSPECT_PID=$(ps -t pts/3 | grep bash | awk '{print $1}')

# Sistem çağrılarını izle (sadece write çağrılarını)
strace -p $SUSPECT_PID -e trace=write 2>&1 | strings

Bu komut gerçekten ne yazdığını bile gösterebilir. Yasal ve etik boyutlarına dikkat edin, şirket politikasına ve yerel yasalara uygun hareket edin.

Oturum Yönetimini Otomatize Etmek

Günlük kontrol için basit bir monitoring scripti:

#!/bin/bash
# terminal_monitor.sh

LOG_FILE="/var/log/terminal_monitor.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

echo "=== $TIMESTAMP ===" >> "$LOG_FILE"

# Aktif oturumları logla
who -aH >> "$LOG_FILE"

# Çok sayıda oturum açmış kullanıcıları tespit et
echo "--- Çoklu Oturumlar ---" >> "$LOG_FILE"
who | awk '{print $1}' | sort | uniq -c | sort -rn | awk '$1 > 2 {print "UYARI: " $2 " kullanicisinin " $1 " aktif oturumu var"}' >> "$LOG_FILE"

# Uzun süreli idle oturumlar
echo "--- Uzun Idle Oturumlar ---" >> "$LOG_FILE"
w -h | awk '$5 ~ /[0-9]+:[0-9]+/ {
    split($5, t, ":")
    if (t[1] > 0) print "IDLE: " $1 " on " $2 " for " $5
}' >> "$LOG_FILE"

echo "" >> "$LOG_FILE"

Bu scripti cron’a ekleyin:

# Her 30 dakikada bir çalıştır
*/30 * * * * /usr/local/bin/terminal_monitor.sh

Sonuç

Terminal oturumlarını izlemek ve yönetmek, sistem yönetiminin görünmez ama hayati bir parçası. tty, who, w, last komutları günlük rutininizin bir parçası haline geldiğinde, hem güvenlik açısından hem de ekip koordinasyonu açısından ciddi fayda görürsünüz.

Özellikle vurgulayacağım pratik alışkanlıklar:

  • Sabah sunucuya bağlandığınızda otomatik w çıktısı alın (bunu .bashrc‘ye ekleyebilirsiniz)
  • Kritik değişikliklerden önce kim ne yapıyor diye bakın
  • Uzun idle kalan oturumları düzenli temizleyin
  • Şüpheli oturumları sonlandırmadan önce logları kaydedin

Bu araçlar sizi bir adım önde tutar. Prodüksiyonda bir şeyler ters gittiğinde, “kim ne yaptı ve ne zaman” sorularının cevabını almanız, çözüme ulaşma sürenizi yarı yarıya kısaltır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir