Skip to content

Command-line Environment - seri Missing Semester

Updated: at 02.05

Dalam artikel kali ini, kita akan membahas beberapa cara untuk meningkatkan flow kerja Kita saat menggunakan shell. Kita telah menggunakan shell untuk beberapa waktu, tetapi kita hanya berfokus pada menjalankan perintah yang berbeda. Sekarang, kita akan mencoba bagaimana menjalankan beberapa proses secara bersamaan sambil melacaknya :

Kita akan mempelajari beberapa metode untuk mengoptimalkan shell dan tools lainnya, seperti:

  1. Mendefinisikan alias (nama singkatan) untuk perintah yang sering digunakan. Ini membantu menghemat waktu pengetikan.

  2. Menggunakan dotfiles untuk mengkonfigurasi pengaturan shell di semua mesin yang kita gunakan. Dengan cara ini, kita tidak perlu mengetik ulang perintah yang panjang di setiap mesin.

  3. Bekerja dengan mesin jarak jauh menggunakan SSH (Secure Shell). Ini memungkinkan kita untuk mengakses dan mengelola server atau komputer lain dari jarak jauh dengan aman.

Melalui teknik-teknik ini, kita dapat meningkatkan efisiensi dalam menggunakan shell dan menyederhanakan pekerjaan kita saat berurusan dengan banyak mesin atau server.

Kontrol Pekerjaan

Dalam beberapa situasi, kita mungkin perlu menghentikan pekerjaan yang sedang berjalan di komputer, misalnya jika suatu perintah membutuhkan waktu terlalu lama untuk selesai (seperti perintah find pada struktur direktori yang sangat besar). Biasanya, kita dapat menggunakan Ctrl-C untuk menghentikan perintah tersebut. Namun, bagaimana sebenarnya Ctrl-C ini bekerja dan mengapa terkadang gagal menghentikan proses?

Menghentikan Proses Shell

Sinyal adalah mekanisme komunikasi UNIX untuk menyampaikan informasi ke proses. Saat proses menerima sinyal, ia menghentikan eksekusi, menangani sinyal, dan mungkin mengubah aliran eksekusi berdasarkan informasi dari sinyal tersebut.

Sinyal merupakan interupsi perangkat lunak. Ketika mengetik Ctrl-C, shell mengirimkan sinyal SIGINT ke proses. Berikut adalah contoh program Python sederhana yang menangkap SIGINT dan mengabaikannya, sehingga tidak berhenti. Untuk menghentikan program ini, gunakan sinyal SIGQUIT dengan mengetik Ctrl-\.

##!/usr/bin/env python
import signal, time

def handler(signum, time):
    print("\nSaya mendapat SIGINT, tetapi saya tidak berhenti")

signal.signal(signal.SIGINT, handler)

i = 0
while True:
    time.sleep(.1)
    print("\r{}".format(i), end="")
    i += 1

Berikut adalah hasil saat mengirim SIGINT dua kali ke program ini, diikuti dengan SIGQUIT. Perhatikan bahwa ^ menunjukkan Ctrl saat diketik di terminal.

$ python sigint.py
24^C
Saya mendapat SIGINT, tetapi saya tidak berhenti
26^C
Saya mendapat SIGINT, tetapi saya tidak berhenti
30^\
[1] 39913 berhenti python sigint.py

Meskipun SIGINT dan SIGQUIT biasanya terkait dengan permintaan terminal, sinyal yang lebih umum untuk meminta proses keluar dengan anggun adalah SIGTERM. Untuk mengirim sinyal ini, gunakan perintah kill dengan sintaks kill -TERM <PID>.

Menjeda dan Menjalankan Proses di Latar Belakang

Sinyal dapat melakukan hal lain selain menghentikan proses. Misalnya, SIGSTOP menjeda proses. Di terminal, mengetik Ctrl-Z akan mendorong shell untuk mengirim sinyal SIGTSTP, singkatan dari Terminal Stop (yaitu versi terminal dari SIGSTOP).

