คำตอบสั้น ๆ: ตั้งชื่อย่อให้เซิร์ฟเวอร์ในไฟล์ ~/.ssh/config เพื่อ SSH, scp และ rsync ได้ด้วยคำสั่งสั้น ๆ โดยไม่ต้องจำ IP พอร์ต และ Key รวมถึงกันการหลุดและเข้าผ่าน Jump Host
คู่มือนี้อธิบาย config ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อดูแลเซิร์ฟเวอร์หลายเครื่อง การพิมพ์ ssh -p 2222 -i ~/.ssh/id_ed25519_web [email protected] ทุกครั้งทั้งเสียเวลาและผิดง่าย ไฟล์ ~/.ssh/config บนเครื่องของคุณ (ฝั่ง Client) ช่วยให้ตั้งชื่อย่อให้แต่ละเซิร์ฟเวอร์ พร้อมเก็บผู้ใช้ พอร์ต และ Key ที่ต้องใช้ จากนั้นพิมพ์เพียง ssh web1 ก็เข้าได้ และชื่อย่อเดียวกันนี้ใช้ได้กับ scp, sftp, rsync และ git ด้วย
ไฟล์นี้เป็นการตั้งค่าของโปรแกรม OpenSSH Client จึงไม่ต้องแก้อะไรบนเซิร์ฟเวอร์ และไม่ต้องใช้สิทธิ์ sudo
สิ่งที่ต้องเตรียม
- เครื่อง Linux, macOS หรือ Windows 10/11 ที่มี OpenSSH Client (ตรวจด้วย
ssh -V) - ข้อมูลการเชื่อมต่อของแต่ละเซิร์ฟเวอร์: IP หรือโดเมน ผู้ใช้ พอร์ต และไฟล์ Private Key ถ้ายังไม่มี Key ดู ตั้งค่า SSH Key และปิดการเข้าสู่ระบบด้วยรหัสผ่านบน Linux
ขั้นตอนที่ 1: สร้างไฟล์และตั้งสิทธิ์
บน Linux และ macOS
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
บน Windows ไฟล์อยู่ที่ C:\Users\ชื่อผู้ใช้\.ssh\config (ไม่มีนามสกุล) สร้างได้ด้วย PowerShell
New-Item -ItemType Directory -Force $HOME\.ssh
notepad $HOME\.ssh\config
ถ้า Notepad บันทึกเป็น config.txt ให้เปลี่ยนชื่อเอานามสกุลออก บน Linux และ macOS สิทธิ์ของไฟล์สำคัญ ถ้าผู้ใช้อื่นเขียนไฟล์ได้ SSH จะปฏิเสธด้วยข้อความ Bad owner or permissions
ขั้นตอนที่ 2: เพิ่มเซิร์ฟเวอร์เครื่องแรก
Host web1
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_web
IdentitiesOnly yes
| คำสั่ง | ความหมาย |
|---|---|
Host | ชื่อย่อที่คุณจะพิมพ์ ตั้งได้ตามใจ ไม่ต้องตรงกับชื่อเครื่องจริง |
HostName | IP หรือโดเมนจริงของเซิร์ฟเวอร์ |
User | ผู้ใช้ที่ใช้ Login |
Port | พอร์ต SSH |
IdentityFile | ไฟล์ Private Key ที่จะใช้ |
IdentitiesOnly yes | ใช้เฉพาะ Key ที่ระบุ ไม่ลองทุก Key ใน ssh-agent ป้องกัน Error Too many authentication failures |
บันทึกไฟล์แล้วทดสอบ
ssh web1
ควรเข้าเซิร์ฟเวอร์ได้ทันทีเหมือนพิมพ์คำสั่งเต็ม การเยื้องบรรทัดไม่มีผลต่อการทำงาน แต่ช่วยให้อ่านง่ายว่าค่าใดเป็นของ Host ไหน
ขั้นตอนที่ 3: เพิ่มหลายเครื่องและค่ากลาง
ตัวอย่างไฟล์ที่ใช้งานจริงกับ 3 เครื่อง พร้อมค่ากลางสำหรับทุกเครื่อง
Host web1
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_web
Host web2
HostName 203.0.113.11
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_web
Host db1
HostName 10.0.0.5
User admin
ProxyJump web1
Host *
IdentitiesOnly yes
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
หลักสำคัญที่ต้องรู้คือ SSH อ่านไฟล์จากบนลงล่าง และใช้ค่าแรกที่พบสำหรับแต่ละคำสั่ง ค่าที่ตั้งภายหลังจะไม่ทับค่าก่อนหน้า ดังนั้นให้วางบล็อกเฉพาะเครื่องไว้ด้านบน และวาง Host * ซึ่งเป็นค่ากลางไว้ท้ายสุดเสมอ ถ้าวาง Host * ไว้บนสุด ค่าในนั้นจะชนะค่าของทุกเครื่อง
Host รับได้หลายชื่อและรับ Wildcard เช่น Host web1 web2 หรือ Host *.example.com ใช้รวมค่าที่เหมือนกันได้
ขั้นตอนที่ 4: กัน SSH หลุดเมื่อไม่ได้ใช้งาน
Firewall หรือ Router ระหว่างทางมักตัดการเชื่อมต่อที่เงียบนานเกินไป ค่า ServerAliveInterval 60 ให้ Client ส่งสัญญาณเล็ก ๆ ไปทุก 60 วินาที และ ServerAliveCountMax 3 ให้ตัดการเชื่อมต่อเองถ้าไม่ได้รับคำตอบ 3 ครั้งติดกัน แทนที่จะค้างนิ่ง วิธีนี้ช่วยได้กับการหลุดจากการไม่ใช้งาน แต่ไม่ช่วยเมื่ออินเทอร์เน็ตขาดจริง ถ้ากำลังรันงานยาว ให้ใช้ tmux ร่วมด้วย
ขั้นตอนที่ 5: เข้าเครื่องหลัง Jump Host ด้วย ProxyJump
ในตัวอย่างข้างต้น db1 มีเฉพาะ IP ภายใน 10.0.0.5 ที่เข้าจากอินเทอร์เน็ตไม่ได้ ProxyJump web1 ทำให้ SSH เชื่อมต่อผ่าน web1 ก่อนแล้วต่อไปยัง db1 โดยอัตโนมัติ การยืนยันตัวตนกับ db1 ยังทำจากเครื่องของคุณ Private Key จึงไม่ต้องไปวางไว้บน web1
ssh db1