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 :
- bagaimana menghentikan
- atau menjeda proses tertentu
- dan bagaimana membuat proses berjalan di latar belakang.
Kita akan mempelajari beberapa metode untuk mengoptimalkan shell dan tools lainnya, seperti:
-
Mendefinisikan alias (nama singkatan) untuk perintah yang sering digunakan. Ini membantu menghemat waktu pengetikan.
-
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.
-
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 shortcut
nya, dan semuanya memiliki bentuk <C-b> x
yang berarti
- tekan
Ctrl+b
, - lepaskan
Ctrl+b
- lalu, ketik
x
.
Tmux
memiliki hierarki objek berikut:
-
Sesi - sesi adalah ruang kerja independen dengan satu atau lebih jendela
tmux
memulai sesi baru.tmux new -s NAMA
membuat sesi baru dengan nama.tmux ls
mencantumkan sesi saat ini- Dalam
tmux
, mengetik<C-b> d
melepaskan sesi saat ini. Shortcut ini bermaknaCtrl+B
lalu klikd
yang berarti Detached / Keluar sementara. tmux a
melanjutkan sesi terakhir. Kita dapat menggunakan flag-t
untuk menentukan yang mana
-
Jendela - Seperti tab di editor atau browser, mereka secara visual terpisah bagian dari sesi yang sama
<C-b> c
Membuat jendela baru. Untuk menutupnya, Kita cukup menghentikan shell dengan melakukan<C-d>
.<C-b> N
Pergi ke jendela ke-N. Perhatikan bahwa mereka diberi nomor.<C-b> p
Pergi ke jendela sebelumnya.<C-b> n
Pergi ke jendela berikutnya.<C-b> ,
mengganti nama jendela saat ini.<C-b> w
Daftar menampilkan daftar jendela saat ini.
-
Panel - Seperti split vim, panel memungkinkan Kita memiliki beberapa shell dalam tampilan visual yang sama.
<C-b> "
Membagi panel saat ini secara horizontal<C-b> %
Membagi panel saat ini secara vertikal<C-b> <arah>
Pindah ke panel di arah yang ditentukan. Arah di sini berarti tombol panah.<C-b> z
Toggle zoom untuk panel saat ini<C-b> [
Mulai scrollback. Kita kemudian dapat menekan<spasi>
untuk memulai pilihan dan<enter>
untuk menyalin pilihan itu.<C-b> <spasi>
Mengubah tata letak atau pengaturan panel secara berurutan.
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:
bash
-~/.bashrc
,~/.bash_profile
git
-~/.gitconfig
vim
-~/.vimrc
dan folder~/.vim
ssh
-~/.ssh/config
tmux
-~/.tmux.conf
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:
- Mudahnya Instalasi: Menerapkan kustomisasi pada mesin baru hanya membutuhkan waktu singkat.
- Portabilitas: Alat-alat akan bekerja dengan cara yang konsisten di mana pun.
- Sinkronisasi: Dotfiles dapat diperbarui dan disinkronkan dengan mudah di berbagai perangkat.
- Pelacakan perubahan: Riwayat versi akan bermanfaat untuk pemeliharaan dotfiles dalam jangka panjang.
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:
ssh+tee
, cara paling sederhana adalah menggunakan eksekusi perintahssh
dan input STDIN dengan melakukancat localfile | ssh remote_server tee serverfile
. Ingat bahwatee
menulis output dari STDIN ke file.scp
, saat menyalin banyak file/direktori, perintah salinan amanscp
lebih nyaman karena dapat dengan mudah menggulang path. Sintaksnya adalahscp path/to/local_file remote_host:path/to/remote_file
rsync
meningkatkanscp
dengan mendeteksi file yang identik di lokal dan remote, dan mencegah penyalinan ulang. Rsync juga memberikan kontrol yang lebih baik atas symlink, permission, dan memiliki fitur tambahan seperti opsi--partial
yang dapat melanjutkan dari salinan yang sebelumnya terganggu.rsync
memiliki sintaks yang mirip denganscp
.
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
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:
- Globbing yang lebih cerdas,
**
- Inline globbing/wildcard expansion
- Koreksi ejaan
- Tab completion/selection yang lebih baik
- Path expansion (
cd /u/lo/b
akan diperluas menjadi/usr/local/bin
)
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:
- Right prompt
- Syntax highlighting perintah
- History substring search
- Penyelesaian flag berdasarkan halaman manual
- Penyelesaian otomatis yang lebih cerdas
- Prompt theming
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:
- Pilihan font
- Color scheme
- Keyboard shortcut
- Dukungan Tab/Panel
- Konfigurasi scrollback
- Performa (beberapa terminal yang lebih baru seperti Alacritty atau kitty menawarkan akselerasi GPU).
Latihan
Kontrol Pekerjaan
-
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 pekerjaansleep 10000
di terminal, pindahkan ke latar belakang denganCtrl-Z
dan lanjutkan eksekusinya denganbg
. Sekarang gunakanpgrep
untuk menemukan pid-nya danpkill
untuk menghentikannya tanpa perlu mengetik pid secara manual. (Petunjuk: gunakan opsi-af
). -
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 perintahwait
. Cobalah menjalankan perintah sleep dan mintals
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 perintahkill
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 disebutpidwait
yang menerima pid dan menunggu sampai proses yang diberikan selesai. Kita harus menggunakansleep
untuk menghindari pemborosan CPU yang tidak perlu.
Multiplexer Terminal
- Ikuti tutorial
tmux
ini dan kemudian pelajari cara melakukan beberapa kustomisasi dasar mengikuti langkah-langkah ini.
Alias
-
Buat alias
dc
yang menyelesaikancd
ketika kita mengetiknya dengan salah. -
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, gunakanhistory 1
alih-alih sekadarhistory
.
Dotfiles
Mari kita persiapkan dotfiles kita.
- Buat folder untuk dotfiles dan atur version control.
- Tambahkan konfigurasi untuk setidaknya satu program, misalnya shell, dengan beberapa kustomisasi (untuk memulai, itu bisa sesederhana menyesuaikan prompt shell dengan mengatur
$PS1
). - 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. - Uji skrip instalasi pada mesin virtual baru.
- Migrasikan semua konfigurasi alat saat ini ke repositori dotfiles.
- 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.
-
Buka
~/.ssh/
dan periksa apakah sudah memiliki sepasang kunci SSH di sana. Jika tidak, hasilkan denganssh-keygen -o -a 100 -t ed25519
. Disarankan untuk menggunakan passphrase danssh-agent
, info lebih lanjut di sini. -
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
-
Gunakan
ssh-copy-id vm
untuk menyalin kunci ssh ke server. -
Mulai web server di VM dengan menjalankan
python -m http.server 8888
. Akses web server VM dengan membukahttp://localhost:9999
di mesin lokal. -
Edit konfigurasi server SSH dengan melakukan
sudo vim /etc/ssh/sshd_config
dan nonaktifkan otentikasi password dengan mengubah nilaiPasswordAuthentication
. Nonaktifkan login root dengan mengubah nilaiPermitRootLogin
. Restartssh
service dengansudo service sshd restart
. Coba ssh lagi. -
(Tantangan) Instal
mosh
di VM dan buat koneksi. Kemudian putuskan koneksi adaptor jaringan server/VM. Apakah mosh dapat memulihkan koneksi dengan benar? -
(Tantangan) Cari tahu fungsi opsi
-N
dan-f
padassh
dan temukan perintah untuk melakukan port forwarding di latar belakang.