LinuxでGitを使う|SSH鍵を作ってGitHubにつなぐ【初心者向け】

前の記事では、curl と wget で、Web API を叩いたりファイルをダウンロードしたりしました。Lv3 の最後は、作ったスクリプトを安全に保管し、ほかのパソコンやサーバーでも使えるようにするための Git と GitHub です。

私が初めて Linux から GitHub に push しようとしたとき、パスワードを入れても通らず、「Permission denied (publickey)」という見慣れないエラーで止まってしまいました。今の GitHub では、コマンドからつなぐときにふつうのパスワードは使えず、SSH 鍵などの別の方法でつなぐ必要があったんです。

この記事では、Linux で Git を使い始める準備をして、SSH 鍵を作り、GitHub につなぐところまでを、順番に見ていきます。

💡
この記事でわかること
  • Linux に Git を入れて、名前とメールアドレスを設定する方法
  • 練習用のリポジトリで、最初のコミット(=Git に、ファイルの変更を記録として残すこと)を作る方法
  • SSH 鍵とは何か(秘密鍵と公開鍵のちがい)
  • ssh-keygen で鍵を作る方法と、鍵ファイルの権限
  • GitHub に公開鍵を登録して、ssh -T でつながるか確かめる方法
  • SSH の URL で push する流れ
🔰
この記事の前提
  • sudo apt install でソフトを入れられる
  • ファイルの権限(rw-・600 など)の読み方がわかる
  • GitHub のアカウントを持っている(GitHub につなぐところだけ必要)

まだの方は、前の記事「Linuxのcurlとwget|コマンドでWeb APIを叩く・ファイルを落とす【初心者向け】」と、Lv2 の権限の記事から読むのがおすすめです。

💡
用語メモ
  • API:プログラム同士がデータをやりとりするための窓口
  • サーバー:ほかのパソコンやアプリにサービスを提供するコンピューター。24時間動かしておくことが多いです
  • .env ファイル:APIキーなどの秘密の設定を、名前=値 の形で書いておくファイル。人に渡したり、Git に入れたりしません
  • トークン:ログインした状態や、使ってよい範囲を表す文字列。APIキーと同じく、パスワードと同じように人に見せてはいけません

用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。


結論:秘密鍵は自分だけ、公開鍵を GitHub に渡す

やること コマンド・操作
Git を入れる sudo apt install git
名前とメールを設定 git config --global user.name "kaito" など
SSH 鍵を作る ssh-keygen -t ed25519 -C "[email protected]"
公開鍵を表示する cat ~/.ssh/id_ed25519.pub
GitHub に登録 Settings → SSH and GPG keys → New SSH key
つながるか確かめる ssh -T [email protected]
SSH の URL で push git remote add origin [email protected]:… → git push

SSH 鍵のしくみ

Git を入れて、名前とメールを設定する

まず、Git が入っているか確かめます。

  • 1
git --version

🖥️
この記事の出力例について

ここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。

(例)

  • 1
  • 2
kaito@demo:~/linux-practice$ git --version
-bash: git: command not found

Debian 13 の検証環境では Git が入っておらず、command not found(日本語の環境では コマンドが見つかりません)と表示されました。

入っていなければ、apt で入れます。

  • 1
  • 2
  • 3
sudo apt update
sudo apt install git
git --version

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
kaito@demo:~/linux-practice$ sudo apt update
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Fetched 231 kB in 0s (4358 kB/s)
All packages are up to date.
kaito@demo:~/linux-practice$ sudo apt install git
Installing:
  git

Installing dependencies:
  git-man  libcurl3t64-gnutls  liberror-perl  libngtcp2-16  libngtcp2-crypto-gnutls8

Suggested packages:
  gettext-base  git-doc  git-email  git-gui  gitk  gitweb  git-cvs  git-mediawiki  git-svn

Summary:
  Upgrading: 0, Installing: 6, Removing: 0, Not Upgrading: 0
  Download size: 11.6 MB
  Space needed: 54.2 MB / 108 GB available

Continue? [Y/n] Y
…(途中省略)…
Processing triggers for man-db (2.13.1-1) ...
Processing triggers for libc-bin (2.41-12+deb13u4) ...
kaito@demo:~/linux-practice$ git --version
git version 2.47.3

apt update の出力は最後の2行だけ、apt install の出力は途中を省略しています。Continue? [Y/n] には Y と答えます。sudo のパスワードを聞かれたら、自分のパスワードを打ってください。

