Cyber RoadmapINDONESIA

Fondasi · Fase 1

Bash Scripting untuk Pemula: Variabel, Kondisi, Loop, Pipe, Redirect, dan Cron Job

Rangkai perintah Linux menjadi skrip yang berjalan sendiri. Pelajari variabel, kondisi, loop, pipe, dan redirect di Bash, lalu buat skrip pemeriksaan keamanan harian yang dijadwalkan dengan cron, lengkap dengan jebakan umum dan cara penyerang menyalahgunakan cron.

Kalau Python adalah pisau serbaguna, Bash adalah perekat di terminal Linux. Setiap perintah yang sudah kamu pelajari di modul Linux, seperti grep, find, chmod, dan systemctl, bisa dirangkai dalam satu file lalu dijalankan sekaligus. File itu disebut skrip Bash.

Bash ada di hampir semua server Linux tanpa perlu dipasang apa pun. Karena itu, administrator dan tim keamanan memakainya untuk tugas sehari-hari: membersihkan log, membuat cadangan, memeriksa konfigurasi, dan menjalankan pemeriksaan otomatis setiap malam. Penyerang juga memakainya, sehingga kemampuan membaca skrip Bash penting saat menyelidiki server yang dibobol.

Di artikel ini kita akan membuat skrip pemeriksaan keamanan harian yang berjalan otomatis setiap dini hari dan menulis laporan bertanggal.

Skrip Bash pertamamu

#!/usr/bin/env bash
# halo.sh - skrip Bash pertama
echo "Halo dari $(hostname)"
echo "Sekarang pukul $(date +%H:%M)"

Baris pertama, #!/usr/bin/env bash, disebut shebang. Ia memberi tahu sistem bahwa file ini harus dijalankan dengan Bash. Tanda $( ) menjalankan sebuah perintah dan menyisipkan hasilnya.

nano halo.sh          # tulis skripnya, simpan dengan Ctrl+O, keluar dengan Ctrl+X
chmod +x halo.sh      # beri izin jalankan
./halo.sh             # jalankan

Perintah chmod +x memberi izin jalankan, seperti yang kamu pelajari di artikel Izin File di Linux. Awalan ./ berarti "jalankan file ini dari folder tempatku berada sekarang".

Variabel

nama="budi"                      # tanpa spasi di sekitar tanda =
port=22
echo "Pengguna $nama memakai port $port"
echo 'Tanda kutip tunggal: $nama tidak diganti'

hari_ini=$(date +%F)             # simpan hasil perintah ke variabel
jumlah_file=$(ls /etc | wc -l)
echo "Hari ini $hari_ini, ada $jumlah_file item di /etc"
# Pengguna budi memakai port 22
# Tanda kutip tunggal: $nama tidak diganti
# Hari ini 2026-11-05, ada 187 item di /etc

Ada tiga aturan yang sering membuat pemula tersandung:

  • Tidak boleh ada spasi di sekitar tanda =. Tulisan nama = "budi" akan dianggap menjalankan perintah bernama nama.
  • Tanda kutip ganda mengganti variabel dengan isinya, tanda kutip tunggal tidak.
  • Selalu apit variabel dengan tanda kutip ganda saat dipakai, misalnya "$file". Tanpa kutip, nama file yang mengandung spasi akan terpecah dan bisa menyebabkan perintah salah sasaran, termasuk perintah hapus.

Skrip juga bisa menerima argumen dari terminal:

#!/usr/bin/env bash
# cek_file.sh - dipanggil dengan: ./cek_file.sh /var/log/auth.log
file="${1:-/var/log/auth.log}"   # argumen pertama, atau nilai bawaan kalau kosong
echo "Memeriksa $file"
echo "Jumlah argumen: $#"
Variabel khusus yang sering dipakai
VariabelIsinya
$1, $2, ...Argumen pertama, kedua, dan seterusnya
$#Jumlah argumen
$?Kode keluar perintah terakhir: 0 berarti berhasil, selain itu gagal
$HOME, $USERFolder rumah dan nama pengguna yang sedang aktif
${var:-bawaan}Isi variabel, atau nilai bawaan kalau kosong

Kondisi

file="/etc/passwd"
if [[ -f "$file" ]]; then
    echo "$file ada"
fi

gagal=7
if (( gagal >= 5 )); then
    echo "BLOKIR"
elif (( gagal >= 3 )); then
    echo "WASPADA"
else
    echo "AMAN"
fi
# /etc/passwd ada
# BLOKIR

Bash punya dua cara menulis kondisi. [[ ]] dipakai untuk memeriksa teks dan file. (( )) dipakai untuk membandingkan angka dengan cara yang mirip Python. Perhatikan juga bahwa setiap if ditutup dengan fi, yaitu kata if yang dibalik.

Pemeriksaan yang paling sering dipakai di [[ ]]
PemeriksaanBenar kalau
-f "$file"File ada
-d "$folder"Folder ada
-r "$file"File bisa dibaca oleh akun yang menjalankan skrip
-z "$teks"Teks kosong
"$a" == "$b"Kedua teks sama

