မာတိကာ သို့ သွားရန်

၁ · Shell ကျွမ်းကျင်မှု (Shell Fluency)

Shell သည် ကွန်ရက်အင်ဂျင်နီယာ၏ စွမ်းအားမြှင့်တင်ပေးသော ကိရိယာ (force multiplier) ဖြစ်ပါသည်။ ဤနေရာရှိ အရာအားလုံးသည် အဓိက ရည်မှန်းချက်တစ်ခုဆီသို့ ဦးတည်ပါသည်: စက်ပစ္စည်းအားလုံးပေါ်တွင် တစ်ပြိုင်နက် လုပ်ဆောင်ရန်နှင့် ချို့ယွင်းနေသော စက်များကိုသာ သီးသန့် အသိပေးစေရန်။


Pipes: အဓိက အခြေခံ သဘောတရား

Pipe (|) သည် command တစ်ခု၏ output ကို နောက် command တစ်ခုအတွက် input အဖြစ် ဆင့်ပွား ပို့ဆောင်ပေးပါသည်။ သေးငယ်သော tools များကို သံကြိုးကဲ့သို့ ချိတ်ဆက်အသုံးပြုခြင်း ဖြစ်သည်။

docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary" | grep Estab | wc -l

သာမန်ရိုးရှင်းသော tools ၃ ခု — command run ခြင်း၊ လိုင်းများကို စစ်ထုတ်ခြင်း၊ ရေတွက်ခြင်း — ပေါင်းစပ်ပြီး "BGP peers မည်မျှ up နေသနည်း" ကို ချက်ချင်း အဖြေထုတ်ပေးသည်။ မည်သည့် tool မှ အခြား tool အကြောင်း မသိသလို BGP အကြောင်းကိုလည်း မည်သည့် tool မှ နားလည်စရာ မလိုပါ။

၎င်းသည် Unix ၏ အနှစ်သာရ ဖြစ်ပါသည်: တစ်ခုချင်းစီသည် သီးခြားအားဖြင့် များစွာ မလုပ်ဆောင်နိုင်သော်လည်း ပေါင်းစပ်လိုက်ပါက မည်သည့်အရာကိုမဆို ပြီးမြောက်စေနိုင်ပါသည်။


Redirection နှင့် Output Streams နှစ်ခု

Command တိုင်းသည် stdout (ပုံမှန်ရလဒ် output) နှင့် stderr (အမှားအယွင်း errors) ဟူသော ရေစီးကြောင်းနှစ်ခုဆီသို့ ရေးသားကြပါသည်။ တစ်ခုကို သိမ်းဆည်းပြီး အခြားတစ်ခုကို ပယ်ဖျက်နိုင်ရန် တမင်တကာ သီးခြားခွဲထုတ်ထားခြင်း ဖြစ်သည်။

Syntax လုပ်ဆောင်ချက်
> file stdout ကို ဖိုင်ထဲ ရေးသည်၊ မူလဖိုင်ရှိပါက အစားထိုးဖျက်ပစ်သည်
>> file stdout ကို ဖိုင်အောက်ခြေတွင် ဆက်ရေးသည် (append)
2> file stderr (အမှားများ) ကို ဖိုင်ထဲ ရေးသည်
2>&1 stderr ကို stdout ထဲ ပေါင်းထည့်သည် — အတူတကွ ပေါင်းစပ်သည်
> file 2>&1 ရလဒ်ရော အမှားပါ နှစ်ခုစလုံးကို ဖိုင်ထဲ ရေးသည်
2>/dev/null အမှားများကို လုံးဝ ပယ်ဖျက်ပစ်သည်
\| tee file ဖိုင်ထဲသို့လည်း ရေးပြီး screen ပေါ်တွင်လည်း ပြသသည်
# configs များကို ဖမ်းယူပြီး errors များကို သီးခြား log မှတ်သားခြင်း
for n in r1 r2 r3; do
  docker exec clab-bgp-lab-$n Cli -p 15 -c "show running-config" \
    > configs/$n.cfg 2>> errors.log
done

> သည် command မ run မီ မူလဖိုင်ကို အရင်ဆုံး ရှင်းလင်းပစ်ပါသည်

