前の記事では、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 |
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 foundDebian 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.3apt 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 最初のコミット中身は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)? と聞かれます。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秘密鍵は -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 を開いて、次の順に進みます。
- 右上のプロフィール画像 → Settings
- 左のメニューの「Access」にある SSH and GPG keys
- New SSH key を押す
- Title に「kaito のノートPC」のような、どのパソコンの鍵かわかる名前を入れる
- Key type は Authentication Key のままにする
- Key の欄に、コピーした1行を貼り付けて Add SSH key
- パスワードなどで本人確認を求められたら、画面にしたがって確認する
ここから先(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 にログインして操作することはできない、という意味なので、気にしなくて大丈夫です。
公開鍵の登録がまだか、コピーした1行が途中で切れている、または別の鍵が使われていることが多いです。ssh -vT [email protected] と -v をつけると、どの鍵ファイルを試したかが表示されるので、原因をしぼりこめます。
SSH の URL で push する
GitHub で、空のリポジトリを1つ作ります(例:linux-practice-repo。README・license・.gitignore は追加しない)。作ったあとに表示される「Quick setup」のところで SSH を選び、[email protected]: から始まる URL をコピーします。
公開(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 mainGitHubの公式手順に沿った流れです。表示は環境により異なります。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 の結果】ここに貼る秘密鍵(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 では、サーバーを使うためのネットワークの基本から始めます。
次に読む記事
- 前の記事:Linuxのcurlとwget|コマンドでWeb APIを叩く・ファイルを落とす【初心者向け】
- 次の記事:Linuxのネットワークの基本|IPアドレス・ポート・DNSをざっくり理解【初心者向け】
関連する記事
- Git入門|init・add・commit を1回やってみる:add と commit の意味を、ていねいに確かめたい方に
- プロが使う.gitignoreパターン集|現場で効くテンプレ:venv や .env、鍵ファイルを GitHub に送らない書き方を知りたい方に
- Cursorにエラーを直してもらう5ステップ|エラーの渡し方・頼み方・直った後の確認まで:Git や SSH のエラーを AI に上手に渡したい方に