sseze's blog

インターネットとガジェットが好きな人のブログです

bitbucket のプライベートリポジトリを clone しようとしたら "Permission denied" って怒られる

Bitbucket上に作ったプライベートリポジトリを、ローカル環境に初めて clone するときに Permission denied って言われる。

[sseze@centos63 ~]$ git clone git@bitbucket.org:sseze/**********.git
Initialized empty Git repository in /home/sseze/**********/.git/
The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'bitbucket.org,207.223.240.182' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

ここによると、一度 Bitbucket に ssh 接続せよ、と書いてある。なるほど、確かに公開鍵認証通さないで見れるはずがない。

Bitbuket 接続用に ssh-keygen で鍵を作成する。

$ cd .ssh/
$ ssh-keygen -b 2048 -f centos63-key

~/.ssh/config も書いておく。

$ vi ~/.ssh/config
# 以下を追記
# bitbucket 接続用ダミー
Host bb
    User          git
    HostName      bitbucket.org
    IdentityFile  ~/.ssh/centos63-key

config を初めて書く場合は、権限設定も忘れずに。

$ chmod 600 ~/.ssh/config

接続してみる。

[sseze@centos63 .ssh]$ ssh bb
Enter passphrase for key '/home/sseze/.ssh/centos63-key': 
PTY allocation request failed on channel 0
conq: logged in as sseze.

You can use git or hg to connect to Bitbucket. Shell access is disabled.
Connection to bitbucket.org closed.

問題なく接続できたら、git clone できるか試してみる。

[sseze@centos63 ~]$ git clone git@bitbucket.org:sseze/**********.git
Initialized empty Git repository in /home/sseze/**********/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), 15.57 KiB, done.

【番外編】Permission denied (publickey). fatal: The remote end hung up unexpectedly と言われ続けたら…

CentOS で git clone しようとしたところ、公開鍵を登録しても、ずっと Permission denied と怒られたまま、2時間ほど費やしてしまった。
Githubのドキュメントを見て、ようやくミスに気づいた。ssh-add してないじゃん。

CentOS で clone する前、Mac では、ssh-add しなくとも git clone できていた。
Bitbucket の公式ドキュメントによると、MacOSX 10.6.8 以降だと、最初の接続を確立したときに git-agent に読み込まれるらしい。

CentOSにログインする度に、

$ eval ssh-agent
$ ssh-add ~/.ssh/centos63-key

と打ってもいいのだが、tmuxを使ったりする場合、ウィンドウやペインを新規作成する度に ssh-add するのはとても面倒である。
また、上記をそのまま .bash_profile (ログイン時に実行) や .bashrc (シェルにログインする度に実行) に追記すると、毎回秘密鍵のパスフレーズを打たなければならない。これも面倒である。

よって、.bash_profile に以下を追記して、CentOS起動時に ssh-agent の起動、ssh-add への秘密鍵・パスフレーズの登録をまとめて行うようにする。一度パスフレーズを登録してしまえば、CentOSを再起動するまで、パスフレーズは打たずに済む。

# .ssh-agent-info に既に環境変数が書かれていたら読み込む
source ~/.ssh-agent-info

# ssh-agent が立ち上がっているかどうかの判定。
ssh-add -l >&/dev/null

# ssh-add は ssh-agent が立ち上がっていないと不正な使用方法
# として判定される (つまり、終了ステータスは$?=2)
if [ $? == 2 ] ; then
    # $?==2 を満たす場合、ssh-agent を立ち上げる
    echo -n "ssh-agent: restart...."
    ssh-agent >~/.ssh-agent-info
    source ~/.ssh-agent-info
fi

if ssh-add -l >&/dev/null ; then
    # ssh-add -l が正常に実行できる場合 ($?=0)
    echo "ssh-agent: Identity is already stored."
else
    # パスフレーズが登録されていない場合 ($?=1)
    ssh-add ~/.ssh/centos63-key
fi

# http://d.hatena.ne.jp/elwoodblues/20070619/1182240574 に紹介されているものに
# コメントなどを加筆修正。

~/.ssh-agent-info は初回ログイン時には存在しないので、エラーを防ぐために予め

$ touch ~/.ssh-agent-info

しておいても良い。

実行結果を以下に載せておく。

mbp-13-retina:~ sseze$ ssh vbs
sseze@192.168.56.101's password: 
Last login: Thu Jan  3 15:46:17 2013 from 192.168.56.1
Agent pid 1842
ssh-agent: restart....Agent pid 1627
Enter passphrase for /home/sseze/.ssh/centos63-key: 
Identity added: /home/sseze/.ssh/centos63-key (/home/sseze/.ssh/centos63-key)
[sseze@centos63 ~]$ 
  • ログイン2回目以降
Agent pid 1627
ssh-agent: Identity is already stored.
[sseze@centos63 ~]$