Kita kemudian dapat melanjutkan pekerjaan yang dijeda di latar depan atau di latar belakang menggunakan fg atau bg.

Perintah jobs mencantumkan pekerjaan yang belum selesai yang terkait dengan sesi terminal saat ini. Kita dapat merujuk ke pekerjaan tersebut menggunakan PID-nya (Kita dapat menggunakan pgrep untuk mengetahuinya) atau lebih intuitif menggunakan simbol persen diikuti dengan nomor pekerjaan yang ditampilkan oleh jobs. Untuk merujuk ke pekerjaan terakhir yang dijalankan di latar belakang, Kita dapat menggunakan parameter khusus $!.

Perlu diketahui bahwa akhiran & dalam perintah akan menjalankan perintah di latar belakang, meskipun perintah tersebut akan tetap menggunakan STDOUT shell yang dapat mengganggu (gunakan pengalihan shell dalam kasus ini).

Untuk menjalankan program yang sudah berjalan di latar belakang, Kita dapat melakukan Ctrl-Z diikuti dengan bg. Proses latar belakang masih merupakan proses anak dari terminal Kita dan akan mati jika Kita menutup terminal (ini akan mengirim sinyal SIGHUP). Untuk mencegah hal itu terjadi, Kita dapat menjalankan program dengan nohup (pembungkus untuk mengabaikan SIGHUP), atau menggunakan disown jika proses sudah dimulai. Alternatif lainnya adalah menggunakan multiplexer terminal seperti yang akan kita lihat di bagian selanjutnya.

Di bawah ini adalah sesi contoh untuk menunjukkan beberapa konsep ini.

$ sleep 1000
^Z
[1] + 18653 terhenti sleep 1000

$ nohup sleep 2000 &
[2] 18745
menambahkan output ke nohup.out

$ jobs
[1] + terhenti sleep 1000
[2] - berjalan nohup sleep 2000

$ bg %1
[1] - 18653 dilanjutkan sleep 1000

$ jobs
[1] - berjalan sleep 1000
[2] + berjalan nohup sleep 2000

$ kill -STOP %1
[1] + 18653 terhenti (sinyal) sleep 1000

$ jobs
[1] + terhenti (sinyal) sleep 1000
[2] - berjalan nohup sleep 2000

$ kill -SIGHUP %1
[1] + 18653 hangup sleep 1000

$ jobs
[2] + berjalan nohup sleep 2000

$ kill -SIGHUP %2

$ jobs
[2] + berjalan nohup sleep 2000

$ kill %2
[2] + 18745 dihentikan nohup sleep 2000

$ jobs

SIGKILL merupakan sinyal khusus karena tidak dapat ditangkap oleh proses dan akan selalu menghentikannya dengan segera. Namun, sinyal ini dapat memiliki efek samping seperti meninggalkan proses anak yang terlantar. Kita dapat mempelajari lebih lanjut tentang sinyal-sinyal ini dan lainnya di sini atau dengan mengetik man signal atau kill -l.

Multiplexer Terminal

Saat menggunakan antarmuka baris perintah, kita sering kali ingin menjalankan lebih dari satu hal sekaligus, misalnya menjalankan editor dan program secara berdampingan. Meskipun hal ini dapat dicapai dengan membuka jendela terminal baru, menggunakan multiplexer terminal merupakan solusi yang lebih serbaguna.

Multiplexer terminal seperti tmux memungkinkan kita untuk melakukan multiplexing jendela terminal menggunakan panel dan tab sehingga kita dapat berinteraksi dengan beberapa sesi shell. Selain itu, multiplexer terminal juga memungkinkan kita melepaskan sesi terminal saat ini dan menempelkannya kembali pada suatu saat nanti.

Hal ini dapat membuat alur kerja kita jauh lebih baik saat bekerja dengan mesin jarak jauh karena menghindari kebutuhan untuk menggunakan nohup dan trik serupa. Multiplexer terminal yang paling populer saat ini adalah tmux, yang sangat dapat diatur dan dengan menggunakan tombol pengikat yang terkait, kita dapat membuat beberapa tab dan panel serta menavigasi melaluinya dengan cepat.