sort file.txt > file.txt ရိုက်နှိပ်ပါက ဗလာဖိုင်တစ်ခုသာ ရရှိပါလိမ့်မည်။ Shell သည် target ဖိုင်ကို ဦးစွာ အရင် truncate ဖျက်ပစ်လိုက်ပြီးမှ ဗလာဖြစ်နေသော ဖိုင်ပေါ်တွင် command ကို run သောကြောင့် ဖြစ်သည်။ ဖိုင်အသစ်ထဲသို့ ရေးပြီးမှသာ ပြန်လည် move ပြုလုပ်ပါ။


Exit Codes: Script တစ်ခုက အောင်မြင်မှု ရှိမရှိ သိရှိပုံ

Command တိုင်းသည် status တစ်ခုကို ပြန်ပေးပါသည်။ 0 ဆိုသည်မှာ အောင်မြင်သည် (success) ဟု အဓိပ္ပာယ်ရပြီး အခြားနံပါတ်တိုင်းသည် ချို့ယွင်းမှု (failure) ဖြစ်သည် — လူအများ ထင်မှတ်ထားသည့်ပုံစံနှင့် ပြောင်းပြန်ဖြစ်သော်လည်း မတူညီသော failure များကို ကွဲပြားသော နံပါတ်များ သတ်မှတ်နိုင်စေပါသည်။

docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary" >/dev/null
echo $?      # 0

ဒါဟာ အခြေအနေစစ်ဆေးမှု (conditionals) များကို အလုပ်လုပ်စေသည့် အကြောင်းရင်း ဖြစ်သည်။ grep သည် ရှာဖွေတွေ့ရှိပါက 0 ပြန်ပေးပြီး ရှာမတွေ့ပါက 1 ပြန်ပေးပါသည်:

if docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary" | grep -q Estab; then
  echo "BGP is up"
else
  echo "BGP is DOWN"
fi

-q ဆိုသည်မှာ quiet (တိတ်ဆိတ်ခြင်း) ဖြစ်သည် — screen ပေါ် မည်သည့်အရာမှ မပြဘဲ exit code သာ သတ်မှတ်ပေးသည်။ ၎င်းသည် "ဤစာသား ပါမပါ စစ်ဆေးရန်" အတွက် စံပြုသုံးစွဲသော ပုံစံ ဖြစ်သည်။

အောင်မြင်မှု သို့မဟုတ် ချို့ယွင်းမှုအပေါ် မူတည်၍ ဆက်စပ် ချိတ်ဆက်ခြင်း:

command_a && command_b     # a အောင်မြင်မှသာ b ကို run မည်
command_a || command_b     # a ကျရှုံးမှသာ b ကို run မည်
command_a ; command_b      # a မည်သို့ပင်ဖြစ်စေ b ကို အမြဲ run မည်
mkdir -p backups && cp *.cfg backups/     # mkdir အောင်မြင်မှသာ copy ကူးမည်
ping -c1 10.0.12.1 >/dev/null || echo "10.0.12.1 unreachable"

Variables များနှင့် Quoting သုံးစွဲပုံ

DEVICE="clab-bgp-lab-r1"
docker exec "$DEVICE" Cli -p 15 -c "show version"

Variables များကို Double-quote အမြဲ ခတ်ပါ။ Quote မပါပါက shell သည် space နေရာများတွင် စာလုံးခွဲပစ်ပြီး * များကို ဖြန့်ကျက်ပစ်ပါလိမ့်မည်:

FILE="my config.txt"
rm $FILE      # ✗ "my" နှင့် "config.txt" ဖိုင်နှစ်ခုလုံးကို လိုက်ဖျက်ပါလိမ့်မည်
rm "$FILE"    # ✓ မှန်ကန်သည်
Quoting ပုံစံ အပြုအမူ
"$VAR" Variable တန်ဖိုးကို အစားထိုးထုတ်ယူသည် — အမြဲတမ်း ပုံမှန် ရွေးချယ်သင့်သော နည်းလမ်း
'$VAR' $VAR ဟူသော စာသားအတိုင်း တိုက်ရိုက်ယူသည်၊ အစားမထိုးပါ
$(command) Command ကို run ပြီး ထွက်လာသော output ကို အစားထိုးထည့်သွင်းသည်
PEERS=$(docker exec clab-bgp-lab-r1 Cli -p 15 -c "show ip bgp summary" | grep -c Estab)
echo "r1 has $PEERS peers"