コミットに記録される名前とメールアドレスを設定します。GitHub で公開したときに見えるので、本名やふだんのメールを出したくない場合は、GitHub が用意している「noreply」のアドレスを使う方法もあります。この記事ではダミーの値で進めます。

  • 1
  • 2
  • 3
  • 4
git config --global user.name "kaito"
git config --global user.email "[email protected]"
git config --global init.defaultBranch main
git config --global --list

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~/linux-practice$ git config --global user.name "kaito"
kaito@demo:~/linux-practice$ git config --global user.email "[email protected]"
kaito@demo:~/linux-practice$ git config --global init.defaultBranch main
kaito@demo:~/linux-practice$ git config --global --list
user.name=kaito
user.email=kaito@example.com
init.defaultbranch=main

設定の名前は、表示では init.defaultbranch のように小文字になります。

init.defaultBranch main は、新しいリポジトリの最初のブランチ名を main にする設定です。GitHub の初期設定とそろえておくと、あとで迷いません。


練習用のリポジトリで、最初のコミットを作る

練習は ~/linux-practice/git-test の中で行います。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
mkdir -p ~/linux-practice/git-test
cd ~/linux-practice/git-test
git init
echo "# Linux の練習用リポジトリ" > README.md
echo 'echo "hello from kaito"' > hello.sh
git add README.md hello.sh
git commit -m "最初のコミット"
git log --oneline

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
kaito@demo:~/linux-practice$ mkdir -p ~/linux-practice/git-test
kaito@demo:~/linux-practice$ cd ~/linux-practice/git-test
kaito@demo:~/linux-practice/git-test$ git init
Initialized empty Git repository in /home/kaito/linux-practice/git-test/.git/
kaito@demo:~/linux-practice/git-test$ echo "# Linux の練習用リポジトリ" > README.md
kaito@demo:~/linux-practice/git-test$ echo 'echo "hello from kaito"' > hello.sh
kaito@demo:~/linux-practice/git-test$ git add README.md hello.sh
kaito@demo:~/linux-practice/git-test$ git commit -m "最初のコミット"
[main (root-commit) 0dd2237] 最初のコミット
 2 files changed, 2 insertions(+)
 create mode 100644 README.md
 create mode 100644 hello.sh
kaito@demo:~/linux-practice/git-test$ git log --oneline
0dd2237 (HEAD -> main) 最初のコミット

0dd2237 はコミットごとにつく番号(ハッシュ)の先頭で、人によってちがいます。先に init.defaultBranch main を設定したので、git init でブランチ名についての案内(hint: の行)は出ませんでした。

add や commit のくわしい意味は、関連する記事の「Git入門」で解説しています。ここでは、GitHub に送る前の準備ができれば大丈夫です。

create mode 100644 の 100644 は、「ふつうのファイル(実行権限なし)」として記録した、という意味です。Git は、ファイルに実行権限(x)がついているかどうかも記録します。hello.sh を ./hello.sh で動かせるスクリプトとして残したいときは、シェルスクリプトの記事と同じように chmod u+x hello.sh をしてから git add すると、100755(実行できるファイル)として記録されます。コミットしたあとに chmod した場合は、次のコミットで mode change 100644 => 100755 と表示されて、権限の変化だけが記録されます。

実際に、コミットしたあとの hello.sh に chmod u+x をして、Git にどう見えるかを確かめてみます。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
ls -l hello.sh
chmod u+x hello.sh
ls -l hello.sh
git status
git status --short
git diff
git add hello.sh
git commit -m "hello.sh に実行権限をつける"
git log --oneline

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
kaito@demo:~/linux-practice/git-test$ ls -l hello.sh
-rw-rw-r-- 1 kaito kaito 24 Nov  1 05:56 hello.sh
kaito@demo:~/linux-practice/git-test$ chmod u+x hello.sh
kaito@demo:~/linux-practice/git-test$ ls -l hello.sh
-rwxrw-r-- 1 kaito kaito 24 Nov  1 05:56 hello.sh
kaito@demo:~/linux-practice/git-test$ git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   hello.sh

no changes added to commit (use "git add" and/or "git commit -a")
kaito@demo:~/linux-practice/git-test$ git status --short
 M hello.sh