tmux mengharapkan Kita untuk mengetahui tombol shortcutnya, dan semuanya memiliki bentuk <C-b> x yang berarti

  1. tekan Ctrl+b,
  2. lepaskan Ctrl+b
  3. lalu, ketik x.

Tmux memiliki hierarki objek berikut:

Untuk bacaan lebih lanjut, di sini adalah tutorial cepat tentang tmux dan ini memiliki penjelasan yang lebih rinci yang mencakup perintah screen asli. Kita mungkin juga ingin membiasakan diri dengan screen, karena ia muncul terpasang di sebagian besar sistem UNIX.

Alias

Bisa menjadi melelahkan mengetik perintah panjang yang melibatkan banyak flag atau opsi yang bertele-tele. Untuk alasan ini, sebagian besar shell mendukung aliasing. Alias shell adalah bentuk singkat untuk perintah lain yang akan diganti secara otomatis oleh shell untuk kita. Misalnya, alias dalam Bash memiliki struktur berikut:

alias alias_name="command_to_alias arg1 arg2"

Perhatikan bahwa tidak ada spasi di sekitar tKita sama dengan =, karena alias adalah perintah shell yang mengambil satu argumen.

Alias memiliki banyak fitur yang nyaman:

## Membuat pintasan untuk flag umum
alias ll="ls -lh"

## Menghemat banyak pengetikan untuk perintah umum
alias gs="git status"
alias gc="git commit"
alias v="vim"

## Menyelamatkan kita dari salah ketik
alias sl=ls

## Menimpa perintah yang ada untuk default yang lebih baik
alias mv="mv -i" # -i meminta konfirmasi sebelum menimpa file yang sudah ada di direktori tujuan
alias mkdir="mkdir -p" # -p memungkinkan pembuatan direktori induk jika belum ada
alias df="df -h" # Opsi -h pada perintah df (yang digunakan untuk memeriksa penggunaan disk) menampilkan ukuran dalam format yang mudah dibaca manusia, seperti "1K", "2M", "3G", dll.,

## Alias dapat disusun
alias la="ls -A"
alias lla="la -l"

## Untuk mengabaikan alias, jalankan dengan awalan \
\ls
## Atau nonaktifkan alias sama sekali dengan unalias
unalias la

## Untuk mendapatkan definisi alias, cukup panggil dengan alias
alias ll
## Akan mencetak ll='ls -lh'

⚠️ Warning

Perhatikan bahwa alias tidak bertahan di sesi shell secara default. Untuk membuat alias persisten, Kita perlu menyertakannya dalam file startup shell, seperti .bashrc atau .zshrc, yang akan kita perkenalkan di bagian selanjutnya.

Dotfiles

Banyak program diatur menggunakan file teks biasa yang dikenal sebagai dotfiles (karena nama file dimulai dengan ., misalnya ~/.vimrc, sehingga tersembunyi dalam daftar direktori ls secara default).

Shell adalah salah satu contoh program yang diatur dengan file tersebut. Pada startup, shell Kita akan membaca banyak file untuk memuat konfigurasinya. Tergantung pada shell, apakah Kita memulai login dan/atau interaktif, seluruh proses dapat menjadi cukup kompleks. Ini adalah sumber daya yang sangat baik tentang topik ini.

Untuk bash, mengedit .bashrc atau .bash_profile akan berfungsi di sebagian besar sistem. Di sini Kita dapat menyertakan perintah yang ingin Kita jalankan pada startup, seperti alias yang baru saja kami jelaskan atau modifikasi pada variabel lingkungan PATH Kita. Sebenarnya, banyak program akan meminta Kita untuk menyertakan baris seperti export PATH="$PATH:/path/to/program/bin" dalam file konfigurasi shell Kita sehingga biner mereka dapat ditemukan.

Beberapa contoh lain dari alat yang dapat diatur melalui dotfiles adalah:

