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
=. Tulisannama = "budi"akan dianggap menjalankan perintah bernamanama. - 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 | Isinya |
|---|---|
$1, $2, ... | Argumen pertama, kedua, dan seterusnya |
$# | Jumlah argumen |
$? | Kode keluar perintah terakhir: 0 berarti berhasil, selain itu gagal |
$HOME, $USER | Folder 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 | Benar 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.

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 pipefailmembuat 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 seperti2026-11-05, sehingga setiap hari punya file laporan sendiri.systemctl is-active --quietmemeriksa status layanan tanpa menampilkan apa pun, cukup dari kode keluarnya, seperti yang kamu kenal di artikel Proses di Linux. Di keluarga Red Hat, nama layanannyasshddancrond.
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

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.

| Masalah | Penyebab | Solusi |
|---|---|---|
| Skrip jalan manual, tapi tidak jalan lewat cron | Cron memakai lingkungan yang sangat minim, termasuk PATH yang pendek | Tulis jalur lengkap skrip dan perintah di dalamnya |
| Tidak tahu apakah cron sudah berjalan | Keluaran cron tidak tampil di layar | Alihkan keluaran ke file log dengan >> file.log 2>&1 |
| Jamnya meleset | Zona waktu server berbeda, misalnya UTC | Cek dengan timedatectl |
| Permission denied | Skrip belum diberi izin jalankan | chmod +x pada skripnya |
Bash atau Python?
| Pakai Bash kalau | Pakai Python kalau |
|---|---|
| Tugasnya merangkai perintah Linux yang sudah ada | Logikanya rumit, misalnya banyak kondisi bertingkat |
| Skripnya pendek, kurang dari puluhan baris | Perlu mengolah JSON, API, atau struktur data |
| Harus jalan di server tanpa memasang apa pun | Perlu dipakai di Windows, macOS, dan Linux |
| Mengelola file, layanan, dan jadwal | Perlu 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 bashdan perluchmod +xagar bisa dijalankan. - Variabel ditulis tanpa spasi di sekitar
=, dan selalu dipakai dengan kutip ganda:"$var". [[ ]]untuk memeriksa teks dan file,(( ))untuk angka.foruntuk daftar,while read -runtuk membaca file baris demi baris.- Pipe
|merangkai perintah, redirect>,>>, dan2>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
- Video: Bash dan Cron Job
- Artikel: 6 tips sebelum menulis cron job Bash (bahasa Inggris)
- crontab.guru: menerjemahkan jadwal cron ke bahasa manusia
Materi berikutnya adalah penutup modul scripting: membuat alat keamanan kecil sendiri, seperti port scanner, log parser, dan file encryptor. Buka di roadmap untuk melanjutkan.