Remote Machines

Programmer များအနေဖြင့် မိမိတို့၏ နေ့စဉ်လုပ်ငန်းခွင်တွင် remote server များကို အသုံးပြုလာကြခြင်းသည် ပိုမို ခေတ်စားလာခဲ့ပါသည်။ အကယ်၍ သင်သည် backend ဆော့ဖ်ဝဲလ်များကို ဖြန့်ကျက်ရန် (deploy ပြုလုပ်ရန်) သို့မဟုတ် ပိုမိုမြင့်မားသော တွက်ချက်မှုစွမ်းရည် (computational capabilities) ရှိသည့် server တစ်ခု လိုအပ်၍ remote server များကို အသုံးပြုရန် လိုအပ်ပါက၊ နောက်ဆုံးတွင် သင်သည် Secure Shell (SSH) ကို အသုံးပြုရမည် ဖြစ်ပါသည်။ ဤသင်တန်းတွင် ဖော်ပြခဲ့သော tool အများစုကဲ့သို့ပင် SSH သည် အလွန်အမင်း စိတ်ကြိုက် ပြင်ဆင်သတ်မှတ်နိုင်စွမ်း (highly configurable) ရှိသဖြင့် ယင်းအကြောင်းကို လေ့လာသင်ယူရကျိုး နပ်ပါသည်။

Command များကို မောင်းနှင်ခြင်း

ssh ၏ မကြာခဏ သတိမမူမိတတ်ကြသော feature တစ်ခုမှာ command များကို တိုက်ရိုက် မောင်းနှင်နိုင်သည့် (run နိုင်သည့်) စွမ်းဆောင်ရည် ဖြစ်ပါသည်။

SSH Key များ

Key အခြေပြု အတည်ပြုစစ်ဆေးခြင်း (Key-based authentication) သည် လျှို့ဝှက် private key ကို ထုတ်ဖော်ပြသခြင်း မရှိဘဲ client တွင် ထို private key ရှိကြောင်း server ထံ သက်သေပြရန် public-key cryptography ကို အသုံးပြုထားခြင်း ဖြစ်ပါသည်။ ဤနည်းဖြင့် သင်သည် အကြိမ်တိုင်းတွင် သင်၏ password ကို ပြန်လည် ရိုက်ထည့်ရန် မလိုအပ်တော့ပါ။ သို့သော်လည်း private key (ဥပမာ ~/.ssh/id_rsa) သည် အမှန်တကယ်အားဖြင့် သင်၏ password ပင် ဖြစ်သောကြောင့် ထိုအတိုင်း ဂရုစိုက် စီမံရမည် ဖြစ်သည်။

အကယ်၍ သင်သည် SSH key များကို အသုံးပြု၍ GitHub သို့ push ပြုလုပ်ရန် ပြင်ဆင်ထားပြီးပါက ဤနေရာတွင် ဖော်ပြထားသော အဆင့်များကို လုပ်ဆောင်ခဲ့ပြီးဖြစ်ကာ တရားဝင် key အတွဲတစ်ခု ရှိပြီးသား ဖြစ်နိုင်ပါသည်။ သင့်တွင် passphrase ရှိမရှိ စစ်ဆေးရန်နှင့် ယင်းကို အတည်ပြုရန်အတွက် ssh-keygen -y -f /path/to/key ကို runနိုင်ပါသည်။

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

ရရှိနိုင်သည့် နေရာများတွင် ssh-copy-id ကို အသုံးပြု၍ ပိုမို ရိုးရှင်းသော ဖြေရှင်းချက်ကို ရရှိနိုင်ပါသည်။

ssh-copy-id -i .ssh/id_dsa.pub foobar@remote

SSH မှတစ်ဆင့် ဖိုင်များကို ကူးယူခြင်း

SSH မှတစ်ဆင့် ဖိုင်များကို ကူးယူရန် နည်းလမ်းများစွာ ရှိပါသည် -

Process များကို Background တွင် လည်ပတ်စေခြင်း

Default အားဖြင့် ssh ချိတ်ဆက်မှု ပြတ်တောက်သွားသည့်အခါ parent shell ၏ child process များသည် ယင်းနှင့်အတူ သေဆုံးသွားကြပါသည်။ အခြား ရွေးချယ်စရာ နည်းလမ်းအချို့ ရှိကြပါသည် -