Bagaimana seharusnya Kita mengatur dotfiles kita? Mereka harus berada di folder mereka sendiri, di bawah version control, dan symlinked ke tempatnya menggunakan skrip. Manfaat dari semua ini adalah:

Apa yang harus Kita masukkan dalam dotfiles Anda? Kita dapat mempelajari tentang pengaturan alat Kita dengan membaca dokumentasi online atau halaman manual.

Cara lain yang bagus adalah mencari di internet postingan blog tentang program tertentu, di mana penulis akan memberi tahu Kita tentang kustomisasi pilihan mereka.

Cara lain untuk mempelajari tentang kustomisasi adalah dengan melihat dotfiles orang lain: Kita dapat menemukan banyak repositori dotfiles di Github --- lihat yang paling populer di sini (kami sarankan Kita untuk tidak menyalin konfigurasi secara membabi buta). Ini adalah sumber daya bagus lainnya tentang topik ini.

Semua instruktur kelas memiliki dotfiles mereka yang dapat diakses publik di GitHub: Anish, Jon, Jose.

Portabilitas

Masalah umum dengan dotfiles adalah konfigurasi yang mungkin tidak berfungsi saat bekerja dengan beberapa mesin, misalnya jika mereka memiliki sistem operasi atau shell yang berbeda. Terkadang kita juga menginginkan beberapa konfigurasi untuk diterapkan hanya pada mesin tertentu. Ada beberapa trik untuk mempermudah ini. Jika file konfigurasi mendukungnya, gunakan pernyataan if untuk menerapkan kustomisasi khusus mesin. Misalnya, shell kita dapat memiliki sesuatu seperti:

if [[ "$(uname)" == "Linux" ]]; then
    {lakukan_sesuatu};
fi

## Periksa sebelum menggunakan fitur khusus shell
if [[ "$SHELL" == "zsh" ]]; then
    {lakukan_sesuatu};
fi

## Kita juga dapat membuatnya khusus mesin
if [[ "$(hostname)" == "myServer" ]]; then
    {lakukan_sesuatu};
fi

Jika file konfigurasi mendukungnya, manfaatkan include. Misalnya, ~/.gitconfig dapat memiliki pengaturan:

[include]
    path = ~/.gitconfig_local

Dan kemudian pada setiap mesin, ~/.gitconfig_local dapat berisi pengaturan khusus mesin. Kita bahkan dapat melacaknya dalam repositori terpisah untuk pengaturan khusus mesin. Ide ini juga berguna jika kita ingin program yang berbeda berbagi beberapa konfigurasi. Misalnya, jika kita ingin bash dan zsh berbagi set alias yang sama, kita dapat menulisnya di bawah .aliases dan memiliki blok berikut di keduanya:

## Uji apakah ~/.aliases ada dan sumberkan
if [ -f ~/.aliases ]; then
    source ~/.aliases
fi

Mesin Jarak Jauh

Semakin umum bagi pemrogram untuk menggunakan server jarak jauh dalam pekerjaan sehari-hari mereka. Jika kita perlu menggunakan server jarak jauh untuk menyebarkan perangkat lunak backend atau memerlukan server dengan kemampuan komputasi yang lebih tinggi, kita akan menggunakan Secure Shell (SSH). Seperti kebanyakan alat yang dibahas, SSH sangat dapat diatur sehingga layak untuk dipelajari. Untuk ssh ke server, kita menjalankan perintah sebagai berikut:

ssh [email protected]

Di sini kita mencoba ssh sebagai pengguna foo di server bar.mit.edu. Server dapat ditentukan dengan URL (seperti bar.mit.edu) atau IP (seperti [email protected]). Nanti kita akan melihat bahwa jika kita memodifikasi file konfigurasi ssh, kita dapat mengakses hanya dengan menggunakan sesuatu seperti ssh bar.

Menjalankan Perintah

