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.