နောက်ဆုံးအနေဖြင့် အကယ်၍ သင်သည် ပရိုဂရမ်တစ်ခုကို disown ပြုလုပ်ခဲ့ပြီး ယင်းကို လက်ရှိ terminal ထံ ပြန်လည် reattach ပြုလုပ်လိုပါက reptyr ကို လေ့လာကြည့်နိုင်ပါသည်။ reptyr PID သည် ID PID ပါရှိသော process ကို ရယူပြီး သင်၏ လက်ရှိ terminal သို့ တွဲဆက် (attach) ပေးမည် ဖြစ်သည်။

Port Forwarding

အခြေအနေ အများအပြားတွင် သင်သည် စက်အတွင်းရှိ port များကို နားထောင်ခြင်း (listen လုပ်ခြင်း) ဖြင့် အလုပ်လုပ်သော ဆော့ဖ်ဝဲလ်များနှင့် ကြုံတွေ့ရမည် ဖြစ်သည်။ ဤသို့ သင်၏ local စက်တွင် ဖြစ်ပျက်သည့်အခါ localhost:PORT သို့မဟုတ် 127.0.0.1:PORT ကို ရိုးရှင်းစွာ ပြုလုပ်နိုင်သော်လည်း၊ ကွန်ရက်/အင်တာနက်မှတစ်ဆင့် ယင်း၏ port များကို တိုက်ရိုက် ရယူသုံးစွဲနိုင်ခြင်း မရှိသော remote server တစ်ခုနှင့် ကြုံလျှင် မည်သို့ ပြုလုပ်မည်နည်း။ ဤသည်ကို port forwarding ဟု ခေါ်ဆိုပြီး ယင်းတွင် ပုံစံနှစ်မျိုး ပါဝင်ပါသည်- Local Port Forwarding နှင့် Remote Port Forwarding (အသေးစိတ်အတွက် ပုံများကို ကြည့်ပါ၊ ပုံများ၏ credit မှာ ဤ SO post မှ ဖြစ်ပါသည်)။

Local Port Forwarding Local Port Forwarding

Remote Port Forwarding Remote Port Forwarding

အတွေ့ရအများဆုံး အခြေအနေမှာ local port forwarding ဖြစ်ပြီး၊ remote စက်အတွင်းရှိ service တစ်ခုက port တစ်ခုတွင် နားထောင်နေကာ သင်က remote port ထံ ပေးပို့ရန် (forward ပြုလုပ်ရန်) အတွက် သင်၏ local စက်ရှိ port တစ်ခုကို ချိတ်ဆက်လိုခြင်း ဖြစ်ပါသည်။ ဥပမာအားဖြင့် remote server တွင် port 8888 ကို နားထောင်နေသည့် jupyter notebook ကို မောင်းနှင်လိုက်သည် ဆိုပါစို့။ ထို့ကြောင့် ယင်းကို local port 9999 သို့ forward ပြုလုပ်ရန်အတွက် ssh -L 9999:localhost:8888 foobar@remote_server ကို ပြုလုပ်မည်ဖြစ်ပြီး၊ ထို့နောက် မိမိတို့ local စက်တွင် localhost:9999 သို့ ဝင်ရောက် ကြည့်ရှုမည် ဖြစ်သည်။

Graphics Forwarding

တစ်ခါတစ်ရံတွင် server ၌ GUI အခြေပြု ပရိုဂရမ်တစ်ခုကို မောင်းနှင်လိုသောကြောင့် port များကို forward ပြုလုပ်ရုံဖြင့် မလုံလောက်ပါ။ Desktop Environment တစ်ခုလုံးကို ပေးပို့ပေးသည့် Remote Desktop Software များကို အမြဲတမ်း အသုံးပြုနိုင်ပါသည် (ဥပမာ RealVNC, Teamviewer စသည့် ရွေးချယ်စရာများ)။ သို့သော်လည်း သီးခြား GUI tool တစ်ခုတည်းအတွက်မူ SSH သည် ကောင်းမွန်သော အခြားရွေးချယ်စရာတစ်ခုကို ပေးစွမ်းထားပါသည်- Graphics Forwarding ဖြစ်ပါသည်။

-X flag ကို အသုံးပြုခြင်းဖြင့် X11 ကို forward ပြုလုပ်ရန် SSH အား ညွှန်ကြားပါသည်။

