Administrator mesin headless menghabiskan sebagian hari kerjanya di dalam sesi SSH: masuk, keluar, masuk lagi ke mesin yang sama. Chapter ssh dan scp sudah memperkenalkan perintah dasarnya, tetapi mengetik ssh -p 2222 [email protected] dua puluh kali sehari adalah undangan salah ketik dan lupa port. Chapter ini memperdalam sisi klien: berkas konfigurasi ~/.ssh/config yang menjadikan setiap mesin cukup dipanggil namanya, pemakaian banyak kunci untuk banyak peran, lompatan lewat mesin perantara, pembagian satu koneksi untuk banyak sesi, dan pintu darurat ketika koneksi macet. Semua berkas yang dibedah di sini kita bangun sungguhan di sandbox, karena pola teksnya persis seperti yang dibaca ssh di komputer nyata.

Rekap Singkat: Menyambung ke Mesin Jauh #

Tiga bentuk dari chapter sebelumnya masih menjadi tulang punggung: ssh [email protected] masuk sebagai user tertentu, ssh -p 2222 budi@server-kantor memakai port non-standar, dan ssh budi@server-kantor 'df -h /srv' menjalankan satu perintah lalu langsung putus — bentuk terakhir ini adalah pola favorit skrip. Masalahnya muncul ketika parameter tumbuh: user berbeda, port berbeda, kunci berbeda untuk tiap mesin, dan salah satu mesin hanya bisa dicapai lewat mesin lain. Semua parameter itu sebenarnya punya tempat resmi untuk disimpan — bukan di ingatan kita, melainkan di berkas konfigurasi klien.

~/.ssh/config: Buku Alamat Mesin Jauh #

Berkas ~/.ssh/config adalah daftar profil mesin: tiap blok dimulai kata kunci Host diikuti nama panggilan, dan baris-baris di bawahnya menyimpan parameter mesin tersebut. Ketika kita mengetik ssh backup, klien mencari blok Host backup, lalu menggabungkan user, port, dan kunci dari blok itu — perintah panjang menyusut menjadi satu kata. Karena lingkungan latihan tidak memiliki klien ssh, kita membangun berkasnya dan memeriksa hasilnya langsung; formatnya inilah yang dibaca klien SSH sungguhan. Penulisannya dirangkum skrip pendukung buat-config.sh yang tercantum di bagian bawah halaman, sehingga setiap blok latihan tinggal memanggilnya ulang:

bash
bash buat-config.sh
cat ~/.ssh/config

Output yang Dihasilkan:

text
Host server-kantor
    HostName 192.0.2.10
    User budi
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Host backup
    HostName 198.51.100.20
    User siti
    IdentityFile ~/.ssh/id_backup
    ProxyJump server-kantor

Host pi-arsip
    HostName 192.0.2.20
    User budi
    IdentityFile ~/.ssh/id_ed25519

Host *
    ServerAliveInterval 60

Mari kita bedah isi berkas itu baris demi baris:

  1. Host server-kantor: nama panggilan yang kita ketik; sejak blok ini, ssh server-kantor cukup untuk masuk.
  2. HostName 192.0.2.10: alamat asli mesin yang dipetakan ke nama panggilan tersebut.
  3. User budi dan Port 2222: user dan port dipatok di berkas, sehingga baris perintah tidak perlu mengulangnya.
  4. IdentityFile ~/.ssh/id_ed25519: kunci privat khusus untuk mesin ini — mekanisme banyak kunci yang kita bahas setelah ini.
  5. ProxyJump server-kantor: koneksi ke backup diarahkan menembus server-kantor sebagai mesin perantara.
  6. Host *: pola bebas (wildcard) yang cocok dengan semua nama; ServerAliveInterval 60 menjadikannya pengaturan global — klien mengirim pesan keepalive tiap 60 detik agar koneksi lambat tidak putus diam-diam.
  7. chmod 700 ~/.ssh dan chmod 600 ~/.ssh/config di dalam skrip: hanya pemilik yang boleh menulis folder dan berkas ini; permission longgar membuat klien menolak memakainya.

Karena satu berkas menampung banyak mesin, pertanyaan alami berikutnya adalah “mesin apa saja yang sudah terdaftar?”. Jawabannya satu baris grep — dan ada satu jebakan kecil di dalamnya:

bash
bash buat-config.sh
grep '^Host ' ~/.ssh/config | awk '{print $2}'

Output yang Dihasilkan:

text
server-kantor
backup
pi-arsip
*
  1. grep '^Host ': menyaring baris yang diawali kata Host diikuti spasi — spasi itu penting, karena tanpanya baris HostName ikut tertangkap karena juga diawali tulisan Host.
  2. awk '{print $2}': dari tiap baris hasil saringan, awk mengambil kolom kedua — nama panggilannya.

Ketika klien ssh membaca berkas ini, prosesnya lebih canggih dari grep: alias dicocokkan dengan pola, lalu semua parameter digabungkan menjadi satu konfigurasi efektif. Perintah ssh -G backup menampilkan hasil penggabungan itu baris demi baris tanpa benar-benar menyambung — alat uji yang aman setelah mengubah konfigurasi. Kita bisa meniru intinya dengan awk: temukan blok yang cocok, lalu cetak parameternya:

bash
bash buat-config.sh
profil() {
  awk -v cari="$1" '
    $1 == "Host" { cocok = ($2 == cari); next }
    cocok && NF { print }
  ' ~/.ssh/config
}
profil backup

Output yang Dihasilkan:

text
    HostName 198.51.100.20
    User siti
    IdentityFile ~/.ssh/id_backup
    ProxyJump server-kantor
  1. awk -v cari="$1": nama alias yang dicari dikirim ke awk sebagai variabel cari — nilai itu berasal dari argumen pertama fungsi profil.
  2. $1 == "Host" { cocok = ($2 == cari); next }: setiap kali awk bertemu baris Host, penanda cocok dinyalakan bila aliasnya sama dengan yang dicari, lalu next membuat baris Host itu sendiri tidak ikut dicetak.
  3. cocok && NF: selama penanda menyala, semua baris berisi (NF lebih dari nol) dicetak — persis parameter yang akan dipakai klien untuk alias tersebut.
  4. profil backup: panggilan fungsi mencetak parameter milik backup: alamat 198.51.100.20, user siti, kunci id_backup, dan lompatan lewat server-kantor.

Banyak Kunci untuk Banyak Peran #

Fixture di atas memakai dua kunci berbeda: id_ed25519 untuk mesin milik pribadi, id_backup untuk mesin kerja. Pemisahan ini bukan gaya-gayaan — setiap kunci adalah identitas tersendiri, sehingga kunci yang bocor cukup dicabut dari server yang mempercainya tanpa menyentuh identitas lain. Pola yang umum: satu kunci untuk mesin pribadi, satu untuk kantor, satu lagi khusus otomasi (skrip yang berjalan tanpa manusia), dan penamaan berkas yang jujur seperti id_kerja membuat tujuan tiap kunci terbaca sekilas.

Tanpa diatur, klien SSH menawarkan semua kunci di ~/.ssh ke setiap server yang disambunginya. Perilaku itu membocorkan mesin mana saja yang kita punya aksesnya, dan bisa membuat server menolak login karena terlalu banyak percobaan kunci yang salah. Menambahkan IdentitiesOnly yes pada blok Host memaksa klien hanya menawarkan kunci yang tercantum di IdentityFile blok itu — opsi kecil yang menyembunyikan daftar kunci kita sekaligus membuat percobaan autentikasi lebih deterministik.

Satu Koneksi, Banyak Sesi: ControlMaster #

Handshake SSH — negosiasi enkripsi, verifikasi kunci host, autentikasi — berlangsung sekian ratus milidetik, dan pada tautan lambat bisa terasa lama. Fitur multiplexing menjawabnya: koneksi pertama membuka “koneksi induk”, lalu sesi-sesi ssh berikutnya ke mesin yang sama menumpang induk itu tanpa mengulang handshake. Pengaturannya cukup tiga baris di ~/.ssh/config:

ini
Host *
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h-%p
    ControlPersist 10m

Baris ControlMaster auto membuat sesi pertama menjadi induk bila belum ada; ControlPath menentukan berkas socket komunikasi antar sesi, dengan token %r (user jauh), %h (host), dan %p (port) agar tiap kombinasi tujuan punya socket sendiri; ControlPersist 10m menjaga induk tetap hidup sepuluh menit setelah sesi terakhir ditutup, sehingga login berikutnya dalam jeda itu terasa seketika. Efek sampingnya perlu dipahami: memutus sesi induk berarti memutus semua sesi yang menumpang, dan kunci yang sudah dibuka di induk ikut tersedia untuk sesi lain di mesin yang sama.

Pintu Darurat: Escape Sequence #

Sesi SSH yang macet — server tidak menjawab, jaringan putus diam-diam — membuat terminal terasa membeku: Ctrl+C diketik di lokal, bukan di mesin jauh. Klien SSH menyediakan tombol darurat berupa escape sequence: karakter ~ yang diketik di awal baris baru. Yang paling sering dipakai adalah ~. untuk memutus koneksi paksa, ~^Z untuk menangguhkan sementara, ~# untuk melihat daftar koneksi yang menumpang pada ControlMaster, dan ~? untuk daftar lengkapnya. Berikut contoh tampilan daftar tersebut di tengah sesi:

console
budi@pi-arsip:~$ ~?
Supported escape sequences:
 ~.   Terminate connection (and any multiplexed sessions)
 ~B   Send a BREAK to the remote system
 ~C   Open a command line
 ~R   Request rekey
 ~V/v Decrease/Increase verbosity (LogLevel)
 ~^Z  Suspend ssh
 ~#   List forwarded connections
 ~&   Background ssh (when waiting for connections to terminate)
 ~?   This message
 ~~   Send the escape character by typing "~"

Urutan ~ hanya dikenali bila berada tepat setelah baris baru — tekan Enter dulu, baru ketik ~.. Untuk mengirim karakter ~ sungguhan ke mesin jauh (misalnya di dalam editor), ketik ~~.

Seluruh perhatian kita sejauh ini tertuju pada satu sisi autentikasi: kunci privat yang disebut IdentityFile. Chapter berikutnya membedah benda itu sendiri — bagaimana pasangan kunci dibuat, mengapa kunci privat sebaiknya dikunci passphrase, dan bagaimana ssh-agent membuat kunci terkunci itu tetap nyaman dipakai.

Referensi lanjut: ssh_config(5) untuk kamus lengkap semua kata kunci berkas konfigurasi, ssh(1) untuk escape sequence dan opsi ControlMaster, serta OpenSSH sebagai sumber utamanya.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

buat-config.sh

Unduh berkas
bash
#!/usr/bin/env bash
# buat-config.sh — bangun ulang ~/.ssh/config contoh untuk blok latihan.
# Dipanggil di awal tiap blok karena setiap blok latihan berdiri sendiri.
set -e
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat > ~/.ssh/config <<'EOF'
Host server-kantor
    HostName 192.0.2.10
    User budi
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Host backup
    HostName 198.51.100.20
    User siti
    IdentityFile ~/.ssh/id_backup
    ProxyJump server-kantor

Host pi-arsip
    HostName 192.0.2.20
    User budi
    IdentityFile ~/.ssh/id_ed25519

Host *
    ServerAliveInterval 60
EOF
chmod 600 ~/.ssh/config