SSH Config Generator: เลิกท่องจำ flag ของ ssh แล้วเปลี่ยนมาใช้ alias
สร้าง Host block สำหรับ ~/.ssh/config พร้อมวางจากฟอร์มง่าย ๆ — ครบทั้ง hostname, user, port, key และ jump host ฟรี ทำงานฝั่ง client 100% ไม่มีข้อมูลออกจากเครื่อง
Table of Contents
SSH Config Generator: เลิกท่องจำ flag ของ ssh แล้วเปลี่ยนมาใช้ alias
ไม่มีใครควรต้องท่องจำคำสั่งแบบ ssh -i ~/.ssh/id_ed25519 -p 2222 [email protected] ให้ขึ้นใจ แต่หลายคนก็พิมพ์แบบนี้ทุกวัน: เซิร์ฟเวอร์นี้ใช้ port ไม่มาตรฐาน อีกเครื่องใช้ user คนละตัว อีกเครื่องซ่อนอยู่หลัง bastion ยิ่งมี host เพิ่ม flag ก็ยิ่งเพิ่ม แค่ลืม -p ตัวเดียว การล็อกอินปกติก็กลายเป็นการไล่รื้อประวัติ shell ยาวเลย
OpenSSH มีคำตอบของเรื่องนี้มานานแล้ว: ไฟล์ ~/.ssh/config แค่นิยาม Host block ไว้ครั้งเดียว — alias, hostname, user, port, key และ jump host — คำสั่งทั้งบรรทัดก็ยุบเหลือแค่ ssh myalias ปัญหาคือการเขียน block เหล่านี้ด้วยมือมันยุ่งยาก: ต้องสะกด keyword ถูก เว้นวรรคสองช่องเป๊ะ และ escape ค่าต่าง ๆ ให้ถูกต้อง
SSH Config Generator ช่วยตัดความยุ่งยากส่วนนั้นออก กรอกฟอร์มสั้น ๆ แล้วเครื่องมือจะสร้าง Host block ที่ถูกต้องพร้อมวางทั้งที — หนึ่ง block หรือทั้งฟาร์มเซิร์ฟเวอร์ก็ได้ บทความนี้จะพาไปดูวิธีใช้งาน และที่สำคัญกว่านั้นคือแต่ละบรรทัดที่ได้มาช่วยอะไรเราได้จริง
ทำไมต้องใช้ SSH Config Generator?
- ไม่ต้องเดา syntax. การสะกด keyword การเว้นวรรค และการ escape ค่า ถูกจัดการให้หมด ผลลัพธ์ที่วางคือสิ่งที่ OpenSSH คาดหวังจะ parse
- ทุกพารามิเตอร์อยู่ในฟอร์มเดียว. alias, hostname, user, port, identity file และ jump host อยู่ในแถวเดียวกัน — ไม่ต้องไปขุดหน้า man page ให้เมื่อย
- สร้างทั้งฟาร์มในรอบเดียว. เพิ่ม host ได้กี่เครื่องก็ได้ พร้อม block Host * สำหรับค่า default ร่วม แล้ว copy config หลายเซิร์ฟเวอร์ได้ในครั้งเดียว
- ตรวจสอบก่อนวาง. port ที่ไม่ถูกต้อง ค่า interval ที่ไม่ใช่ตัวเลข และอักขระที่ใช้ใน alias ไม่ได้ จะถูกแจ้งเตือน — และถูกตัดออกจากผลลัพธ์ — ก่อนจะไปทำ config เสีย
- เป็นส่วนตัวตั้งแต่การออกแบบ. เครื่องมือทำงานฝั่ง client 100% ชื่อ host, username และ path ของ key ไม่เคยออกจากเบราว์เซอร์ของคุณ
ฟีเจอร์หลัก
| ฟีเจอร์ | ทำอะไร |
|---|---|
| Form-to-Host mapping | แปลง alias, HostName, User, Port, IdentityFile และ ProxyJump ให้เป็น block ที่ถูกต้อง |
| หลาย host ในครั้งเดียว | สร้าง config หลายเซิร์ฟเวอร์เสร็จในรอบเดียว |
| ตัวเลือก Host * ระดับ global | AddKeysToAgent, IdentitiesOnly, StrictHostKeyChecking, IPQoS, LogLevel และอื่น ๆ |
| ตรวจสอบค่าที่กรอก | ปฏิเสธ port เกินช่วง 1-65535, interval ที่ผิด และอักขระที่ใช้ใน alias ไม่ได้ |
| Escape ค่าให้ถูกต้อง | backslash และ quote ในค่าต่าง ๆ ถูก escape เพื่อให้รอดการ parse |
| Copy, download, reset | คัดลอกทั้งไฟล์ ดาวน์โหลดเป็นไฟล์ หรือเริ่มใหม่จากศูนย์ |
- host card ที่ไม่กรอก alias จะถูกข้ามทิ้ง ร่างที่ค้างไว้จึงไม่เปื้อนผลลัพธ์
- ไฟล์ขึ้นต้นด้วย comment ระบุวันที่ เตือนให้ทบทวนก่อนใช้จริง และทดสอบด้วย ssh -G
- ผลลัพธ์เป็น plain text ล้วน จึง diff ได้สะอาดถ้าเก็บ dotfiles ไว้ใน version control
วิธีใช้งาน
- เปิด SSH Config Generator แล้วกรอก host card แรก: alias สั้น ๆ เช่น prod-web, hostname จริง, username และ port ถ้าไม่ใช่ 22
- ใส่ path ของ private key ในช่อง IdentityFile (เช่น ~/.ssh/id_ed25519_prod) และถ้าเซิร์ฟเวอร์อยู่หลัง bastion ให้ใส่ alias หรือ address ของ bastion ในช่อง ProxyJump
- Copy block ที่สร้างได้จาก panel ผลลัพธ์ — หรือกด download ถ้ากำลังเริ่มสร้าง config ใหม่ทั้งไฟล์
- วางลงใน ~/.ssh/config (สร้าง directory ด้วย mkdir -p ~/.ssh ถ้ายังไม่มี) แล้วรัน chmod 600 ~/.ssh/config เพื่อให้คุณคนเดียวที่อ่านได้
- เชื่อมต่อด้วย ssh prod-web ถ้าอยากตรวจว่า OpenSSH resolve ค่าอะไรให้ alias นี้บ้างโดยไม่ต้องเชื่อมต่อจริง ให้รัน ssh -G prod-web — คำสั่งนี้ print config ที่มีผลแล้วจบการทำงาน
แต่ละบรรทัดให้อะไรกับเรา
Host alias. คำหลัง Host ไม่ใช่ชื่อจริงของเซิร์ฟเวอร์ — มันคือ pattern ที่คุณตั้งเอง ทุกเครื่องมือในตระกูล OpenSSH เคารพมัน: ssh, scp, sftp, rsync และ git หรือ ansible ที่สร้างบนมัน
User, HostName และ Port. สามบรรทัดนี้ลบรายละเอียดที่ต้องพิมพ์ทุกครั้งทิ้ง: HostName คือ address จริง, User ล็อกชื่อ login และ Port รองรับเซิร์ฟเวอร์ที่ถูกย้ายออกจาก 22 ตอนทำ hardening พอตั้งแล้ว ssh prod-web คือคำสั่งทั้งหมด
IdentityFile. บรรทัดนี้ผูกการเชื่อมต่อกับ private key ตัวใดตัวเดียว — จำเป็นมากเมื่อเซิร์ฟเวอร์หนึ่งใช้ key แบบ ed25519 อีกเครื่องใช้ RSA เพราะ ssh จะหยุดเดาว่าควรยื่น key ตัวไหนก่อน ใช้คู่กับ IdentitiesOnly yes เมื่อ agent ของคุณถือ key ไว้หลายตัว
ProxyJump. บรรทัดวิเศษของสาย bastion ProxyJump bastion บังคับให้ ssh อุโมงค์ TCP connection ผ่าน host ที่ระบุ — ซึ่งเป็น alias ที่นิยามไว้ใน config ก็ได้ — ก่อนถึงปลายทางจริง มันแทนที่แนวทาง ProxyCommand ตั้งแต่ OpenSSH 7.3: สมัย ProxyCommand ต้อง shell out ด้วยอะไรแบบ ssh -W %h:%p แล้วจัดการ quote เองให้ถูก ส่วน ProxyJump เป็น directive ตัวจริงที่เข้าใจ alias ใน config และต่อหลาย hop ด้วย list คั่นด้วย comma
Wildcard Host pattern. Host * match ทุกอย่างและเป็นที่พักตามธรรมชาติของค่า default ระดับ global ส่วน pattern อย่าง Host *.lab.internal หรือ Host web-* ใช้ชุดค่าเดียวกับเครื่องทั้งกลุ่มในครั้งเดียว
ใครมาก่อนได้ก่อน (first match wins). ssh อ่านไฟล์จากบนลงล่าง และสำหรับแต่ละพารามิเตอร์ ค่าแรกที่เจอจะติดค้างไปเลย — block ถัดไป override ไม่ได้ นี่คือเหตุผลที่ block เฉพาะเจาะจงต้องอยู่เหนือ wildcard กว้าง ๆ: ถ้า Host * อยู่บนสุดและตั้ง User deploy ทุกเซิร์ฟเวอร์ข้างล่างจะใช้ user นี้ตลอด วางเฉพาะเจาะจงก่อน catch-all ทีหลัง
นี่คือตัวอย่าง config ที่มี bastion กับเซิร์ฟเวอร์สองเครื่อง ลักษณะเดียวกับที่เครื่องมือสร้างให้:
Host bastion HostName bastion.example.com User ops IdentityFile ~/.ssh/id_ed25519 Host prod-web HostName 10.0.0.5 User admin Port 2222 IdentityFile ~/.ssh/id_ed25519_prod ProxyJump bastion Host prod-db HostName 10.0.0.6 User admin Port 2222 IdentityFile ~/.ssh/id_ed25519_prod ProxyJump bastion Host * AddKeysToAgent yes IdentitiesOnly yes
เมื่อมีไฟล์นี้แล้ว ssh prod-db หมายความว่า: ยืนยันตัวกับ bastion ด้วย key ของ ops แล้วเดินต่อไปยัง 10.0.0.6 ที่ port 2222 ด้วย key ของ prod — ทุกอย่างถูก resolve ให้เอง สองคำ แทน flag ยาวเป็นย่อหน้า
กรณีใช้งานจริง
ระบบ Bastion และ Jump Host
นิยาม bastion เป็น alias ของตัวเองครั้งเดียว แล้วให้ทุกเซิร์ฟเวอร์ภายในมีบรรทัด ProxyJump bastion ส่วน chain หลาย hop ก็แค่คั่นด้วย comma อย่าง ProxyJump edge,core วันที่ address ของ bastion เปลี่ยน คุณแก้ block เดียว แทนการตามล่า shell alias ยี่สิบตัว
ฟาร์มเซิร์ฟเวอร์หลายสิบเครื่อง
สร้าง block ละหนึ่งเซิร์ฟเวอร์ แล้วให้ wildcard แบกค่าที่ใช้ร่วมกัน: Host web-* ตั้ง User deploy และ ServerAliveInterval 60 ให้ทั้ง tier ได้เลย ช่วยให้ session ที่ idle ไม่หลุดกลางทางผ่าน NAT
Git ผ่าน SSH ด้วย key แยกตาม host
ใช้ GitHub บัญชีงานกับบัญชีส่วนตัวบนเครื่องเดียวคือจุดชนกันของ key แบบคลาสสิก สร้าง alias github-work กับ github-personal ตั้ง IdentityFile คนละตัว แล้วชี้ remote ไปที่ git@github-work:org/repo.git git จะรับการ resolve ของ ssh ไปใช้ และยื่น key ที่ถูกตัวเสมอ
บอร์ด IoT บน port ไม่มาตรฐาน
Raspberry Pi และ dev board มักรัน ssh บน port แปลก ๆ อย่าง 2222 พร้อม username default block ที่สร้างมาแล้วหนึ่ง block ต่อบอร์ด — Host pi-garage — เปลี่ยนทุกเครื่องเป็น login สองคำ โดยผ่อน host key checking เฉพาะบอร์ดที่ flash ใหม่บ่อย ๆ ได้ โดยไม่กระทบส่วนอื่น
แนวปฏิบัติที่ดี
- chmod 600 ~/.ssh/config ทุกครั้งที่แก้. ไฟล์นี้อ้างอิง path ของ key และ hostname ภายใน สิทธิ์ที่หลวมเกินไปคือชวนให้คนอื่นแก้ของบนเครื่องที่ใช้ร่วมกัน
- ใช้ key ละหนึ่งวัตถุประสงค์. IdentityFile แยกตาม host หรือตามบทบาท ช่วยจำกัดรัศมีความเสียหายเมื่อ key หลุด
- อย่าเปลี่ยน alias บ่อย. script, git remote และ CI job ผูกกับมันหมด ให้ปฏิบัติ alias เหมือนชื่อ API — ตั้งครั้งเดียวแล้วทิ้งไว้
- ทดสอบด้วย ssh -G. คำสั่งนี้ print config ที่ resolve แล้วทั้งหมดโดยไม่เปิด connection — เร็วที่สุดที่จะเห็นว่า block ไหนชนะการ match
- วาง block เฉพาะเจาะจงไว้บน. เพราะค่าแรกที่ได้จะชนะ pattern Host แคบต้องอยู่เหนือ wildcard กว้าง ไม่งั้น wildcard จะบังมันเงียบ ๆ
เลิกพิมพ์คำสั่ง ssh ยาว ๆ ตั้งแต่วันนี้
คำสั่งเชื่อมต่อยาว ๆ ที่ผิดพลาดง่ายเป็นเรื่องที่เลือกได้ ไม่ใช่ความจำเป็น SSH Config Generator เปลี่ยนรายละเอียดที่คุณรู้อยู่แล้วให้เป็น Host block สะอาด ๆ ที่วางปุ๊บลืมปั๊บ — ฟรี ทำงานในเบราว์เซอร์ และเป็น client-side ทั้งหมด สร้าง config ครั้งเดียว แล้วให้การเชื่อมต่อทุกครั้งหลังจากนี้สั้นเหลือสองคำ
เครื่องมืออื่นที่คุณอาจสนใจ:
- OpenSSL Command Generator — สร้างคำสั่ง openssl สำหรับ key และ certificate โดยไม่ต้องท่อง flag
- Basic Auth Generator — สร้าง credential และ header สำหรับ HTTP Basic Auth เอาไว้ทดสอบ API อย่างรวดเร็ว
- UFW Rules Generator — ล็อกดาวน์เซิร์ฟเวอร์ที่คุณ ssh เข้า ด้วย firewall rule ที่ถูกต้องภายในไม่กี่วินาที
ขอให้ทุกการเชื่อมต่อเป็นเรื่องง่าย!
คำถามที่พบบ่อย
ถ: ไฟล์ ssh config อยู่ที่ไหน?
ตอบ: อยู่ที่ ~/.ssh/config บน Linux และ macOS และที่ %USERPROFILE%\.ssh\config บน Windows ถ้ายังไม่มีไฟล์ให้สร้างขึ้นมา วาง block ของคุณลงไป แล้วตั้งสิทธิ์ด้วย chmod 600
ถ: ต้อง restart อะไรไหมหลังแก้ไฟล์?
ตอบ: ไม่ต้อง OpenSSH อ่านไฟล์นี้ใหม่ทุกครั้งที่เชื่อมต่อ คำสั่ง ssh, scp หรือ git fetch ถัดไปจะใช้ค่าใหม่ทันที
ถ: ProxyJump กับ agent forwarding ต่างกันอย่างไร?
ตอบ: ProxyJump อุโมงค์ TCP connection ผ่าน bastion โดย key ของคุณไม่เคยออกจากเครื่อง ส่วน ForwardAgent เปิดให้ agent ในเครื่องคุณถูกใช้จากเครื่องปลายทาง ซึ่งแปลว่าเครื่องนั้นเข้าถึง key ของคุณได้ระหว่าง session ถ้าเลือกได้ให้ใช้ ProxyJump
ถ: ข้อมูล config ของฉันถูกอัปโหลดไปไหนหรือเปล่า?
ตอบ: ไม่ เครื่องมือทำงานฝั่ง client ล้วน ๆ — hostname, user, port และ path ของ key ไม่เคยออกจากเครื่อง และยังใช้งานได้แม้ offline เมื่อโหลดหน้าเว็บแล้ว