Heredocs နှင့် သတိပြုရမည့် အချက်

Heredoc သည် command တစ်ခုထံသို့ စာသားတုံးကြီးတစ်ခုလုံးကို ထည့်သွင်းပေးပါသည်:

docker exec -i clab-bgp-lab-r1 Cli -p 15 <<'EOF'
configure
router bgp 65001
EOF

Delimiter ကို quote ခတ်ထားရန် အရေးကြီးပါသည်။ <<'EOF' သည် အတွင်းရှိ စာသားများကို မူရင်းအတိုင်း ပေးပို့ပြီး၊ <<EOF မှာမူ အတွင်းရှိ $variables များကို shell variable အဖြစ် အစားထိုးပစ်ပါလိမ့်မည်။ တမင်တကာ variable သုံးလိုသည် မဟုတ်ပါက quote ခတ်ထားသော ပုံစံကိုသာ သုံးပါ — အဘယ်ကြောင့်ဆိုသော် ကွန်ရက်စက်များ၏ configs များတွင် $ သင်္ကေတများစွာ ပါဝင်လေ့ရှိသောကြောင့် ဖြစ်သည်။

ထို့အပြင် docker exec ထဲသို့ heredoc သွင်းပါက -i flag မဖြစ်မနေ လိုအပ်ပါသည်။


Loops: အလိုအလျောက် စီမံခန့်ခွဲခြင်း

for n in r1 r2 r3; do
  printf "%-4s " "$n"
  docker exec clab-bgp-lab-$n Cli -p 15 -c "show ip bgp summary" | grep -c Estab
done

Phase 1 fabric ပေါ်တွင် run သည့်အခါ:

r1   2
r2   1
r3   1

စက်အမည်များပါသော ဖိုင်တစ်ခုကို loop ပတ်စေပါက စက်ပေါင်း ၁,၀၀၀ ကိုလည်း ဤ code ဖြင့်ပင် စစ်ဆေးနိုင်ပါသည်:

while read -r host; do
  echo "=== $host ==="
  ssh "$host" "show ip bgp summary"
done < devices.txt

read -r သည် backslashes များကို မလိုလားအပ်ဘဲ interpret မလုပ်စေရန် ကာကွယ်ပေးသည် — အမြဲတမ်း ထည့်သွင်းသုံးစွဲပါ။


ချို့ယွင်းချက် ရှိသည်များကိုသာ သီးသန့် Report ထုတ်ခြင်း

စက်အားလုံး၏ အခြေအနေကို စာရင်းချပြခြင်းသည် အတိုင်းအတာ ကြီးမားလာပါက မဖတ်ရှုနိုင်တော့ပါ: မည်သူမျှ "ok" ဟု ပြနေသော စာကြောင်း ၃၀၀ ကို မဖတ်ချင်ကြပါ။ အသုံးဝင်သော check စနစ်သည် ပုံမှန် ကောင်းမွန်နေချိန်တွင် တိတ်ဆိတ် (silent) နေရပါမည်။

for n in r1 r2 r3; do
  if docker exec clab-bgp-lab-$n Cli -p 15 -c "show ip bgp summary" 2>/dev/null \
     | grep -qE "Idle|Active"; then
    echo "$n: DOWN PEER"
  else
    echo "$n: ok"
  fi
done
r1: ok
r2: ok
r3: ok

else branch ကို ဖြုတ်လိုက်ပါက fabric ကောင်းမွန်နေချိန်တွင် မည်သည့်စာသားမျှ ထွက်ပေါ်မည် မဟုတ်ပါ — ၎င်းသည် cron သို့မဟုတ် CI စနစ်များတွင် အလိုချင်ဆုံး အခြေအနေ ဖြစ်သည်။ တိတ်ဆိတ်နေပါက ကောင်းမွန်သည်ဟု အဓိပ္ပာယ်ရပြီး output ထွက်ပေါ်လာမှသာ ပြဿနာကို သွားရောက် စစ်ဆေးရပါမည်။

ကောင်းမွန်သော အခြေအနေတစ်ခုတည်းကိုသာ မစစ်ပါနှင့်၊ မကောင်းသော အခြေအနေတိုင်းကို ဖမ်းယူပါ