kaito@demo:~/linux-practice/git-test$ git diff
diff --git a/hello.sh b/hello.sh
old mode 100644
new mode 100755
kaito@demo:~/linux-practice/git-test$ git add hello.sh
kaito@demo:~/linux-practice/git-test$ git commit -m "hello.sh に実行権限をつける"
[main 2774da4] hello.sh に実行権限をつける
 1 file changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 hello.sh
kaito@demo:~/linux-practice/git-test$ git log --oneline
2774da4 (HEAD -> main) hello.sh に実行権限をつける
33aeb41 最初のコミット

Debian 13での実行画面

中身は1文字も変えていないのに、git status --short では M(変更あり)と表示されました。git diff を見ると、中身の差ではなく old mode 100644 と new mode 100755 の2行だけが出ます。これが「権限だけが変わった」という意味です。コミットすると mode change 100644 => 100755 hello.sh と表示され、0 insertions(+), 0 deletions(-)(足した行も消した行もなし)になっています。2774da4 や 33aeb41 のような番号は、人によって、また試すたびにちがいます(この例は上とは別に試したので、上の 0dd2237 ともちがいます)。


SSH 鍵とは

SSH 鍵は、2つで1組のファイルです。

ファイル 役割 人に渡していいか
id_ed25519(秘密鍵) 本物の鍵。自分であることの証明に使う 絶対にダメ
id_ed25519.pub(公開鍵) 南京錠のようなもの。相手に預けておく 渡してよい

GitHub には公開鍵(.pub)だけを登録します。つなぐときは、GitHub が「この南京錠を開けられる鍵を持っていますか?」と確かめ、手元の秘密鍵で開けられれば、本人だとわかるしくみです。


ssh-keygen で鍵を作る

まず、すでに鍵があるか確かめます。

  • 1
ls -l ~/.ssh

(例)

  • 1
  • 2
kaito@demo:~/linux-practice/git-test$ ls -l ~/.ssh
ls: cannot access '/home/kaito/.ssh': No such file or directory

検証環境では、まだ ~/.ssh フォルダがなく、No such file or directory と表示されました。

id_ed25519 がすでにある場合は、新しく作らずに、それを使えます。なければ、ssh-keygen で作ります。-C のあとは、鍵につけるメモ(ふつうはメールアドレス)です。

  • 1
ssh-keygen -t ed25519 -C "[email protected]"

途中で、次の3つを聞かれます。

  • Enter file in which to save the key:保存する場所。そのまま Enter で ~/.ssh/id_ed25519 になる
  • Enter passphrase for "/home/kaito/.ssh/id_ed25519" (empty for no passphrase):鍵を使うときの合い言葉。入れておくのがおすすめ(入力しても画面には表示されません)。新しい OpenSSH(10 以降)では、このように鍵のファイル名が入った文になります。古い版では Enter passphrase (empty for no passphrase) と表示されます
  • Enter same passphrase again:同じ合い言葉をもう一度

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
kaito@demo:~/linux-practice/git-test$ ssh-keygen -t ed25519 -C "[email protected]"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/kaito/.ssh/id_ed25519):
Created directory '/home/kaito/.ssh'.
Enter passphrase for "/home/kaito/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kaito/.ssh/id_ed25519
Your public key has been saved in /home/kaito/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:mNUE***********************************mxRw kaito@example.com
The key's randomart image is:
+--[ED25519 256]--+
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
+----[SHA256]-----+

~/.ssh フォルダがなかったので、Created directory '/home/kaito/.ssh'. と、フォルダが自動で作られました。fingerprint(鍵の指紋)の真ん中と、randomart(鍵を絵にしたもの)の中身は、ここでは * に伏せています。

💡
「Overwrite (y/n)?」と聞かれたら n

同じ名前の鍵がすでにあると、Overwrite (y/n)? と聞かれます。y と答えると、今までの鍵が消えて、その鍵でつないでいたサーバーや GitHub に入れなくなります。迷ったら n で止めて、今ある鍵を使いましょう。

鍵ファイルの権限を確かめる
  • 1
  • 2
ls -l ~/.ssh
ls -ld ~/.ssh

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
kaito@demo:~/linux-practice/git-test$ ls -l ~/.ssh
total 8
-rw------- 1 kaito kaito 464 Nov  1 03:04 id_ed25519
-rw-r--r-- 1 kaito kaito  99 Nov  1 03:04 id_ed25519.pub
kaito@demo:~/linux-practice/git-test$ ls -ld ~/.ssh
drwx------ 2 kaito kaito 4096 Nov  1 03:04 /home/kaito/.ssh