Fitur ssh yang sering diabaikan adalah kemampuan untuk menjalankan perintah secara langsung. ssh foobar@server ls akan menjalankan ls di folder home foobar. Ini bekerja dengan pipe, jadi ssh foobar@server ls | grep PATTERN akan grep secara lokal output ls jarak jauh dan ls | ssh foobar@server grep PATTERN akan grep secara jarak jauh output lokal ls.

Kunci SSH

Otentikasi berbasis kunci memanfaatkan kriptografi kunci publik untuk membuktikan kepada server bahwa klien memiliki kunci pribadi rahasia tanpa mengungkapkan kunci tersebut. Dengan cara ini, kita tidak perlu memasukkan kata sandi setiap kali. Namun demikian, kunci pribadi (seringkali ~/.ssh/id_rsa dan lebih baru-baru ini ~/.ssh/id_ed25519) secara efektif adalah kata sandi kita, jadi perlakukan seperti itu.

Pembuatan Kunci

Untuk menghasilkan sepasang, Kita dapat menjalankan ssh-keygen.

ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519

Kita harus memilih frasa sandi, untuk menghindari seseorang yang mendapatkan kunci pribadi Kita untuk mengakses server yang diizinkan. Gunakan ssh-agent atau gpg-agent sehingga Kita tidak harus mengetik frasa sandi setiap kali.

Jika Kita pernah mengonfigurasi push ke GitHub menggunakan kunci SSH, maka Kita mungkin telah melakukan langkah-langkah yang diuraikan di sini dan telah memiliki sepasang kunci yang valid. Untuk memeriksa apakah Kita memiliki frasa sandi dan memvalidasinya, Kita dapat menjalankan ssh-keygen -y -f /path/to/key.

Otentikasi Berbasis Kunci

ssh akan memeriksa .ssh/authorized_keys untuk menentukan klien mana yang diizinkan masuk. Untuk menyalin kunci publik, kita dapat menggunakan:

cat .ssh/id_ed25519.pub | ssh foobar@remote 'cat >> ~/.ssh/authorized_keys'

Solusi yang lebih sederhana dapat dicapai dengan ssh-copy-id jika tersedia:

ssh-copy-id -i .ssh/id_ed25519 foobar@remote

Menyalin File melalui SSH

Ada banyak cara untuk menyalin file melalui ssh:

Port Forwarding

Dalam banyak skenario, kita akan menemukan perangkat lunak yang mendengarkan port tertentu di mesin. Ketika ini terjadi di mesin lokal, kita dapat mengetik localhost:PORT atau 127.0.0.1:PORT, tapi bagaimana jika di server remote yang tidak memiliki port yang terbuka secara langsung melalui jaringan/internet?

Solusinya adalah port forwarding yang ada dalam dua varian: Local Port Forwarding dan Remote Port Forwarding (lihat gambar untuk detail lebih lanjut, kredit gambar dari postingan StackOverflow ini).

Local Port Forwarding Local Port Forwarding

Remote Port Forwarding Remote Port Forwarding

Skenario yang paling umum adalah local port forwarding, di mana service di mesin remote mendengarkan port dan kita ingin memetakan port di mesin lokal kita untuk meneruskan ke port remote. Misalnya, jika kita menjalankan jupyter notebook di server remote yang mendengarkan port 8888. Jadi, untuk meneruskannya ke port lokal 9999, kita akan melakukan ssh -L 9999:localhost:8888 foobar@remote_server lalu mengakses localhost:9999 di mesin lokal.

Konfigurasi SSH

Kita telah membahas banyak argumen yang dapat diberikan. Alternatif yang menggoda adalah membuat alias shell seperti:

alias my_server="ssh -i ~/.id_ed25519 --port 2222 -L 9999:localhost:8888 foobar@remote_server

Namun, ada alternatif yang lebih baik yaitu menggunakan ~/.ssh/config.

Host vm
    User foobar
    HostName 172.16.174.141
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    LocalForward 9999 localhost:8888

## Konfigurasi juga dapat menggunakan wildcard
Host *.mit.edu
    User foobaz