grep -q Estab သည် peer တစ်ခုခု တက်နေသည်ကိုသာ စစ်ဆေးပေးပါသည်။ ဒုတိယ peer တစ်ခု down သွားချိန်တွင် ၎င်းက သတိမပေးနိုင်ပါ။ မကောင်းသော အခြေအနေများ — Idle|Active — ကို စစ်ဆေးပါ သို့မဟုတ် အရေအတွက်ကို ရေတွက်ပြီး မျှော်လင့်ထားသည့် အရေအတွက်နှင့် ကိုက်မကိုက် နှိုင်းယှဉ်ပါ။


Script ဖိုင်တစ်ခုအဖြစ် ရေးသားတည်ဆောက်ခြင်း

#!/usr/bin/env bash
set -euo pipefail

# check-bgp.sh — peer တစ်ခုခု established မဖြစ်သော စက်များကို report ထုတ်ပေးသည်
DEVICES=("r1" "r2" "r3")
FAILED=0

for n in "${DEVICES[@]}"; do
  out=$(docker exec "clab-bgp-lab-$n" Cli -p 15 -c "show ip bgp summary" 2>/dev/null) || {
    echo "$n: UNREACHABLE"; FAILED=1; continue
  }
  if grep -qE "Idle|Active" <<<"$out"; then
    echo "$n: DOWN PEER"; FAILED=1
  fi
done

exit $FAILED
chmod +x check-bgp.sh
./check-bgp.sh

set -euo pipefail သည် သင်ရေးသားသော script တိုင်း၏ ထိပ်ဆုံးတွင် အမြဲ ပါရှိသင့်ပါသည်:

Flag အကျိုးသက်ရောက်မှု
-e Command တစ်ခုခု fail ဖြစ်ပါက script ကို ချက်ချင်း ရပ်တန့်စေသည်
-u မသတ်မှတ်ရသေးသော variables များကို သုံးမိပါက error ပြသည် — typo အမှားများကို ဖမ်းယူပေးသည်
-o pipefail Pipeline တစ်ခုအတွင်း မည်သည့်အဆင့်မဆို fail ဖြစ်ပါက pipeline တစ်ခုလုံးကို fail အဖြစ် သတ်မှတ်သည်

Script သည် တစ်ခုခု မှားယွင်းပါက non-zero exit code ဖြင့် ထွက်ခွာပါသည်၊ ထို့ကြောင့် CI၊ cron သို့မဟုတ် Ansible တို့က အလိုအလျောက် သတိပြု အရေးယူနိုင်မည် ဖြစ်သည်။


သိထားသင့်သော အသုံးဝင်သည့် Shell Commands များ

Command အသုံးပြုပုံ
history \| grep ssh ပြီးခဲ့သည့်အပတ်က run ခဲ့သော command ကို ပြန်ရှာခြင်း
!! / sudo !! နောက်ဆုံး run ခဲ့သော command ကို ထပ်မံ run ခြင်း (sudo ဖြင့် တွဲသုံးနိုင်သည်)
Ctrl-R Command history ကို အပြန်အလှန် ရှာဖွေခြင်း
cmd1 \| tee out.txt \| cmd2 Pipeline အလယ်မှ အချက်အလက်ကို ဖိုင်ထဲ မှတ်သားရင်း ဆက်ပို့ခြင်း
watch -n5 'cmd' ၅ စက္ကန့်တစ်ကြိမ် command ကို အလိုအလျောက် ပြန် run ပြခြင်း
timeout 10 cmd ၁၀ စက္ကန့်ကျော်ပါက လက်လျှော့ ရပ်တန့်စေခြင်း — ချိတ်မရသော စက်များအတွက် မဖြစ်မနေ လိုအပ်သည်
xargs -P8 စက် ၈ လုံးပေါ်တွင် တစ်ပြိုင်နက် ပြိုင်တူ run ခြင်း
# Fabric ရှိ စက်အားလုံးကို တစ်ပြိုင်နက် ၈ လုံးစီ၊ ၁၀ စက္ကန့်ထက် မကျော်စေဘဲ စစ်ဆေးခြင်း
cat devices.txt | xargs -P8 -I{} timeout 10 ssh {} "show ip bgp summary"

ဆက်လက်လေ့လာရန်: စက်ပစ္စည်း Output များကို Parse လုပ်ခြင်း → — show output များကို ဒေတာအဖြစ် ပြောင်းလဲခြင်း။