ယုံကြည်ရသော (trusted) X11 forwarding အတွက် -Y flag ကို အသုံးပြုနိုင်ပါသည်။

နောက်ဆုံး သတိပြုရန်အချက်မှာ ဤသည် အလုပ်လုပ်ရန်အတွက် server ပေါ်ရှိ sshd_config တွင် အောက်ပါ option များ ရှိနေရမည် ဖြစ်ပါသည် -

X11Forwarding yes
X11DisplayOffset 10

Roaming

Remote server တစ်ခုသို့ ချိတ်ဆက်သည့်အခါ ကြုံတွေ့ရလေ့ရှိသော အခက်အခဲတစ်ခုမှာ မိမိ၏ ကွန်ပျူတာကို ပိတ်လိုက်ခြင်း/sleep လုပ်လိုက်ခြင်း သို့မဟုတ် ကွန်ရက် ပြောင်းလဲလိုက်ခြင်းတို့ကြောင့် ချိတ်ဆက်မှု ပြတ်တောက်သွားခြင်း ဖြစ်ပါသည်။ ထို့အပြင် အကယ်၍ ချိတ်ဆက်မှုတွင် သိသာသော lag ရှိနေပါက ssh ကို အသုံးပြုခြင်းသည် အတော်လေး စိတ်ပျက်စရာ ကောင်းလာနိုင်ပါသည်။ Mobile shell ဖြစ်သော Mosh သည် ssh ကို ပိုမိုကောင်းမွန်အောင် ပြုလုပ်ထားပြီး roaming ချိတ်ဆက်မှုများ၊ ပြတ်တောင်းပြတ်တောင်း ချိတ်ဆက်နိုင်မှုများကို ခွင့်ပြုပေးသည့်အပြင် ဉာဏ်ရည်ထက်မြက်သော local echo ကိုလည်း ပေးစွမ်းနိုင်ပါသည်။

Mosh ကို အသုံးများသော distribution များနှင့် package manager များ အားလုံးတွင် ရယူနိုင်ပါသည်။ Mosh သည် server အတွင်း၌ ssh server တစ်ခု အလုပ်လုပ်နေရန် လိုအပ်ပါသည်။ Mosh ကို ထည့်သွင်းရန်အတွက် သင်သည် superuser ဖြစ်ရန် မလိုအပ်သော်လည်း server တွင် port 60000 မှ 60010 အထိ ပွင့်နေရန် လိုအပ်ပါသည်။ (၎င်းတို့သည် privileged range အတွင်း မရှိသောကြောင့် ပုံမှန်အားဖြင့် ပွင့်နေလေ့ ရှိပါသည်)။

mosh ၏ အားနည်းချက်တစ်ခုမှာ ယင်းသည် roaming port/graphics forwarding ကို ထောက်ပံ့မပေးခြင်း ဖြစ်သောကြောင့် အကယ်၍ သင်သည် ၎င်းတို့ကို မကြာခဏ သုံးစွဲပါက mosh သည် များစွာ အကူအညီ ဖြစ်မည် မဟုတ်ပါ။

SSH Configuration

Client ပိုင်း

ကျွန်ုပ်တို့သည် ပေးပို့နိုင်သည့် argument အများအပြားကို ဆွေးနွေးခဲ့ကြပြီး ဖြစ်သည်။ စိတ်ဝင်စားစရာ အခြားရွေးချယ်စရာတစ်ခုမှာ alias my_server="ssh -X -i ~/.ssh/id_rsa -L 9999:localhost:8888 foobar@remote_server" ကဲ့သို့သော shell alias များကို ဖန်တီးခြင်း ဖြစ်သော်လည်း၊ ~/.ssh/config ကို အသုံးပြုခြင်းဟူသော ပိုမိုကောင်းမွန်သည့် အခြားရွေးချယ်စရာတစ်ခု ရှိပါသည်။

Host vm
    User foobar
    HostName 172.16.174.141
    Port 22
    IdentityFile ~/.ssh/id_rsa
    RemoteForward 9999 localhost:8888

# Configs can also take wildcards
Host *.mit.edu
    User foobaz

