github初めの一歩

githubを始めようと、他のサイトやらを参考にアカウントの取得、アバターの設定、リポジトリの作成はできた。だけど

  • SSHって何?
  • 公開鍵の登録って何?
  • ssh-keygenやssh-addって一体何をやってんのよ?

ってな状態だったので、ちょっと調べてみた。SSHの仕組みについては本やWebなどに任せるとして、githubにpushするときに必要になる公開鍵を登録するところ〜初めてのpushまでに関して書いてみる。なお、gitはインストール済みいう前提。
間違ったことを書いている可能性が高いです。コメント欄にてツッコミください。
ちょ!そこ!激しく今更感が漂いまくりとか言うのやめなさい!

鍵の作成

http://github.com でちゃちゃっとアカウント作ったら、「アカウントの設定」から「SSH公開鍵」のページへ。push*1するときにSSHを使うので、あらかじめ自分が使う公開鍵をgithubに登録しておく必要があるとのことだ。
公開鍵暗号で使用する秘密鍵と公開鍵は必ずペアでないと作れない。これをやってくれるコマンドがssh-keygenだ。

$ssh-keygen

をクライアント側(あなたのPC)で実行すると、

鍵を保存するファイルの名前
入力しなければデフォルトの名前になる
秘密鍵を復号化するためのパスフレーズ(パスワードみたいなもん)
入力しなければ、秘密鍵にアクセスする際のパスワードを設定しないことになり、パスなしで秘密鍵を使える。ただし、セキュリティを考慮すると、設定しといた方が良いらしい*2

を聞かれる。これ以降は、ファイル名を指定せずにデフォルトの名前(id_rsa、id_rsa.pub)にしたと仮定して話しを続ける。
パスフレーズを入力すると、秘密鍵と公開鍵を保存した2個のファイルがホームディレクトリ以下の.sshディレクト*3にできる。id_rsa秘密鍵を、id_rsa.pubは公開鍵を保存したファイル。公開鍵のファイルの内容を任意の名前と共にgithubに登録することになる。
んで、英語なんてわかんねーよ!!ってな人へ贈るGithub入門 for MacOS - Seasons.NET ではここらへんでchmodとssh-addをやっているけど、他のブログ等では書いてない所が多い。なので、これは一体何をやっているのか気になったので調べてみた。
まず、chmodはパーミッションの設定だわね。言うまでもないかもしれないけど。「600」は「所有者は読み書き可能、所有者以外はファイルに対する操作は一切不可」ということらしい。上記blogに「セキュリティ的にザル」って書いてあるので、chmodしないと、他人が読める(もしかしたら書き込みも?)できる状態だったのかな。セキュリティを考慮して、自分以外からのアクセスを不可にしたわけね。
問題は次のssh-addに関して。これはssh-agent*4に対して、秘密鍵の登録などを行ってくれるコマンドらしい。これをやっとくと、秘密鍵を使うたびにいちいちパスフレーズを入力せずにすむそうだ*5。要は、毎回入力すんの('A`)マンドクセから、秘密鍵を登録しとくとお手軽やねってことかな?ちなみに、ssh-addは秘密鍵の登録だけでなく、確認や削除もおこなえるらしい。

さて、先日僕がコメント欄に書き込んだ内容に関してだけど、

それとも、秘密鍵は1つのシステムは1個しか持てず、それから生成したどの公開鍵で暗号化した暗号文も、1つの秘密鍵で復号化できる、ということなのでしょうか?

というのは、ssh-keygenを実行すればいくらでも秘密鍵と公開鍵のペアを作成できるのだから、間違いやね。

リポジトリの作成、初めてのpush

さて、次にリポジトリを作る*6githubダッシュボードのページから「Create a Repository」を選ぶと空っぽのリポジトリが作られる。必要事項を入力してプロジェクトを作ってみると*7

全体設定
  ダウンロードおよびインストール Git
  git config --global user.name "githubのユーザ名"
  git config --global user.email githubに登録したメールアドレス

次の手順:
  mkdir test
  cd test
  git init
  touch README
  git add README
  git commit -m 'first commit'
  git remote add origin git@github.com:yagiey/test.git
  git push origin master

すでにGitリポジトリがありますか?
  cd existing_git_repo
  git remote add origin git@github.com:yagiey/test.git
  git push origin master

Subversionのリポジトリを取り込みたい?
  ここをクリック

終わったら
  続ける

っていうページが表示されるので、「次の手順:」の項目までやるとREADMEのみを含んだリポジトリの出来上がり。git pushの行を実行すると

The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is **:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Identity added: /Users/yagiey/.ssh/id_rsa (/Users/yagiey/.ssh/id_rsa)
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:yagiey/test.git
* [new branch] master -> master

って表示される*8。yes/noの入力を要求しているところは、今まで接続したことないホストだけどこのまま接続するかを尋ねているらしい。もちろん初めてなのでyesを入力。その後に「Identity added」って言ってるから、ssh-addに相当することをやってくれたってことかな。よく分からん。

ってことで

少し賢くなった。

あとは

gitについて勉強して慣れるだけ!

*1:ローカルでの変更内容をgithubリポジトリへ反映させること。ちなみに、作業内容をローカルのリポジトリへ反映させることはcommitというらしい。

*2:っていうか、パスフレーズを設定したとしても、pushの時に一度パスフレーズを入力すれば、その後はいちいち入力しなくていいっぽい。

*3:存在しなければ作られる?

*4:秘密鍵を保持し鍵を用いる操作(署名など)を行うソフトウェアのこと

*5:しかし前述の通り、僕の環境ではssh-addをやらなくても、pushで一度パスフレーズを入力したら、その後入力しなくてもよくなった。どういうこっちゃ?

*6:鍵登録の前に作っておいても全く問題ない

*7:ここでは「test」という名前にした

*8:RSA key fingerprintは書いても問題ないと思うけど、何となく気持ちが悪いので伏せた。