# ความเป็นมา

ด้วยความที่บ.ตอนนี้จะย้าย repo จาก Bitbucket Server ไป Github (opens new window) เนื่องด้วยมันจะเลิกทำแล้ว (opens new window) ก็เลยต้องมานั่งเซ็ตอัพแอคกันใหม่

หลังจากที่เริ่มเซ็ตอัพใหม่ ตอนแรกก็คิดอยู่ว่าควรจะ add ตัว org เข้าแอคหลักดีไหม หรือว่าสร้างแอคของบ.แยกไปอีกอันดี ซึ่งท้ายสุดก็สร้างแอคใหม่ไป (เอาจริงๆเหมือน github มันจะไม่แนะนำ (opens new window)ให้สร้างหลายแอคอะนะ)

ทีนี้ปัญหามันมีอยู่ที่ว่า พอจะเพิ่มตัว ssh key ด้วยตัว key หลักของเครื่องเข้าไปในแอคใหม่นี้เข้าไปบน github ปุ๊บ มันดันเด้งเตือนขึ้นมาว่า key นี้ใช้ไปแล้ว ไม่ให้ใช้ซ้ำ

already-in-use

เอาละสิ แบบนี้ทำไงเนี่ย ก็เลยไปนั่งค้นผ่านๆอยู่พักนึง ก็ไปเจอ gui (opens new window)de (opens new window) แนะนำมา ว่าให้เซ็ต host แยกกับ key แยก ก็เลยลองมั่วๆตามดู

# Setup Notes

# Key Generation

ไม่มีอะไรพิเศษ gen key ใหม่ (opens new window) แล้วก็เพิ่มตัว key มันเข้าไปใน ssh-agent ตามปกติ

สมมติว่าชื่อ alph_ed25519 ก็เพิ่มไปด้วย

ssh-add ~/.ssh/alph_ed25519

หลังจากนั้นถ้าไปเช็คดูลิสต์ key ที่ใช้ด้วย ssh-add -l มันก็จะโชว์ตัว key ใหม่นี้ขึ้นไปบน list

notes: ถ้าจะลบ key ออกก็ ssh-add -D แต่มันจะลบทุกคีย์ออกเกลี้ยงลิสต์เลยนะ

# SSH Config - Attempt

ปัญหาหลักจริงๆมันอยู่ตรงที่ ssh config (~/.ssh/config) เนี่ยแหละที่ตอนแรกเซ็ต + เพิ่มไปแล้วก็ยังใช้ไม่ได้

ด้านล่างนี่เป็นค่าของ ssh config ตอนแรกสุดที่ยังไม่ได้ไปแก้อะไร

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519

แต่ด้วยความที่ยังไม่ค่อยเข้าใจ config ดีในตอนแรก ก็ลองเพิ่มไปเลียนแบบตาม gist ที่ไปเจอ

สมมติว่าตั้ง host เป็น github.com-alph ก็ตั้งไปเป็น

Host github.com-alph
  HostName github.com
  User git
  IdentityFile ~/.ssh/alph_ed25519
Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519

ซึ่งพอลองเช็ค ssh ไป github ดูด้วย ssh -T git@github.com-alph แล้ว มันก็ยังขึ้นว่าเรา connect เข้าไปด้วย key หลักผ่านแอคหลักอยู่ดี

หลังจากค้นต่ออีกหน่อย ก็ไปเจอว่า ให้ใส่ ! ยกเว้น host ไปในตัว default ให้มันไปใช้ identity อื่นแทน ก็ลองปรับดู

Host github.com-alph
  HostName github.com
  User git
  IdentityFile ~/.ssh/alph_ed25519
Host * !github.com-alph
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/id_ed25519

แต่หลังจากเช็คต่ออีกทีก็ยังไม่ต่างเนี่ยสิ...

# SSH Config

ท้ายสุดแล้วหลังจากงมต่ออีกหน่อย ถึงได้เจอว่าต้องไปเพิ่ม IdentitiesOnly yes ไปสำหรับตัว default การที่เพิ่ม config นี้ไปจะทำให้มันไม่พยายามยัดทุก key (IdentityFile) ใน default (*) เข้าไปทุกหนที่เราจะต่อ

linux - How do I configure SSH so it doesn't try all the identity files automatically? - Super User (opens new window)

เพราะด้วยเหตุนี้เอง เลยทำให้ตอนแรกสุด ต่อให้ host มันตรง มันเข้ามา default แล้วก็เจอยัด key แรกสุดไป ซึ่ง key นี้มันเชื่อมกับแอคหลักไปอยู่แล้ว ก็เลยผ่านเลยก่อนที่จะย้ายไปใช้ key อันใหม่

Host github.com-alph
  HostName github.com
  User git
  IdentityFile ~/.ssh/alph_ed25519
Host * !github.com-alph
  UseKeychain yes
  AddKeysToAgent yes
  IdentitiesOnly yes
  IdentityFile ~/.ssh/id_ed25519

หลังจากเพิ่มเข้าไปตามด้านบน คราวนี้พอลองเทสต์เชื่อมดูก็ได้ถูกต้องละ

ssh-result

ซึ่งหลังจากปรับตรงนี้เสร็จแล้ว ที่เหลือก็แค่เวลาจะเพิ่ม remote แทนที่จะเพิ่มด้วย git@github.com:path/to/repo ก็ให้เปลี่ยนเป็น git@<hostname>:path/to/repo แทน อย่างเคสข้างบนนี้ที่ตั้งเป็น github.com-alph ก็เปลี่ยนเป็น git@github.com-alph:path/to/repo แทน เช่น

git clone git@github.com-alph:path/to/repo
git remote add origin git@github.com-alph:path/to/repo

ส่วนถ้าเกิดใช้เป็น github.com เฉยๆตามเคย มันก็จะใช้ตัว key หลักของเราเหมือนเดิม