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 buat-config.sh
cat ~/.ssh/configOutput yang Dihasilkan:
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 60Mari kita bedah isi berkas itu baris demi baris:
Host server-kantor: nama panggilan yang kita ketik; sejak blok ini,ssh server-kantorcukup untuk masuk.HostName 192.0.2.10: alamat asli mesin yang dipetakan ke nama panggilan tersebut.User budidanPort 2222: user dan port dipatok di berkas, sehingga baris perintah tidak perlu mengulangnya.IdentityFile ~/.ssh/id_ed25519: kunci privat khusus untuk mesin ini — mekanisme banyak kunci yang kita bahas setelah ini.ProxyJump server-kantor: koneksi kebackupdiarahkan menembusserver-kantorsebagai mesin perantara.Host *: pola bebas (wildcard) yang cocok dengan semua nama;ServerAliveInterval 60menjadikannya pengaturan global — klien mengirim pesan keepalive tiap 60 detik agar koneksi lambat tidak putus diam-diam.chmod 700 ~/.sshdanchmod 600 ~/.ssh/configdi 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 buat-config.sh
grep '^Host ' ~/.ssh/config | awk '{print $2}'Output yang Dihasilkan:
server-kantor
backup
pi-arsip
*grep '^Host ': menyaring baris yang diawali kataHostdiikuti spasi — spasi itu penting, karena tanpanya barisHostNameikut tertangkap karena juga diawali tulisanHost.awk '{print $2}': dari tiap baris hasil saringan,awkmengambil 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 buat-config.sh
profil() {
awk -v cari="$1" '
$1 == "Host" { cocok = ($2 == cari); next }
cocok && NF { print }
' ~/.ssh/config
}
profil backupOutput yang Dihasilkan:
HostName 198.51.100.20
User siti
IdentityFile ~/.ssh/id_backup
ProxyJump server-kantorawk -v cari="$1": nama alias yang dicari dikirim keawksebagai variabelcari— nilai itu berasal dari argumen pertama fungsiprofil.$1 == "Host" { cocok = ($2 == cari); next }: setiap kaliawkbertemu barisHost, penandacocokdinyalakan bila aliasnya sama dengan yang dicari, lalunextmembuat barisHostitu sendiri tidak ikut dicetak.cocok && NF: selama penanda menyala, semua baris berisi (NF lebih dari nol) dicetak — persis parameter yang akan dipakai klien untuk alias tersebut.profil backup: panggilan fungsi mencetak parameter milikbackup: alamat198.51.100.20, usersiti, kunciid_backup, dan lompatan lewatserver-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:
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h-%p
ControlPersist 10mBaris 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:
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#!/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