Debian 13での実行画面

秘密鍵は -rw-------(600:自分だけ読み書きできる)になっています。Lv2 の権限の記事で見た読み方そのままです。秘密鍵をほかの人も読める権限にすると、SSH が「危ないので使いません」と断ることがあります。


公開鍵を GitHub に登録する

公開鍵の中身を表示します。必ず .pub がついているほうです。

  • 1
cat ~/.ssh/id_ed25519.pub

(例)

  • 1
  • 2
kaito@demo:~/linux-practice/git-test$ cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1**********************************************0HwzMk kaito@example.com

公開鍵の真ん中の文字列は、ここでは * に伏せています。実際には、とても長い1行が表示されます。

表示された ssh-ed25519 から最後の [email protected] までの1行を、まるごとコピーします。そのあと、ブラウザで GitHub を開いて、次の順に進みます。

  1. 右上のプロフィール画像 → Settings
  2. 左のメニューの「Access」にある SSH and GPG keys
  3. New SSH key を押す
  4. Title に「kaito のノートPC」のような、どのパソコンの鍵かわかる名前を入れる
  5. Key type は Authentication Key のままにする
  6. Key の欄に、コピーした1行を貼り付けて Add SSH key
  7. パスワードなどで本人確認を求められたら、画面にしたがって確認する

ここから先(GitHub への登録・ssh -T・push)は、GitHubの公式手順に沿った流れです。表示は環境により異なります。


ssh -T でつながるか確かめる

  • 1
ssh -T git@github.com

初めてつなぐときは、「つなぐ相手を確かめたか」を聞かれます。GitHubの公式手順に沿った流れです。表示は環境により異なります。

表示されるのは、The authenticity of host 'github.com (IP ADDRESS)' can't be established.、ED25519 key fingerprint is SHA256:…、Are you sure you want to continue connecting (yes/no)? のような英語のメッセージです(新しい OpenSSH では、最後が (yes/no/[fingerprint])? になります)。