Keuntungan tambahan menggunakan file ~/.ssh/config daripada alias adalah program lain seperti scp, rsync, mosh, dll juga dapat membacanya dan menyesuaikan pengaturan menjadi opsi yang sesuai.

Perlu diingat bahwa file ~/.ssh/config dapat dianggap sebagai dotfile, dan umumnya aman untuk disertakan dengan dotfiles lainnya. Namun, jika kita membuatnya publik, perhatikan informasi yang mungkin kita berikan kepada orang asing di internet: alamat server, user, port yang terbuka, dll. Ini dapat memfasilitasi beberapa jenis serangan, jadi berhati-hatilah saat membagikan konfigurasi SSH.

Konfigurasi sisi server biasanya ditentukan di /etc/ssh/sshd_config. Di sini kita dapat mengubah pengaturan seperti menonaktifkan otentikasi password, mengubah port ssh, mengaktifkan X11 forwarding, dll. Kita juga dapat menentukan pengaturan konfigurasi per-user.

Lain-lain

Masalah umum saat terhubung ke server remote adalah terputus karena komputer mati, tertidur, atau berganti jaringan. Selain itu, jika seseorang memiliki koneksi dengan lag yang signifikan, menggunakan ssh dapat cukup membuat frustrasi. Mosh, mobile shell, meningkatkan ssh dengan memungkinkan koneksi roaming, konektivitas terputus-sambung, dan memberikan local echo yang cerdas. Terkadang lebih nyaman untuk memasang folder remote secara lokal. sshfs dapat memasang folder di server remote secara lokal, sehingga kita dapat menggunakan editor lokal.

Shell & Framework

Dalam pembahasan tentang alat shell dan scripting, kami membahas shell bash karena itu adalah shell yang paling banyak digunakan dan sebagian besar sistem menggunakannya secara default. Namun, itu bukan satu-satunya pilihan. Misalnya, shell zsh adalah superset dari bash dan menyediakan banyak fitur yang nyaman secara bawaan seperti:

Framework juga dapat meningkatkan shell Anda. Beberapa framework umum yang populer adalah prezto atau oh-my-zsh, dan yang lebih kecil yang berfokus pada fitur tertentu seperti zsh-syntax-highlighting atau zsh-history-substring-search. Shell seperti fish menyertakan banyak fitur ramah pengguna ini secara default. Beberapa fitur ini meliputi:

Satu hal yang perlu diperhatikan saat menggunakan framework ini adalah mereka dapat memperlambat shell, terutama jika kode yang mereka jalankan tidak dioptimalkan dengan benar atau terlalu banyak. Kita selalu dapat memprofilnya dan menonaktifkan fitur yang tidak sering digunakan atau yang mengorbankan kecepatan.

Emulator Terminal

Selain menyesuaikan shell, ada baiknya meluangkan waktu untuk mencari tahu pilihan emulator terminal dan pengaturannya. Ada banyak sekali emulator terminal di luar sana (berikut adalah perbandingan). Karena kita mungkin menghabiskan ratusan hingga ribuan jam di terminal, sebaiknya melihat ke pengaturannya. Beberapa aspek yang mungkin ingin kita modifikasi di terminal meliputi:

Latihan

Kontrol Pekerjaan

  1. Dari yang telah kita lihat, kita dapat menggunakan kombinasi perintah ps aux | grep untuk mendapatkan pid pekerjaan dan kemudian menghentikannya, tetapi ada cara yang lebih baik untuk melakukannya. Mulai pekerjaan sleep 10000 di terminal, pindahkan ke latar belakang dengan Ctrl-Z dan lanjutkan eksekusinya dengan bg. Sekarang gunakan pgrep untuk menemukan pid-nya dan pkill untuk menghentikannya tanpa perlu mengetik pid secara manual. (Petunjuk: gunakan opsi -af).

  2. Misalkan kita tidak ingin memulai suatu proses sampai proses lain selesai. Bagaimana cara melakukannya? Dalam latihan ini, proses pembatas kita akan selalu sleep 60 &. Salah satu cara untuk mencapai ini adalah dengan menggunakan perintah wait. Cobalah menjalankan perintah sleep dan minta ls menunggu sampai proses latar belakang selesai.

    Namun, strategi ini akan gagal jika kita memulai di sesi bash yang berbeda, karena wait hanya berfungsi untuk proses anak. Satu fitur yang tidak kita bahas dalam catatan adalah bahwa status keluar perintah kill akan nol jika berhasil dan bukan nol jika tidak. kill -0 tidak mengirim sinyal tetapi akan memberikan status keluar bukan nol jika proses tidak ada. Tulis fungsi bash yang disebut pidwait yang menerima pid dan menunggu sampai proses yang diberikan selesai. Kita harus menggunakan sleep untuk menghindari pemborosan CPU yang tidak perlu.