Alias များထက် ~/.ssh/config ဖိုင်ကို အသုံးပြုခြင်း၏ အပိုဆောင်း အားသာချက်တစ်ခုမှာ scp၊ rsync၊ mosh စသည့် အခြားသော ပရိုဂရမ်များသည်လည်း ယင်းကို ဖတ်ရှုနိုင်ပြီး အပြင်အဆင်များကို သက်ဆိုင်ရာ flag များအဖြစ် ပြောင်းလဲပေးနိုင်ခြင်း ဖြစ်ပါသည်။

~/.ssh/config ဖိုင်ကို dotfile တစ်ခုအဖြစ် သတ်မှတ်နိုင်ပြီး၊ ယေဘုယျအားဖြင့် ယင်းကို သင်၏ အခြားသော dotfile များနှင့်အတူ ထည့်သွင်းထားခြင်းသည် အဆင်ပြေပါသည်။ သို့သော်လည်း အကယ်၍ သင်သည် ယင်းကို အများပြည်သူသို့ ထုတ်ဖော်ပြသလိုက်ပါက (public ပြုလုပ်လိုက်ပါက) အင်တာနက်ပေါ်ရှိ ပြင်ပသူများထံ သင် ပေးအပ်လိုက်နိုင်သည့် အချက်အလက်များကို စဉ်းစားကြည့်ပါ- သင်၏ server များ၏ လိပ်စာများ၊ သင် အသုံးပြုနေသော user များ၊ ပွင့်နေသော port များ စသည်တို့ ဖြစ်ပါသည်။ ဤသည်မှာ အချို့သော တိုက်ခိုက်မှု အမျိုးအစားများကို လွယ်ကူချောမွေ့သွားစေနိုင်သဖြင့် သင်၏ SSH configuration ကို မျှဝေရာတွင် သေချာ စဉ်းစားဆင်ခြင်ပါ။

သတိပေးချက်- သင်၏ RSA key များကို (~/.ssh/id_rsa*) public repository တွင် မည်သည့်အခါမျှ ထည့်သွင်းခြင်း မပြုပါနှင့်!

Server ပိုင်း

Server ပိုင်း configuration ကို ပုံမှန်အားဖြင့် /etc/ssh/sshd_config တွင် သတ်မှတ်လေ့ရှိပါသည်။ ဤနေရာတွင် သင်သည် password ဖြင့် အတည်ပြုစစ်ဆေးခြင်းကို ပိတ်ထားခြင်း၊ ssh port များကို ပြောင်းလဲခြင်း၊ X11 forwarding ကို ဖွင့်လှစ်ခြင်း စသည့် ပြောင်းလဲမှုများကို ပြုလုပ်နိုင်ပါသည်။ Config အပြင်အဆင်များကို user တစ်ဦးချင်းစီအလိုက် သတ်မှတ်ပေးနိုင်ပါသည်။

Remote Filesystem (အဝေးထိန်း ဖိုင်စနစ်)

တစ်ခါတစ်ရံတွင် remote folder တစ်ခုကို mount ပြုလုပ်ထားခြင်းက အဆင်ပြေစေပါသည်။ sshfs သည် remote server ပေါ်ရှိ folder တစ်ခုကို local တွင် mount ပြုလုပ်ပေးနိုင်ပြီး၊ ထို့နောက် သင်သည် local editor တစ်ခုကို အသုံးပြုနိုင်မည် ဖြစ်သည်။

