SSH ์์ด์ ํธ ์ ๋ฌ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์๋ฒ์ ํค(์ํธ ์์)๋ฅผ ๋์ง ์๊ณ ๋ก์ปฌ SSH ํค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
GitHub์ ์ํธ ์์ฉํ๋๋ก SSH ํค๋ฅผ ์ด๋ฏธ ์ค์ ํ ๊ฒฝ์ฐ ์๋ง ssh-agent
์ ๋ํด ์ ์๊ณ ์์ ๊ฒ์
๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๊ณ ํค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ์ํ๋ก ์ ์งํ๋ ํ๋ก๊ทธ๋จ์ด๋ฏ๋ก ํค๋ฅผ ์ฌ์ฉํด์ผ ํ ๋๋ง๋ค ์ํธ๋ฅผ ์
๋ ฅํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ฉํ ์ ์ ์ด๋ฏธ ์๋ฒ์์ ์คํ ์ค์ธ ๊ฒ์ฒ๋ผ ์๋ฒ๊ฐ ๋ก์ปฌ ssh-agent
์ ์ก์ธ์คํ๋๋ก ์ ํํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ๋ง์น ์น๊ตฌ์ ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์น๊ตฌ์๊ฒ ์ํธ๋ฅผ ์
๋ ฅํด ๋ฌ๋ผ๊ณ ์์ฒญํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
SSH ์์ด์ ํธ ์ ๋ฌ์ ๋ํ ์์ธํ ์ค๋ช ์ Steve Friedl์ ๊ธฐ์ ํ ๊ฐ์ด๋๋ฅผ ํ์ธํ์ธ์.
SSH ์์ด์ ํธ ์ ๋ฌ ์ค์
์ฌ์ฉ์ ๊ณ ์ ์ SSH ํค๊ฐ ์ค์ ๋๊ณ ์๋ํ๋์ง ํ์ธํฉ๋๋ค. ์์ง ์ด ์์ ์ ์ํํ์ง ์์ ๊ฒฝ์ฐ SSH ํค ์์ฑ์ ๋ํ ๊ฐ์ด๋ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํฐ๋ฏธ๋์ ssh -T git@github.com
์ ์
๋ ฅํ์ฌ ๋ก์ปฌ ํค๊ฐ ์๋ํ๋์ง ํ
์คํธํ ์ ์์ต๋๋ค.
$ ssh -T git@github.com
# Attempt to SSH in to github
> Hi USERNAME! You've successfully authenticated, but GitHub does not provide
> shell access.
์ ์์ํ์ จ์ต๋๋ค. ์์ด์ ํธ๊ฐ ์๋ฒ๋ก ์ ๋ฌ๋๋๋ก SSH๋ฅผ ์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค.
-
์ํ๋ ํ ์คํธ ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ
~/.ssh/config
์์ ํ์ผ์ ์ฝ๋๋ค. ์ด ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ํฐ๋ฏธ๋์touch ~/.ssh/config
์(๋ฅผ) ์ ๋ ฅํ์ฌ ๋ง๋ค ์ ์์ต๋๋ค. -
๋ค์ ํ ์คํธ๋ฅผ ํ์ผ์ ์ ๋ ฅํ์ฌ ์๋ฒ์ ๋๋ฉ์ธ ์ด๋ฆ ๋๋ IP๋ก
example.com
์ ๋ฐ๊ฟ๋๋ค.Host example.com ForwardAgent yes
๊ฒฝ๊ณ
์ด ์ค์ ์ ๋ชจ๋ SSH ์ฐ๊ฒฐ์ ์ ์ฉํ๊ธฐ ์ํด Host *
์์ผ๋์นด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. SSH๋ก ์ฐ๊ฒฐํ๋ ๋ชจ๋ ์๋ฒ์ ๋ก์ปฌ SSH ํค๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ฏ๋ก ์ด๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ์๋ฒ๊ฐ ํค์ ์ง์ ์ก์ธ์คํ ์๋ ์์ง๋ง ์ฐ๊ฒฐ์ด ์ค์ ๋ ๋์์๋ ํค๋ฅผ ๊ทํ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ขฐํ๊ณ , ์์ด์ ํธ ์ ๋ฌ์ ์ฌ์ฉํ๋ ค๋ ์๋ฒ๋ง ์ถ๊ฐํด์ผ ํฉ๋๋ค.
SSH ์์ด์ ํธ ์ ๋ฌ ํ ์คํธ
์์ด์ ํธ ์ ๋ฌ์ด ์๋ฒ์์ ์๋ํ๋์ง ํ
์คํธํ๋ ค๋ฉด ์๋ฒ์ SSH๋ก ์ฐ๊ฒฐํ๊ณ ssh -T git@github.com
์ ํ ๋ฒ ์คํํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ฌธ์ ์์ด ์คํ๋๋ฉด ๋ก์ปฌ์์ ํ๋ ๊ฒ๊ณผ ๋์ผํ ํ๋กฌํํธ๊ฐ ๋ค์ ํ์๋ฉ๋๋ค.
๋ก์ปฌ ํค๊ฐ ์ฌ์ฉ ์ค์ธ์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ ์๋ฒ์์ SSH_AUTH_SOCK
๋ณ์๋ฅผ ๊ฒ์ฌํ ์๋ ์์ต๋๋ค.
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/ssh-4hNGMk8AZX/agent.79453
๋ณ์๊ฐ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์์ด์ ํธ ์ ๋ฌ์ด ์๋ํ์ง ์์์ ์๋ฏธํฉ๋๋ค.
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> [No output]
$ ssh -T git@github.com
# Try to SSH to github
> Permission denied (publickey).
SSH ์์ด์ ํธ ์ ๋ฌ ๋ฌธ์ ํด๊ฒฐ
๋ค์์ SSH ์์ด์ ํธ ์ ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ ์ ์ํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ์ ๋๋ค.
์ฝ๋๋ฅผ ์ฒดํฌ ์์ํ๋ ค๋ฉด SSH URL์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
SSH ์ ๋ฌ์ HTTP(s) URL์ด ์๋๋ผ SSH URL์์๋ง ์๋ํฉ๋๋ค. ์๋ฒ์์ .git/config
ํ์ผ์ ํ์ธํ๊ณ URL์ด ์๋์ ๊ฐ์ SSH ์คํ์ผ URL์ธ์ง ํ์ธํฉ๋๋ค.
[remote "origin"]
url = git@github.com:YOUR_ACCOUNT/YOUR_PROJECT.git
fetch = +refs/heads/*:refs/remotes/origin/*
SSH ํค๋ ๋ก์ปฌ๋ก ์๋ํด์ผ ํฉ๋๋ค.
์์ด์ ํธ ์ ๋ฌ์ ํตํด ํค๋ฅผ ์๋ํ๋ ค๋ฉด ํค๊ฐ ๋จผ์ ๋ก์ปฌ์์ ์๋ํด์ผ ํฉ๋๋ค. SSH ํค ์์ฑ์ ๋ํ ๊ฐ์ด๋๋ SSH ํค๋ฅผ ๋ก์ปฌ๋ก ์ค์ ํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์์คํ ์์ SSH ์์ด์ ํธ ์ ๋ฌ์ ํ์ฉํด์ผ ํฉ๋๋ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์คํ ๊ตฌ์ฑ์ SSH ์์ด์ ํธ ์ ๋ฌ์ ํ์ฉํ์ง ์์ต๋๋ค. ํฐ๋ฏธ๋์ ๋ค์ ๋ช ๋ น์ ์ ๋ ฅํ์ฌ ์์คํ ๊ตฌ์ฑ ํ์ผ์ด ์ฌ์ฉ ์ค์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
$ ssh -v URL
# Connect to the specified URL with verbose debug output
> OpenSSH_8.1p1, LibreSSL 2.7.3
> debug1: Reading configuration data /Users/YOU/.ssh/config
> debug1: Applying options for example.com
> debug1: Reading configuration data /etc/ssh_config
> debug1: Applying options for *
$ exit
# Returns to your local command prompt
์์ ์์ ์์ ํ์ผ ~/.ssh/config
๊ฐ ๋จผ์ ๋ก๋๋ ๋ค์ /etc/ssh_config
๋ฅผ ์ฝ์ต๋๋ค. ๋ค์ ๋ช
๋ น์ ์คํํ์ฌ ์ด ํ์ผ์ด ์ต์
์ ์ฌ์ ์ํ๋์ง ๊ฒ์ฌํ ์ ์์ต๋๋ค.
$ cat /etc/ssh_config
# Print out the /etc/ssh_config file
> Host *
> SendEnv LANG LC_*
> ForwardAgent no
์ด ์์ ์์ /etc/ssh_config
ํ์ผ์ ํนํ ForwardAgent no
๋ฅผ ๋ํ๋ด๋๋ฐ, ์ด๋ ์์ด์ ํธ ์ ๋ฌ์ ์ฐจ๋จํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ํ์ผ์์ ์ด ์ค์ ์ญ์ ํ๋ฉด ์์ด์ ํธ ์ ๋ฌ์ด ๋ค์ ํ ๋ฒ ์๋ํ๊ฒ ๋ฉ๋๋ค.
์๋ฒ์์ ์ธ๋ฐ์ด๋ ์ฐ๊ฒฐ์ ๋ํ SSH ์์ด์ ํธ ์ ๋ฌ์ ํ์ฉํด์ผ ํฉ๋๋ค.
์๋ฒ์์ ์์ด์ ํธ ์ ๋ฌ์ด ์ฐจ๋จ๋ ์๋ ์์ต๋๋ค. ์๋ฒ์ SSH๋ก ์ฐ๊ฒฐํ๊ณ sshd_config
๋ฅผ ์คํํ์ฌ ์์ด์ ํธ ์ ๋ฌ์ด ํ์ฉ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋ช
๋ น์ ์ถ๋ ฅ์ AllowAgentForwarding
์ด ์ค์ ๋์์์ ๋ํ๋ด์ผ ํฉ๋๋ค.
๋ก์ปฌ ssh-agent
๊ฐ ์คํ ์ค์ด์ด์ผ ํฉ๋๋ค.
๋๋ถ๋ถ์ ์ปดํจํฐ์์ ์ด์ ์ฒด์ ๊ฐ ssh-agent
๋ฅผ ์๋์ผ๋ก ์์ํฉ๋๋ค. ๊ทธ๋ฌ๋ Windows์์๋ ์ด ์์
์ ์๋์ผ๋ก ์ํํด์ผ ํฉ๋๋ค. Git Bash๋ฅผ ์ด ๋๋ง๋ค ssh-agent
๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ์ด๋๊ฐ ์์ต๋๋ค.
ssh-agent
๊ฐ ์ปดํจํฐ์์ ์คํ ์ค์ธ์ง ํ์ธํ๋ ค๋ฉด ํฐ๋ฏธ๋์ ๋ค์ ๋ช
๋ น์ ์
๋ ฅํฉ๋๋ค.
$ echo "$SSH_AUTH_SOCK"
# Print out the SSH_AUTH_SOCK variable
> /tmp/launch-kNSlgU/Listeners
ํค๋ฅผ ssh-agent
์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ค์ ๋ช
๋ น์ ์คํํ์ฌ ํค๊ฐ ssh-agent
์ ํ์๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
ssh-add -L
๋ช ๋ น์ ํตํด ์ฌ์ฉํ ์ ์๋ ID๊ฐ ์๋ค๊ณ ํ์๋๋ฉด ํค๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
ssh-add YOUR-KEY
ํ
macOS์์ ์ฌ๋ถํ
ํ๋ ๋์ ssh-agent
๊ฐ ๋ค์ ์์๋๋ฉด ์ด ํค๋ฅผ โ์์ด๋ฒ๋ฆฌ๊ฒโ ๋ฉ๋๋ค. ํ์ง๋ง ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ SSH ํค๋ฅผ ํค ์งํฉ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
ssh-add --apple-use-keychain YOUR-KEY
์ฐธ๊ณ ํญ๋ชฉ
--apple-use-keychain
์ต์
์ ssh-์์ด์ ํธ์ SSH ํค๋ฅผ ์ถ๊ฐํ ๋ ์ํธ๋ฅผ ํค ์ฒด์ธ์ ์ ์ฅํฉ๋๋ค. ํค์ ์ํธ๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ๋ก ์ ํํ ๊ฒฝ์ฐ --apple-use-keychain
์ต์
์์ด ๋ช
๋ น์ ์คํํฉ๋๋ค.
--apple-use-keychain
์ต์
์ ssh-add
์ Apple ํ์ค ๋ฒ์ ์ ์์ต๋๋ค. Monterey(12.0) ์ด์ ์ macOS ๋ฒ์ ์์ --apple-use-keychain
๋ฐ --apple-load-keychain
ํ๋๊ทธ๋ -K
์ -A
๊ตฌ๋ฌธ์ ๊ฐ๊ฐ ์ฌ์ฉํ์ต๋๋ค.
ssh-add
์ Apple ํ์ค ๋ฒ์ ์ด ์ค์น์น๋์ด ์์ง ์์ ๊ฒฝ์ฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ค๋ฅ: ssh-add: illegal option -- apple-use-keychain์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ํธ๋ฅผ ๋ฌป๋ ๋ฉ์์ง๊ฐ ๊ณ์ ํ์๋๋ฉด, ~/.zshrc
ํ์ผ(๋๋ bash์ฉ ~/.bashrc
ํ์ผ)์ ๋ช
๋ น์ ์ถ๊ฐํด์ผ ํ ์ ์์ต๋๋ค.