Python学習の8日目は、GitHubへアクセスするためにクライアントPCへのSSHキー設定(~/.ssh/config)の方法と「git clone」について学びました。
クライアントPC(Ubuntu)とGitHubを連携させる
前回、時計サービスを提供しているVPSにGitをインストールし、GitHubと連携させました。
今回は、普段使っているUbuntu環境からもPython開発ができるよう、Gitのインストールと初期設定を行いました。
$ sudo apt update $ sudo apt install git $ git config --global user.name "ユーザ名" $ git config --global user.email "メールアドレス"
GitHub接続用のSSHキー準備
別の用途で使用するためのSSHキーがすでに複数作成されていたので、用途を判別しやすいように以下のようにキーの名前を変更して、GitHub用のキーを作成しました。
$ ssh-keygen -t ed25519 -C "tamohiko@server-memo.net" Generating public/private ed25519 key pair. Enter file in which to save the key (/home/tamohiko/.ssh/id_ed25519): /home/tamohiko/.ssh/ed25519_GitHub Enter passphrase (empty for no passphrase): Enter same passphrase again:
- 秘密鍵:/home/tamohiko/.ssh/ed25519_GitHub
- 公開鍵:/home/tamohiko/.ssh/ed25519_GitHub.pub
接続テストも問題無いようです。
$ ssh -T git@github.com Hi servermemo! You've successfully authenticated, but GitHub does not provide shell access.
git cloneでリポジトリをコピーしようとしたら…
ローカルPCにインストールしたGitの準備が整ったので、いよいよGitHubからリポジトリをダウンロードしてみることにします。
GitHubにあるリポジトリをローカルのPCにダウンロードするためには、「git clone」を使うとGemini先生に教えてもらいました。
まずは、リポジトリをダウンロードするためのディレクトリとして「~/project」を作成し、そこでgit cloneを実行しました。
$ mkdir ~/porject $ cd ~/porject $ git clone github.com:servermemo/time_app.git Cloning into 'time_app'... @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for '/home/tamohiko/.ssh/id_ecdsa' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "/home/tamohiko/.ssh/id_ecdsa": bad permissions tamohiko@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
cloneに失敗してしまいました…
エラーメッセージを見ると、「id_ecdsa」というキーを読みに行こうとしており、そのパーミッションが0644で「Permissions 0644 for '/home/tamohiko/.ssh/id_ecdsa' are too open.(パーミッションが緩すぎます)」と指摘されています。
なぜ違う鍵を読み込もうとしたの?
GitHub接続用に「ed25519_GitHub」という名前のSSHキーを作成したはずなのに、なぜか「id_ecdsa」というキーを読みに行っています。
調べてみると、SSHクライアントは、ローカルPCに複数のSSH秘密鍵がある場合、デフォルトで特定の名前の鍵(例: id_rsa, id_ed25519など)を自動的に試す動きをするようです。
今回は、以前別の作業でテスト用に作成した「id_ecdsa」という名前のキーがたまたま存在していたため、Gitコマンドがそれを読み込んでしまい、パーミッションエラーで止まってしまった、というわけです。
正直、「sshコマンドで接続するときは-iオプションで秘密鍵を指定するのに、Gitだと不要なのかな?」と少し疑問には思っていました。
前回VPSから作業した際は問題なくGitHubにpushできていたので、Gitコマンドが自動で適切なキーを探してくれると勘違いしていたんですね。
VPSでは、デフォルト設定の「id_ed25519」という名前でSSHキーを作成していたため、たまたま問題なく接続できていた、というカラクリでした。
ちなみに、id_rsa, id_ed25519といった名前のSSHキーが「~/.ssh」ディレクトリ内に存在しない場合は、以下の用のエラーメッセージが表示されます。
$ git clone github.com:servermemo/time_app.git Cloning into 'time_app'... tamohiko@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
SSH Configを設定して解決!
では、GitHubに接続するためのSSHキーを指定する場合は、どのようにすれば良いのでしょうか?
Ubuntuの場合、「~/.ssh/config」というファイルを作成し、そこに設定を記述するのが一般的な方法です。
私の環境では、すでに「~/.ssh/config」に複数の設定があったので、そこに以下の内容を追記しました。
Host github.com HostName github.com User git IdentityFile ~/.ssh/ed25519_GitHub IdentitiesOnly yes
- Host: この設定が適用されるホスト名
- HostName: 実際の接続先ホスト名
- User: 接続時のユーザー名(GitHubの場合はgit)
- IdentityFile: 使用する秘密鍵のパスを指定
- IdentitiesOnly yes: IdentityFileで指定した秘密鍵のみを使用し、他の鍵を自動的に試さないようにする
「~/.ssh/config」を新規作成する方法や、その他の詳しい設定については以下の記事でまとめていますので、よろしければ参考にしてみてください。

設定が完了した後、改めて接続テストを行ったところ、無事に成功しました!
$ ssh -T git@github.com Hi servermemo! You've successfully authenticated, but GitHub does not provide shell access.
でも、最初もこの接続テストは成功してたのですけどね…
git clone リベンジ成功!
「~/.ssh/config」の設定が終わったので、再度「git clone」を行ってみます。
$ git clone github.com:servermemo/time_app.git Cloning into 'time_app'... remote: Enumerating objects: 67, done. remote: Counting objects: 100% (67/67), done. remote: Compressing objects: 100% (38/38), done. remote: Total 67 (delta 0), reused 64 (delta 0), pack-reused 0 (from 0) Receiving objects: 100% (67/67), 8.59 MiB | 2.62 MiB/s, done.
エラーもなく、スムーズに処理が完了しました!
これでtime_appリポジトリの内容がローカルにコピーされたはずです。
ダウンロードされたファイルを確認してみましょう。
$ ls time_app README.md __pycache__ png_to_jpeg.py static templates time_app.py
必要なファイルがすべてローカルに用意されました。
まとめ:GitHub連携の第一歩!SSHキー設定とgit clone
今回は、普段使っているUbuntu環境からGitHubを使って開発を始めるための、重要なステップを学びました。
SSHキーの設定と、リモートリポジトリをローカルにコピーする「git clone」コマンドです。
SSHキー設定のポイント
GitHubへのセキュアな接続にはSSHキーが必須です。
通常、GitHubへSSHキーを使って接続する場合、「~/.ssh/config」ファイルに設定を行うのが一般的です。
この設定がないと、SSHクライアントは「id_rsa」や「id_ed25519」といった特定の名前の鍵を自動的に試行します。
もし複数のSSHキーを使い分けていたり、デフォルト以外の名前の鍵を使いたい場合は、「~/.ssh/config」に明示的に設定を記述する必要があります。
これにより、意図した鍵で確実に接続できるようになります。
git cloneでリポジトリをローカルにコピー
「git clone」コマンドを使えば、GitHub上のリポジトリを簡単にローカル環境にダウンロードできます。
このコマンドを実行することで、リモートリポジトリの全履歴を含んだコピーがローカルに作成され、すぐに開発を始める準備が整います。
コメント