これは「つなぐ相手が本物の GitHub か、確かめましたか?」という質問です。表示された SHA256:… の文字列が、GitHub の公式ドキュメント(「GitHub's SSH key fingerprints」のページ)に書かれているものと同じか見比べてから、yes と打ちます。2026年11月時点の公式ページでは、ED25519 の値は SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU です。合い言葉を設定した場合は、ここで聞かれます。

うまくいくと、Hi <GitHubのユーザー名>! You've successfully authenticated, but GitHub does not provide shell access. のように表示されます。

「successfully authenticated」と出れば成功です。「shell access は提供していません」というのは、GitHub にログインして操作することはできない、という意味なので、気にしなくて大丈夫です。

💡
「Permission denied (publickey)」と出たら

公開鍵の登録がまだか、コピーした1行が途中で切れている、または別の鍵が使われていることが多いです。ssh -vT [email protected] と -v をつけると、どの鍵ファイルを試したかが表示されるので、原因をしぼりこめます。


SSH の URL で push する

GitHub で、空のリポジトリを1つ作ります(例:linux-practice-repo。README・license・.gitignore は追加しない)。作ったあとに表示される「Quick setup」のところで SSH を選び、[email protected]: から始まる URL をコピーします。

💡
push の前に、送るファイルを確かめる

公開(Public)のリポジトリに push したものは、世界中のだれでも見られます。push の前に、git show --stat HEAD で最後のコミットに入っているファイルの一覧を、git status でまだコミットしていないファイルを確かめましょう。.env(API キーを書いたファイル)、id_ed25519 のような鍵ファイル、venv フォルダなどが入っていたら、送らないでください。一度 push したものは、あとのコミットで消しても、過去の記録(履歴)に残ります。キーや鍵を送ってしまったときは、ファイルを消すだけでなく、そのキーや鍵を使えなくする(GitHub の SSH keys から削除する、API キーを作り直す)ことが必要です。送らない設定は、関連する記事の「.gitignore パターン集」で紹介しています。

  • 1
  • 2
  • 3
  • 4
cd ~/linux-practice/git-test
git remote add origin git@github.com:<GitHubのユーザー名>/linux-practice-repo.git
git remote -v
git push -u origin main

GitHubの公式手順に沿った流れです。表示は環境により異なります。git remote -v では、origin の行が (fetch) と (push) の2つ表示されます。git push -u origin main がうまくいったら、ブラウザでリポジトリのページを開き直してみましょう。README.md と hello.sh が並んでいれば、送れています。

一度 -u をつけて push すれば、次からは git push だけで送れます。HTTPS(=通信を暗号化し、証明書で相手が本物かも確かめる HTTP)の URL(https://github.com/…)でつないでいる場合は、git remote set-url origin [email protected]:… で SSH の URL に切りかえられます。

🚫
秘密鍵は表示しない・渡さない・ゆるめない(文章だけで説明します)

cat ~/.ssh/id_ed25519(.pub がついていないほう)で秘密鍵を表示して、チャットや AI、GitHub の Key の欄に貼ってしまうと、だれでもあなたになりすませるようになります。また、「つながらないから」と chmod 777 ~/.ssh のように権限をゆるめたり、StrictHostKeyChecking no の設定で相手の確認を省いたりすると、安全のためのしくみを自分で外すことになります。この記事では試しません。もし秘密鍵を人に見せてしまったら、GitHub の SSH and GPG keys からその鍵を削除し、新しい鍵を作り直しましょう。

🤖 詰まったらAIに聞こう:GitHub に SSH でつながらない

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
Linuxの初心者です。SSH 鍵を作って GitHub につなごうとしていますが、うまくいきません。
原因として考えられることと、確かめる順番を教えてください。
秘密鍵の中身は貼りません。公開鍵や設定の確かめ方も、安全な方法でお願いします。

【使っている環境】WSLのUbuntu など
【ls -l ~/.ssh の結果(ファイル名と権限だけ)】ここに貼る
【打ったコマンド】例:ssh -T git@github.com
【表示されたエラー(ユーザー名は***に置き換え済み)】ここに貼る
【git remote -v の結果】ここに貼る

🔒
AIに貼る前に:秘密情報やパスワードは貼らない

秘密鍵(id_ed25519)の中身、鍵の合い言葉、GitHub のパスワードやトークンは、どんな場合でも貼らないでください。-----BEGIN OPENSSH PRIVATE KEY----- で始まる文字列は秘密鍵です。ssh -vT の結果を貼るときも、ユーザー名やホスト名は「***」に置き換えておきましょう。


よくある質問

Q. push のたびに、パスフレーズを聞かれます。

鍵にパスフレーズをつけた場合、使うたびに聞かれるのがふつうです。ssh-agent というしくみを使うと、ターミナルを開いているあいだは、一度入力したパスフレーズを覚えておいてもらえます。eval "$(ssh-agent -s)" のあと ssh-add ~/.ssh/id_ed25519 と打つ方法が、GitHub の公式の手順でも紹介されています。

Q. Windows の Git でも使っている鍵を、WSL でもそのまま使えますか?

WSL の Linux と Windows は、ホームフォルダが別々です。Windows 側で作った鍵(C:\Users\…\.ssh)は、WSL の ~/.ssh には入っていません。この記事のように WSL の中で新しく鍵を作り、GitHub に公開鍵を追加すれば、鍵が2つになっても問題なく使えます。秘密鍵をコピーして使い回すより、パソコン(環境)ごとに鍵を作るほうが安全です。

Q. HTTPS の URL で push したら、パスワードが通りません。

GitHub では、git push のときに、GitHub のログインのパスワードを使うことはできません。HTTPS でつなぐなら、パスワードの代わりに「個人用アクセストークン」が必要です。この記事のように SSH の URL に切りかえると、トークンを入力せずに push できます。


まとめ

  • Git は apt で入れ、git config --global で名前とメールを設定する
  • SSH 鍵は2つで1組。秘密鍵(id_ed25519)は自分だけ、公開鍵(.pub)を GitHub に渡す
  • ssh-keygen -t ed25519 -C "メール" で作る。Overwrite と聞かれたら n
  • 秘密鍵の権限は -rw-------(600)。ゆるめない
  • ssh -T [email protected] で「successfully authenticated」と出れば成功。最初の fingerprint は公式の値と見比べる
  • git remote add origin [email protected]:… → git push -u origin main で送る

これで Lv3 はおしまいです。スクリプトを書いて、動かして、止めて、Python や API とつないで、GitHub に保管するところまでできるようになりました。次の Lv4 では、サーバーを使うためのネットワークの基本から始めます。


次に読む記事


関連する記事