Multiplexer Terminal

  1. Ikuti tutorial tmux ini dan kemudian pelajari cara melakukan beberapa kustomisasi dasar mengikuti langkah-langkah ini.

Alias

  1. Buat alias dc yang menyelesaikan cd ketika kita mengetiknya dengan salah.

  2. Jalankan history | awk '{$1="";print substr($0,2)}' | sort | uniq -c | sort -n | tail -n 10 untuk mendapatkan 10 perintah yang paling sering kita gunakan dan pertimbangkan untuk menulis alias yang lebih pendek untuk perintah-perintah tersebut. Catatan: ini berfungsi untuk Bash; jika kita menggunakan ZSH, gunakan history 1 alih-alih sekadar history.

Dotfiles

Mari kita persiapkan dotfiles kita.

  1. Buat folder untuk dotfiles dan atur version control.
  2. Tambahkan konfigurasi untuk setidaknya satu program, misalnya shell, dengan beberapa kustomisasi (untuk memulai, itu bisa sesederhana menyesuaikan prompt shell dengan mengatur $PS1).
  3. Siapkan metode untuk menginstal dotfiles dengan cepat (dan tanpa upaya manual) di mesin baru. Ini bisa sesederhana skrip shell yang memanggil ln -s untuk setiap file, atau kita dapat menggunakan utilitas khusus.
  4. Uji skrip instalasi pada mesin virtual baru.
  5. Migrasikan semua konfigurasi alat saat ini ke repositori dotfiles.
  6. Publikasikan dotfiles di GitHub.

Remote Machine

Instal mesin virtual Linux (atau gunakan yang sudah ada) untuk latihan ini. Jika belum terbiasa dengan mesin virtual, lihat tutorial ini untuk menginstal satu.

  1. Buka ~/.ssh/ dan periksa apakah sudah memiliki sepasang kunci SSH di sana. Jika tidak, hasilkan dengan ssh-keygen -o -a 100 -t ed25519. Disarankan untuk menggunakan passphrase dan ssh-agent, info lebih lanjut di sini.

  2. Edit .ssh/config untuk memiliki entri sebagai berikut:

    Host vm
        User username_goes_here
        HostName ip_goes_here
        IdentityFile ~/.ssh/id_ed25519
        LocalForward 9999 localhost:8888
    
  3. Gunakan ssh-copy-id vm untuk menyalin kunci ssh ke server.

  4. Mulai web server di VM dengan menjalankan python -m http.server 8888. Akses web server VM dengan membuka http://localhost:9999 di mesin lokal.

  5. Edit konfigurasi server SSH dengan melakukan sudo vim /etc/ssh/sshd_config dan nonaktifkan otentikasi password dengan mengubah nilai PasswordAuthentication. Nonaktifkan login root dengan mengubah nilai PermitRootLogin. Restart ssh service dengan sudo service sshd restart. Coba ssh lagi.

  6. (Tantangan) Instal mosh di VM dan buat koneksi. Kemudian putuskan koneksi adaptor jaringan server/VM. Apakah mosh dapat memulihkan koneksi dengan benar?

  7. (Tantangan) Cari tahu fungsi opsi -N dan -f pada ssh dan temukan perintah untuk melakukan port forwarding di latar belakang.