လေ့ကျင့်ခန်းများ

  1. SSH အလုပ်လုပ်ရန်အတွက် host စက်တွင် SSH server တစ်ခု runနေရန် လိုအပ်ပါသည်။ ကျန်ရှိသော လေ့ကျင့်ခန်းများကို လုပ်ဆောင်နိုင်ရန်အတွက် virtual machine တစ်ခုအတွင်း၌ SSH server တစ်ခု (ဥပမာ OpenSSH) ထည့်သွင်းပါ။ စက်၏ IP မည်မျှဖြစ်သည်ကို သိရှိနိုင်ရန် ip addr command ကို runပြီး inet နေရာကို ရှာဖွေပါ (loopback interface နှင့် သက်ဆိုင်သော 127.0.0.1 စာရင်းကို ကျော်ပါ)။

  2. ~/.ssh/ သို့ သွားရောက်ပြီး ထိုနေရာတွင် SSH key အတွဲတစ်ခု ရှိမရှိ စစ်ဆေးပါ။ မရှိပါက ssh-keygen -t rsa -b 4096 ဖြင့် ထုတ်လုပ်ပါ။ သင့်အနေဖြင့် password တစ်ခုကို အသုံးပြုပြီး ssh-agent ကို သုံးစွဲရန် အကြံပြုပါသည်၊ အသေးစိတ် အချက်အလက်များကို ဒီနေရာတွင် ကြည့်ပါ။

  3. Key ကို မိမိ၏ virtual machine ထံ ကူးယူရန် ssh-copy-id ကို အသုံးပြုပါ။ Password မလိုဘဲ ssh ဝင်ရောက်နိုင်မနိုင် စမ်းသပ်ပါ။ ထို့နောက် server ပေါ်ရှိ သင်၏ sshd_config ကို ပြင်ဆင်ပြီး PasswordAuthentication ၏ တန်ဖိုးကို ပြောင်းလဲကာ password ဖြင့် အတည်ပြုစစ်ဆေးခြင်းကို ပိတ်ပါ။ PermitRootLogin ၏ တန်ဖိုးကို ပြောင်းလဲခြင်းဖြင့် root login ဝင်ရောက်ခြင်းကို ပိတ်ပါ။

  4. SSH port ကို ပြောင်းလဲရန် server ရှိ sshd_config ကို ပြင်ဆင်ပြီး ssh ဝင်ရောက်နိုင်ဆဲ ဟုတ်မဟုတ် စစ်ဆေးပါ။ အကယ်၍ သင့်တွင် အများပြည်သူ ဝင်ရောက်နိုင်သော (public facing) server တစ်ခု ရှိပါက default မဟုတ်သော port တစ်ခုနှင့် key သာ သုံးသည့် login တို့သည် မသမာသော တိုက်ခိုက်မှု ပမာဏ အမြောက်အမြားကို ဟန့်တားပေးနိုင်မည် ဖြစ်သည်။

  5. သင်၏ server/VM တွင် mosh ကို ထည့်သွင်းပါ၊ ချိတ်ဆက်မှုတစ်ခု ပြုလုပ်ပြီးနောက် server/VM ၏ network adapter ကို ဖြုတ်လိုက်ပါ။ Mosh သည် ယင်းမှ အဆင်ပြေစွာ ပြန်လည် စတင်နိုင်ပါသလား (recover ဖြစ်ပါသလား)။

  6. Local port forwarding ၏ အခြားသော အသုံးပြုမှုတစ်ခုမှာ သီးခြား host တစ်ခုကို server သို့ tunnel ဖောက်၍ ဆက်သွယ်ခြင်း ဖြစ်သည်။ အကယ်၍ သင်၏ ကွန်ရက်သည် ဥပမာ reddit.com ကဲ့သို့သော ဝဘ်ဆိုက်အချို့ကို စစ်ထုတ်ထားပါက ယင်းကို server မှတစ်ဆင့် အောက်ပါအတိုင်း tunnel ဖောက်၍ ဝင်ရောက်နိုင်သည် -

    • ssh remote_server -L 80:reddit.com:80 ကို runပါ
    • /etc/hosts တွင် reddit.com နှင့် www.reddit.com တို့ကို 127.0.0.1 ဟု သတ်မှတ်ပါ
    • ထိုဝဘ်ဆိုက်သို့ server မှတစ်ဆင့် ဝင်ရောက်နေခြင်း ဟုတ်မဟုတ် စစ်ဆေးပါ
    • သိသာထင်ရှားမှု မရှိပါက သင်၏ host public IP အပေါ် မူတည်၍ ပြောင်းလဲမည်ဖြစ်သော ipinfo.io ကဲ့သို့သော ဝဘ်ဆိုက်တစ်ခုကို အသုံးပြုပါ
  7. Background port forwarding ကို အပိုဆောင်း flag အနည်းငယ်ဖြင့် လွယ်ကူစွာ ပြုလုပ်နိုင်ပါသည်။ ssh တွင် -N နှင့် -f flag များက မည်သည့်အရာ ပြုလုပ်သည်ကို စုံစမ်းလေ့လာပြီး ssh -N -f -L 9999:localhost:8888 foobar@remote_server ကဲ့သို့သော command တစ်ခုက မည်သည့်အရာ ပြုလုပ်သည်ကို အဖြေရှာပါ။

ကိုးကားချက်များ


Edit this page.

Licensed under CC BY-NC-SA.