← Bash tools
TEKNİK REHBER BASH TOOLS DOSYA İNCELEME 2026

stat, file ve hexdump
dosya bilgisi ve iç yapı

Bir dosyanın ne olduğunu, ne zaman değiştiğini ve içinde ne olduğunu keşfetmek için üç araç. stat metadata, file içerik tür tespiti, hexdump/xxd ham byte görüntüleme.

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.

stat
İzinler, boyut, sahip, üç zaman damgası (atime/mtime/ctime) — dosya sistemi metadata
file
Uzantıya değil içeriğe bakarak dosya türünü tespit eder — magic bytes analizi
hexdump / xxd
Dosyayı ham byte olarak gösterir — binary inceleme, protokol analizi

01 stat: dosya metadata

stat bir dosyanın inode bilgilerini gösterir: boyut, izinler, sahiplik ve üç farklı zaman damgası.

bash
# 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
ÜÇ ZAMAN DAMGASI

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.

bash
# 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
FormatAnlamÖrnek çıktı
%sBoyut (byte)2847
%aİzin (oktal)644
%Aİzin (okunabilir)-rw-r--r--
%USahip kullanıcı adıroot
%GSahip grup adıroot
%uSahip UID0
%nDosya adı/etc/passwd
%Ymtime (epoch)1736344532
%ymtime (okunabilir)2026-01-08 14:55:32
%iInode numarası1573252
%hHard link sayısı1
%FDosya 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.

bash
# 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?
--mime-type
MIME türünü döndür: application/pdf, image/png...
--mime
MIME türü + charset: text/plain; charset=utf-8
-L
Sembolik linkleri takip et
-b
Brief — dosya adını yazdırma, sadece türü
-i
--mime ile eşdeğer (bazı sistemlerde)
GÜVENLİK KULLANIMI

Kullanı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.

bash
# 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|
-C
Canonical format — hex + ASCII yan yana (en okunabilir)
-n N
Sadece ilk N byte'ı işle
-s N
İlk N byte'ı atla (skip)
-e FORMAT
Özel çıktı formatı (gelişmiş)
MAGIC BYTES

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.

bash
# 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'
-p
Plain hex (boşluksuz, tek satır) — betikler için
-r
Reverse — hex dump'ı binary'ye çevir
-l N
Sadece ilk N byte (limit)
-c N
Satır başına N byte (varsayılan 16)
-s N
N byte atla (seek)

06 nl: satır numaralandırma

nl (number lines) cat -n'den daha esnek — sadece belirli bölümleri, belirli satırları numaralandırabilir.

bash
# 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ı
-ba
Tüm satırları numaralandır (boş dahil)
-bt
Sadece boş olmayan satırları numaralandır (varsayılan)
-v N
Başlangıç numarası (varsayılan 1)
-i N
Artış adımı (varsayılan 1)
-n FORMAT
ln: sol hizalı, rn: sağ hizalı, rz: sıfır dolgulu
-s STR
Numara ve içerik arasındaki ayırıcı (varsayılan tab)

07 Pratik vakalar

Gerçek dünya senaryoları: güvenlik incelemesi, dosya doğrulama, binary analiz.

bash — Yüklenen dosyaların türünü doğrula
# 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
bash — Son değiştirilen config dosyaları
# /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'
bash — Binary içinde gizli string ara
# 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
bash — İzin scripti: SSH key otomatik düzelt
# 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 al
  • stat -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üvenme
  • hexdump -C -n 4 dosya: magic bytes → dosya türü tespiti
  • xxd -p dosya: plain hex; xxd -r -p: hex'i geri binary'ye çevir
  • strings binary: executable'daki metin dizelerini çıkar

Devam: diff, patch — dosya karşılaştırma ve yama · izinler ve sahiplik — chmod, chown, sudo