Loop

for port in 22 80 443; do
    echo "Memeriksa port $port"
done

for f in /etc/*.conf; do
    echo "File konfigurasi: $f"
done

# membaca file baris demi baris
while read -r ip; do
    echo "Memeriksa $ip"
done < daftar_ip.txt

Loop for cocok untuk daftar pendek atau sekumpulan file. Untuk membaca file baris demi baris, misalnya daftar alamat IP, pakai while read -r. Opsi -r mencegah garis miring terbalik di dalam baris diartikan secara khusus.

Pipe dan redirect

Inilah kekuatan utama Bash. Kamu sudah memakai pipe di artikel String dan Regex untuk Parsing Log. Sekarang kita lihat polanya secara utuh.

Rangkaian pipe grep, sort, dan uniq untuk menghitung login gagal per IP, beserta daftar operator redirect seperti tanda lebih besar, dua tanda lebih besar, dan 2>/dev/null
Rangkaian pipe grep, sort, dan uniq untuk menghitung login gagal per IP, beserta daftar operator redirect seperti tanda lebih besar, dua tanda lebih besar, dan 2>/dev/null
grep "Failed password" /var/log/auth.log \
    | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' \
    | sort | uniq -c | sort -rn | head -5

Setiap perintah dalam pipe hanya mengerjakan satu hal kecil, tapi rangkaiannya menghasilkan analisis yang berguna. Tanda \ di akhir baris hanya untuk memecah perintah panjang agar mudah dibaca.

ls /etc > daftar.txt                    # simpan hasil ke file
date >> catatan.txt                     # tambahkan di akhir file
find / -perm -4000 2> /dev/null         # buang pesan "Permission denied"
./cek_harian.sh > hasil.log 2>&1        # simpan keluaran dan error sekaligus

Proyek: skrip pemeriksaan keamanan harian

Sekarang kita gabungkan semuanya. Skrip ini memeriksa tiga hal: login SSH yang gagal, kapasitas disk, dan status layanan penting. Hasilnya disimpan ke file laporan yang namanya memakai tanggal hari itu.

Simpan sebagai cek_harian.sh. Kalau ingin mencoba tanpa server sungguhan, pakai file auth.log contoh dari artikel sebelumnya.

#!/usr/bin/env bash
# cek_harian.sh - pemeriksaan keamanan harian sederhana
set -euo pipefail

LOG_AUTH="${1:-/var/log/auth.log}"
FOLDER_LAPORAN="$HOME/laporan-keamanan"
LAPORAN="$FOLDER_LAPORAN/laporan-$(date +%F).txt"
BATAS_GAGAL=5
BATAS_DISK=90

mkdir -p "$FOLDER_LAPORAN"

{
    echo "=== Laporan keamanan $(hostname) - $(date '+%F %T') ==="

    # 1. login SSH yang gagal
    if [[ -r "$LOG_AUTH" ]]; then
        total=$(grep -c "Failed password" "$LOG_AUTH" || true)
        echo "Login SSH gagal: $total"
        if (( total > 0 )); then
            grep "Failed password" "$LOG_AUTH" \
                | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' \
                | sort | uniq -c | sort -rn \
                | while read -r jumlah ip; do
                    if (( jumlah >= BATAS_GAGAL )); then
                        echo "  PERINGATAN: $ip gagal $jumlah kali"
                    else
                        echo "  $ip gagal $jumlah kali"
                    fi
                done
        fi
    else
        echo "Log $LOG_AUTH tidak bisa dibaca"
    fi

    # 2. kapasitas disk
    for mount in / /home; do
        if [[ -d "$mount" ]]; then
            pakai=$(df --output=pcent "$mount" | tail -1 | tr -dc '0-9')
            if (( pakai >= BATAS_DISK )); then
                echo "PERINGATAN: disk $mount terpakai $pakai%"
            else
                echo "Disk $mount terpakai $pakai%"
            fi
        fi
    done

    # 3. layanan penting
    for layanan in ssh cron; do
        if systemctl is-active --quiet "$layanan" 2>/dev/null; then
            echo "Layanan $layanan: berjalan"
        else
            echo "Layanan $layanan: TIDAK berjalan"
        fi
    done
} > "$LAPORAN" 2>&1

echo "Laporan disimpan di $LAPORAN"

Beberapa hal penting di skrip ini:

  • set -euo pipefail membuat skrip berhenti kalau ada perintah yang gagal, variabel yang belum diisi, atau bagian pipe yang error. Tanpa baris ini, skrip yang bermasalah bisa terus berjalan dan menghasilkan laporan yang salah tanpa kamu sadari.
  • Kurung kurawal { ... } mengelompokkan banyak perintah, sehingga semua keluarannya bisa dialihkan ke satu file laporan sekaligus.
  • $(date +%F) menghasilkan tanggal seperti 2026-11-05, sehingga setiap hari punya file laporan sendiri.
  • systemctl is-active --quiet memeriksa status layanan tanpa menampilkan apa pun, cukup dari kode keluarnya, seperti yang kamu kenal di artikel Proses di Linux. Di keluarga Red Hat, nama layanannya sshd dan crond.

Cron: menjalankan skrip secara terjadwal

Skrip pemeriksaan tidak berguna kalau harus diingat dan dijalankan manual setiap hari. Cron adalah layanan Linux yang menjalankan perintah secara otomatis sesuai jadwal.

crontab -e          # ubah jadwal milik akunmu
crontab -l          # lihat jadwal yang sudah ada
Lima kolom jadwal cron yaitu menit, jam, tanggal, bulan, dan hari untuk jadwal 30 2 * * *, beserta contoh jadwal lain
Lima kolom jadwal cron yaitu menit, jam, tanggal, bulan, dan hari untuk jadwal 30 2 * * *, beserta contoh jadwal lain

Tambahkan baris berikut di crontab -e:

# jalankan pemeriksaan setiap hari pukul 02.30, catat juga kalau ada error
30 2 * * * /home/budi/cek_harian.sh >> /home/budi/laporan-keamanan/cron.log 2>&1

Sekarang alurnya lengkap: cron menjalankan skrip, skrip memeriksa, lalu laporan tersimpan setiap hari.

Alur proyek: cron menjalankan skrip pukul 02.30, skrip memeriksa login SSH gagal, disk, dan layanan, lalu menulis laporan bertanggal
Alur proyek: cron menjalankan skrip pukul 02.30, skrip memeriksa login SSH gagal, disk, dan layanan, lalu menulis laporan bertanggal
Kesalahan umum saat memakai cron
MasalahPenyebabSolusi
Skrip jalan manual, tapi tidak jalan lewat cronCron memakai lingkungan yang sangat minim, termasuk PATH yang pendekTulis jalur lengkap skrip dan perintah di dalamnya
Tidak tahu apakah cron sudah berjalanKeluaran cron tidak tampil di layarAlihkan keluaran ke file log dengan >> file.log 2>&1
Jamnya melesetZona waktu server berbeda, misalnya UTCCek dengan timedatectl
Permission deniedSkrip belum diberi izin jalankanchmod +x pada skripnya

Bash atau Python?

Kapan memakai Bash dan kapan memakai Python
Pakai Bash kalauPakai Python kalau
Tugasnya merangkai perintah Linux yang sudah adaLogikanya rumit, misalnya banyak kondisi bertingkat
Skripnya pendek, kurang dari puluhan barisPerlu mengolah JSON, API, atau struktur data
Harus jalan di server tanpa memasang apa punPerlu dipakai di Windows, macOS, dan Linux
Mengelola file, layanan, dan jadwalPerlu pustaka seperti requests atau regex yang kompleks

Kenapa ini penting untuk keamanan siber

Banyak pekerjaan keamanan berulang setiap hari: memeriksa log, memastikan layanan berjalan, mencadangkan konfigurasi, dan mengecek perubahan file penting. Bash dan cron membuat semua itu berjalan sendiri. Di sisi lain, skrip Bash dan jadwal cron adalah tempat favorit penyerang menyembunyikan aksinya, sehingga kemampuan membacanya sangat penting saat menangani insiden.

Ringkasan

  • Skrip Bash diawali shebang #!/usr/bin/env bash dan perlu chmod +x agar bisa dijalankan.
  • Variabel ditulis tanpa spasi di sekitar =, dan selalu dipakai dengan kutip ganda: "$var".
  • [[ ]] untuk memeriksa teks dan file, (( )) untuk angka.
  • for untuk daftar, while read -r untuk membaca file baris demi baris.
  • Pipe | merangkai perintah, redirect >, >>, dan 2> mengalirkan keluaran ke file.
  • Cron menjalankan skrip sesuai jadwal lima kolom: menit, jam, tanggal, bulan, dan hari.
  • Cron juga dipakai penyerang untuk bertahan di server, jadi periksa jadwalnya secara berkala.

Tonton dan baca juga

Materi berikutnya adalah penutup modul scripting: membuat alat keamanan kecil sendiri, seperti port scanner, log parser, dan file encryptor. Buka di roadmap untuk melanjutkan.

Bermanfaat? Dukung konten berikutnya

Semua materi di sini gratis. Dukunganmu dipakai untuk membeli alat lab untuk praktik, eksplorasi, dan riset konten keamanan siber berikutnya.

Traktir di Trakteer ↗
Sampul course Cyber Security Fundamental

Pelajari lebih dalam

Cyber Security Fundamental di WPU Course

Lihat course ↗

Materi terkait di roadmap

Artikel lainnya

Artikel ini bersifat edukatif. Praktikkan teknik ofensif hanya di lingkungan yang kamu miliki izinnya. Baca Disclaimer.