00 Üç aracın rolü
Dosya sistemi bize görüntüden daha fazlasını söyler — stat, file ve hexdump bu gizli bilgiyi ortaya çıkarır.
01 stat: dosya metadata
stat bir dosyanın inode bilgilerini gösterir: boyut, izinler, sahiplik ve üç farklı zaman damgası.
# Tam stat çıktısı
stat /etc/passwd
File: /etc/passwd
Size: 2847 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 1573252 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2026-01-10 08:23:41.123456789 +0300
Modify: 2026-01-08 14:55:32.987654321 +0300
Change: 2026-01-08 14:55:32.987654321 +0300
Birth: 2025-12-01 10:00:00.000000000 +0300
# Dizin hakkında stat
stat /var/log/
# Sembolik link hedefini değil, linki incele
stat -L /etc/localtime # hedef dosyayı izle
stat /etc/localtime # linkin kendisini göster
atime (Access): son okuma. mtime (Modify): içerik son değişme. ctime (Change): metadata son değişme (izin/sahip). find -mtime mtime'ı kullanır; ls -l mtime'ı gösterir. ctime, içerik değişikliklerinde de güncellenir.
02 stat: özel format ile betikler için
-c (veya --format) bayrağı ile belirli alanları betiklerde kullanılabilecek biçimde alabilirsiniz.
# Sadece dosya boyutunu al (byte)
stat -c '%s' dosya.txt
2847
# İzinleri oktal olarak al
stat -c '%a' dosya.txt
644
# mtime'ı epoch (Unix timestamp) olarak al
stat -c '%Y' dosya.txt
1736344532
# İnsan-okunur format
stat -c '%y' dosya.txt
2026-01-08 14:55:32.987654321 +0300
# Birden fazla alan (tek satır çıktı)
stat -c '%n %s %a %U' dosya.txt
dosya.txt 2847 644 root
# Betik kullanımı: izni kontrol et
perm=$(stat -c '%a' ~/.ssh/id_rsa)
if [ "$perm" != "600" ]; then
echo "UYARI: SSH anahtarı izni $perm olmalı 600"
fi
| Format | Anlam | Örnek çıktı |
|---|---|---|
%s | Boyut (byte) | 2847 |
%a | İzin (oktal) | 644 |
%A | İzin (okunabilir) | -rw-r--r-- |
%U | Sahip kullanıcı adı | root |
%G | Sahip grup adı | root |
%u | Sahip UID | 0 |
%n | Dosya adı | /etc/passwd |
%Y | mtime (epoch) | 1736344532 |
%y | mtime (okunabilir) | 2026-01-08 14:55:32 |
%i | Inode numarası | 1573252 |
%h | Hard link sayısı | 1 |
%F | Dosya türü | regular file |
03 file: içerik türü tespiti
file uzantıya değil, dosyanın başındaki "magic bytes"a bakarak türü tespit eder. Yanıltmak çok zordur.
# Dosya türünü tespit et
file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, dynamically linked
file dosya.jpg
dosya.jpg: JPEG image data, JFIF standard 1.01
file script.sh
script.sh: Bourne-Again shell script, ASCII text executable
# Birden fazla dosya
file /usr/bin/*
# Sadece MIME türü (betikler için)
file --mime-type dosya.pdf
dosya.pdf: application/pdf
# Charset de göster
file --mime dosya.txt
dosya.txt: text/plain; charset=utf-8
# Uzantıyı yoksay: sadece içeriğe bak
file yaniltici.txt # aslında PDF'se söyler
# Sembolik linki takip et
file -L /etc/localtime
# Dizin içeriğini özyinelemeli
file uploads/*
# Yükleme güvenliği: uzantı ile içerik eşleşiyor mu?
application/pdf, image/png...text/plain; charset=utf-8Kullanıcıdan dosya alıyorsanız file --mime-type ile içerik türünü doğrulayın — uzantıya güvenmeyin. .jpg olarak yüklenmiş ama aslında PHP script olan dosya, file ile yakalanır.
04 hexdump: ham byte görüntüleme
hexdump dosyayı onaltılık (hex) ve ASCII olarak gösterir. Binary dosyaları, protokol paketlerini veya bozuk verileri incelemek için kullanılır.
# Basit hex dump
hexdump dosya.bin
# Canonical format: hex + ASCII yan yana
hexdump -C dosya.bin
00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 0a 00 00 00 00 |Hello World.....|
00000010 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 |................|
# Sadece ilk N byte
hexdump -C -n 32 dosya.bin
# N byte atla, sonraki M byte'ı göster
hexdump -C -s 512 -n 64 dosya.bin
# Sadece yazdırılabilir ASCII'yi göster
hexdump -e '"%_p"' dosya.bin
# String arama: dosyada gizli metin var mı?
hexdump -C binary.exe | grep -A2 'password'
# Magic bytes: dosyanın ilk 4 byte'ını oku
hexdump -C -n 4 dosya.pdf
00000000 25 50 44 46 |%PDF|
Dosya türleri sihirli baytlarla tanımlanır: PDF → %PDF (25 50 44 46), PNG → 89 50 4E 47, ZIP → 50 4B 03 04, ELF binary → 7F 45 4C 46. file komutu bu veritabanını kullanır.
05 xxd: okunabilir hex dump
xxd hem hex dump üretir hem de hex dump'ı geri binary'ye çevirebilir. Vim'in hex modu da xxd kullanır.
# hexdump -C'ye benzer format
xxd dosya.bin
00000000: 4865 6c6c 6f20 576f 726c 640a 0000 0000 Hello World....
00000010: 0102 0304 0506 0708 090a 0b0c 0d0e 0f10 ................
# Sadece hex (ASCII yok)
xxd -p dosya.bin
48656c6c6f20576f726c640a00000000
# Tersine: hex'ten binary'ye
echo '48656c6c6f' | xxd -r -p
Hello
# Sadece ilk N byte
xxd -l 32 dosya.bin
# Sütun sayısını değiştir (varsayılan 16)
xxd -c 8 dosya.bin
# Vim'de hex düzenleme
vim dosya.bin
# :%!xxd → hex mod aç
# düzenle
# :%!xxd -r → binary'ye dönüştür
# :wq → kaydet
# strings komutu: binary'deki yazdırılabilir metinleri çek
strings /bin/ls | grep 'version'
06 nl: satır numaralandırma
nl (number lines) cat -n'den daha esnek — sadece belirli bölümleri, belirli satırları numaralandırabilir.
# Temel satır numaralandırma
nl dosya.txt
1 Birinci satır
2 İkinci satır
# Boş satırları da numaralandır
nl -ba dosya.txt
# Sadece boş olmayan satırları (varsayılan: -bt)
nl -bt dosya.txt
# Başlangıç numarası ve adım
nl -v10 -i5 dosya.txt # 10'dan başla, 5'er artır
# Numara formatı (ln=sol, rn=sağ hizalı, rz=sıfır dolgulu)
nl -nrz dosya.txt # 000001, 000002...
# Numara-içerik ayırıcı
nl -s': ' dosya.txt # "1: satır" formatı
ln: sol hizalı, rn: sağ hizalı, rz: sıfır dolgulu07 Pratik vakalar
Gerçek dünya senaryoları: güvenlik incelemesi, dosya doğrulama, binary analiz.
# Upload güvenliği: jpg mi gerçekten?
for f in uploads/*; do
mime=$(file --mime-type -b "$f")
if [[ "$mime" != image/* ]]; then
echo "UYARI: $f → $mime (resim değil!)"
fi
done
# /etc altında son 24 saatte değişen dosyaların listesi
find /etc -maxdepth 2 -name '*.conf' -newer /etc/os-release \
| xargs -I{} stat -c '%y %n' {} \
| sort
# veya daha basit
find /etc -mmin -1440 -type f | xargs stat -c '%y %n'
# Executable'da yazdırılabilir string'leri çıkar
strings /usr/bin/curl | grep -i 'version'
strings /usr/bin/curl | grep 'http'
# xxd ile hex'te ara
xxd binary.dat | grep -i 'dead beef' # magic marker
# SSH key izinlerini kontrol et ve düzelt
for keyfile in ~/.ssh/id_*; do
perm=$(stat -c '%a' "$keyfile")
if [ "$perm" != "600" ]; then
echo "Düzeltiliyor: $keyfile ($perm → 600)"
chmod 600 "$keyfile"
fi
done
Hatırlanacaklar
stat -c '%a %n': izni oktal olarak betikten alstat -c '%Y': mtime'ı epoch olarak al (karşılaştırmak için)- Üç zaman: atime (okuma), mtime (içerik değişme), ctime (metadata değişme)
file --mime-type -b dosya: yükleme doğrulama için — uzantıya güvenmehexdump -C -n 4 dosya: magic bytes → dosya türü tespitixxd -p dosya: plain hex;xxd -r -p: hex'i geri binary'ye çevirstrings binary: executable'daki metin dizelerini çıkar
Devam: diff, patch — dosya karşılaştırma ve yama · izinler ve sahiplik — chmod, chown, sudo