태그 보관물: git

SSH Permission denied (publickey)

주로 시스템을 설정하는 초기에 발생하는 문제인데 private key가 제대로 있고 file permission도 잘 설정 되어 있음에도 ssh 접속을 시도하면 권한 오류가 발생하는 경우가 있다.

$ ssh -T git@github.com
git@github.com: Permission denied (publickey). 

해결하는 방법은 사용하려는 private key를 ssh-add 명령어를 이용해서 ssh-agent에게 추가해 주는 것인데, 만약 ssh-agent가 동작하지 않는 상태라면 이 동작에도 오류가 발생한다.

$ ssh-add ~/.ssh/my_private_key 
Could not open a connection to your authentication agent.

이와 같은 인증 agent 관련한 문제가 생길 때는 ssh-agent를 실행해서 나오는 결과물을 화면에 붙여 넣으면 된다.

# SSH-agent를 실행하면 환경변수 값들이 화면에 출력된다.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;

# 이것들을 그대로 화면에 붙여넣고
$ SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;
Agent pid 3261

# ssh-add를 시도한다.
$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

그런데 복붙하는 건 너무 번거로우니까 eval command를 사용해서 ssh-agent의 결과물을 그대로 수행하도록 하면 복붙한 것과 동일한 효과를 낼 수 있다.

$ eval `ssh-agent`
Agent pid 4416

$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

매번 로그인 할 때 마다 반복 하는 건 귀찮으니까 .bashrc 같은곳에 넣어두자.

#.bashrc
...
eval `ssh-agent`
ssh-add ~/.ssh/my_private_key

다시 로그인해서 시험해보면 permission error가 없이 잘 실행되는 걸 볼 수 있다.

$ ssh -T git@github.com
Hi litcoder! You've successfully authenticated, but GitHub does not provide shell access.

Firewall 바깥의 git을 clone하기

Firewall등이 막고 있어서 외부의 git repository를 HTTPS로는 clone할 수 있지만 SSH로는 막히는 경우가 있다. 특히나 GitHub의 two-factor authentication을 설정한 경우라면 매번 token값을 입력하는 것 때문에 commit을 push하는게 매우 귀찮아진다.

이 문제는 ssh config file에 Proxy command를 설정해서 해결할 수 있는데
${HOME}/.ssh/config에 다음과 같이 추가해 주고, credential caching을 설정해 준다. (-S option에는 SOCKS port를 설정해야 함)

Host GitHub.com
  HostName github.com
  User git
  Port 22
  PorxyCommand connect-proxy -S {proxy-server}:{socks-port} %h %p

[Tip] Git:삭제한 file들 한번에 정리하기

Git repository에서 많은 파일들을 삭제하고 적용하는 경우, git rm 명령어로 파일이름들을 하나하나 입력해 주는것은 무척 귀찮다. 예전에는 세로 편집이 되는 Ultra-edit 같은 utility로 삭제된 목록을 복사한 다음 git rm 명령어 line으로 편집해서 다시 terminal에 붙여 넣는 삽질을 했었다.

Git-ls-files command를 쓰면 더 이상 그럴 필요가 없다. 이 command는 repository의 file들을 지정한 상태별로 알려준다. 예를들어, 삭제된 file의 목록을 보려면 다음과 같이 하면 된다.

git ls-files --deleted

이렇게 얻어진 목록을 git rm command에 넘겨도 대부분의 경우 동작하겠지만, 파일 이름에 공백문자를 포함하는 경우에는 제대로 동작하지 않는다. 공백문자에 대해서도 제대로 동작하도록 sed로 공백문자 앞에 ‘\’를 삽입하려면 다음과 같이 한다.

git ls-files --delete|sed 's/ /\\ /g'|xargs git rm