くろねこ日記

ソフトウェアに関する技術メモが多いです.

bitbucketにgitでpushするとPermission denied (publickey).と表示されるときの解決法

はじめに

gitでbitbucketにpushするときと「Permission denied (publickey)」と表示されて,うまくpushできないときによくやる解決法を載せておきます.

というのも,vimrcやzshrcなどの設定ファイルをbitbucket上に設置しているリモートリポジトリ上にpushして,別なマシンからcloneやpullするというやりかたをしてますが,たまにPermission denied(publickey)なんて表示されて,コマンドが通らない経験をすることがあります. こんなときの解決法を一々ウェブから検索して探すのが面倒なので記録しておきます.

ケース1ケース2という形で書きましたが,よくわからないけどPermission denied(publickey)とでてしまった. という方は順に読んでいただければ多少は参考になるかもしれません.

bitbucket上にSSHキーの登録を行なっていない(ケース1)

bitbucket用に生成した公開鍵をbitbucket上に登録していないパターンです.

その場合はまずは秘密鍵と公開鍵を生成しているか確認してみましょう. もし鍵が~/.sshになければ鍵の作成から行なうことになります.

ここでは一応,sshの生成とgitの設定から順に説明していきますので,その辺は大丈夫な方は 読み飛ばしていただいてください.

次の方法でsshの鍵を生成できます.

cd ~/.ssh(.sshディレクトリがないときはmkdir ~/.sshで生成してください)
ssh-keygen -t rsa -C "bitbucketに登録したメールアドレス"

生成するときに鍵の名前を聞かれますので,任意の名前をつけてあげてください. 特に指定しなければid_rsaという名前になってしまうため,他のキーとの見分けがつきにくいおそれがあります.例えば僕の場合,オープンにしておきたいソースコードについてはgithubにpushしておいて,プライベートなソースコードについてはbitbucketで管理するようにしています.そうなったときにid_rsaという名前だとどちらの鍵なのかわからなくなります.

個人的におすすめの命名法ですが, アップロード先の名前rsaマシン名というようにしてあげます. 例えばbitbucketにmacminiから接続するときに使用する鍵については,

bitbucket_rsa_kuronekomacmini

という具合です.

このような手順を踏んで鍵を生成したら鍵名だけのファイルと鍵名.pubというファイルが生成されると思います. 鍵名.pubのほうは公開鍵,鍵名のみのほうは秘密鍵となっています. 間違っても秘密鍵は誰にも見せないでください.

たまにびっくりすることがありまして秘密鍵も公開鍵も一緒にサーバに置いているのを見たことがあります.これではセキュアな通信などできるわけがありませんね.でも事実そういう例もありますから, 鍵名.pubをbitbucketに登録して,秘密鍵は~/.sshに保管しておくようにしましょう(僕自身への警告でもあったり...).

キーを生成したら,今度は~/.ssh/configに簡単に鍵を管理できるように設定しましょう.

Host bitbucket
  HostName bitbucket.org
  User git
  Port 22
  IdentityFile ~/.ssh/bitbucket_rsa_kuronekomacmini(秘密鍵)
  TCPKeepAlive yes
  IdentitiesOnly yes

次にbitbucketへの鍵登録です. bitbucketへログインして,トップ右上にある人の形をしたアイコンをクリックしましょう. そのなかにmanege acountというのがありますから,クリックしてください. 左側の項目にssh keysというのがあると思います.クリックしてください. そうするとadd keyというボタンがありますからクリックしてlabelに任意の名前とkeyのところに公開鍵をはりつけます. 公開鍵のは貼り付けは

pbcopy < ~/.ssh/鍵名.pub

としてクリップボードへコピーしてあげて,keyのところにペーストしましょう. ペーストしたら右下にあるadd keyをクリックして鍵の登録が終了します.

bitbucketへの登録が済んだらbitbucket上にリポジトリを生成してあげてください.トップの作成から造ることができます.

作成したらgit上での設定を行ないます. すでにローカルリポジトリがあると仮定して話を進めますと,

cd ワーキングディレクトリ
git remote add git@bitbucket.org:ログインユーザ名/リモートリポジトリ名.git

でリモートリポジトリの設定が完了します.

接続テストを行なっていない(ケース2)

鍵の設定は大丈夫,gitも問題なくローカルリポジトリにコミットされている状況にも関わらずPermission denied(public key)という警告をもらうことがあります. そんなときにありがちなのが,bitbucketにうまく接続できていないケースです.おそらくこれが一番多い問題なのかもしれません(勘ですが). このような場合はまずはsshからbitbucketにログインできるか確かめてみましょう.

次のコマンドで確かめることができます

ssh -T git@config上のhostにある登録名

です. config上のhostにある登録名とは何かと言いますと,~/.ssh/config上に登録されている文字列のことです. cofing上にはおそらく次のような形式で書かれています(書いてないときにはケース1を参照).

Host bitbucket
  HostName bitbucket.org
  User git
  Port 22
  IdentityFile ~/.ssh/秘密鍵のファイル名
  TCPKeepAlive yes
  IdentitiesOnly yes

このときに Hostの行に書かれている文字列を@の後ろに持ってきましょう. 僕がよくやってしまうんですが,

ssh -T git@bitbucket.org

です.こうするとbitbucket.orgに接続しようとするのですが,鍵の設定を無視して接続を試みてしまいまして,その結果Permission deniedが返ってきてしまいます. ですので上で示したconfigの形式に従うなら必ず

ssh -T git@bitbucket

としましょう. こうするとパスワードを聞いてくるのでssh-keygenを実行したときのパスワードを入力すればOKです.

最後に

これらのパターンを実施したら,git push origin masterという感じでpushしましょう.