ssh – どの秘密鍵を使うかを git に教えるには?

authentication git private-key ssh

ssh には、認証時にどの秘密鍵ファイルを使用するかを指定する -i オプションがあります

-i identity_file

    RSA または DSA 認証の ID (秘密鍵) を読み込むファイルを選択します。既定値は、プロトコルバージョン 1 の場合は ~/.ssh/identity、プロトコルバージョン 2 の場合は ~/.ssh/id_rsa および ~/.ssh/id_dsa です。IDファイルは、設定ファイルでホストごとに指定することもできます。 複数の -i オプション (および設定ファイルで指定された複数の ID) を持つことも可能です

~/.sshディレクトリに複数の秘密鍵があるシステムで、gitにどの秘密鍵ファイルを使用するかを伝える方法と似たような方法があるのでしょうか?

  762  jrdioko  2011-01-12


ベストアンサー

~/.ssh/configでは、追加します

host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
User git

設定ファイルが新しい場合は、chmod 600 ~/.ssh/configを忘れずに

これでgit clone git@github.com:{ORG_NAME}/{REPO_NAME}.gitができるようになりました

  • {ORG_NAME} は GitHub ユーザーアカウント (または組織アカウント) の GitHub URI 名です
    • github.comの後にスラッシュ/の代わりにコロン:があることに注意してください – これはURIではないので
  • そして、{REPO_NAME}はGitHubレポのURI名です
  • 例えば、for the Linux kernelの場合、これはgit clone git@github.com:torvalds/linux.gitになります。)

注意: LinuxとmacOSでは、IdentityFileのパーミッションが400であることを確認してください。SSH は、はっきりとした方法ではありませんが、 あまりにも読みやすい SSH 鍵を拒否します。クレデンシャル拒否のように見えてしまうだけです。この場合の解決策は

chmod 400 ~/.ssh/id_rsa_github

773  shellholic  2011-01-12


環境変数 GIT_SSH_COMMAND

Gitバージョン2.3.0からは、環境変数GIT_SSH_COMMANDをこのように使うことができます

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

-i は設定ファイルによって上書きされることがあることに注意してください

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Configuration core.sshCommand:

Git バージョン 2.10.0 からは、これをレポごとに設定したり、グローバルに設定したりできるようになったので、環境変数を設定する必要がなくなりました!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

449  Flimm  2015-05-08


リポジトリ認証はgitに依存しているので、どの秘密鍵を使うかをgitに直接伝える方法はありません。しかし、目的を達成するための方法はいくつかあります

オプション1: ssh-agentの場合

ssh-agentを使って秘密鍵を一時的に認証することができます

For example:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

選択肢2:GIT_SSH_COMMANDの場合

環境変数 GIT_SSH_COMMAND を使って ssh の引数を渡します (Git 2.3.0+)

For example:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
git clone user@host

これをすべて1行で入力することができます – $を無視して\.を省略してください

選択肢3:GIT_SSHの場合

環境変数 GIT_SSH を使用して、代替の ssh バイナリを指定して ssh の引数を渡します

For example:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

注: 上記の行はシェル (ターミナル) コマンドラインであり、ターミナルに貼り付ける必要があります。これらは ssh という名前のファイルを作成し、実行可能にし、(間接的に)実行します

注: GIT_SSH は v0.99.4 (2005) 以降で利用可能です

選択肢4:~/.ssh/configの場合

秘密鍵の場所を指定するために、他の回答で示唆されているように、~/.ssh/configファイルを使用してください

Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_rsa

135  kenorb  2015-01-23


必要な引数を指定して ssh を呼び出すスクリプトを書いて、$GIT_SSH にスクリプトのファイル名を入れてください。あるいは、設定を ~/.ssh/config に記述するだけでも構いません

33  Ignacio Vazquez-Abrams  2011-01-12


~/.ssh/configのカスタムホスト設定を使用します

Host gitlab-as-thuc
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa.thuc
IdentitiesOnly yes

のようなカスタムホスト名を使用します

git remote add thuc git@gitlab-as-thuc:your-repo.git

32  thucnguyen  2016-05-17


git を実行するたびに環境変数を指定したくない、別のラッパースクリプトを使いたくない、ssh-agent(1) を実行したくない/できない、このためだけに別のパッケージをダウンロードしたくない、という場合は、git-remote-ext(1) の外部トランスポートを使いましょう

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

私はこの解決策が優れていると考えています

  • リポジトリ/リモートに特化しています
  • ラッパースクリプトの肥大化を避ける
  • SSHエージェントは必要ありません — 無人のクローン/プッシュ/プル(cronなど)が必要な場合に便利です
  • 間違いなく、外部ツールは必要ありません

24  flaviovs  2015-07-21


私が$GIT_SSHと格闘した後、私に効果があったことを共有したいと思います

この例では、あなたの秘密鍵が/home/user/.ssh/jenkinsにあると仮定しています

回避すべきエラーです。GIT_SSH の値にはオプションが含まれています

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

などを実行しても失敗します。そのため、スクリプトを作成する必要があります

GIT_SSH スクリプト /home/user/gssh.sh の動作例です

スクリプトは以下のように起動されます

$ $GIT_SSH [username@]host [-p <port>] <command>

サンプルスクリプトの動作は以下のようになります

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

最後の$*は重要な部分なので注意してください

より安全な代替案としては、デフォルトの設定ファイルにあるものとの衝突を防ぐことができます (さらに、使用するポートを明示的に指定することもできます)

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

スクリプトが/home/user/gssh.shにあると仮定して、その後、あなたはしなければならない

$ export GIT_SSH=/home/user/gssh.sh

そうすれば、すべてがうまくいく

17  Jan Vlcinsky  2015-05-28


そこで、git_sshのenv変数を$HOME/bin/git-sshにしてみました

どの ssh ID を使用するかをレポの設定で指定できるようにするために、 ~/bin/git-ssh ファイルは以下のようになっています

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

そうすると、私はグローバルなgitの設定をしています

$ git config --global ssh.identity ~/.ssh/default_id_rsa

そして、どの git リポジトリでも、ローカルの ssh.identity git config の値を設定すればいいのです

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Voila!

それぞれの ID に対して異なるメールアドレスを設定できれば、さらにシンプルになります

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*

7  Brendan Baldwin  2018-12-04


自分でラッパーを作るのではなく、ssh-ident を使えばいいのです

でもっと読むことができます。https://github.com/ccontavalli/ssh-ident

それは、複数のログインセッション、xtermsまたはNFS共有ホームであっても、最初に必要とされるときに、一度、オンデマンドでsshキーをロードします

小さな設定ファイルを使えば、必要なことに応じて、自動的に異なるキーをロードして、異なるエージェントに分けておくことができます(エージェント転送用)

6  rabexc  2013-03-23


私は別のgithubアカウントを必要とするクライアントを持っていました。そのため、このプロジェクトのためだけに別のキーを使う必要がありました

私の解決策は、これを .zshrc / .bashrc に追加することでした

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

そのプロジェクトでgitを使いたいときは、いつも “infogit “をgitに置き換えています

infogit commit -am "Some message" && infogit push

私にとっては、その方が覚えやすいです

6  Michael Cole  2018-03-26


私の解決策はこれでした

スクリプトを作成します

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
case $i in
--port=*)
PORT="${i:7}";;
--key=*)KEY="${i:6}";;
esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

その後、var runを変更する必要があるときに

. ./thescript.sh [--port=] [--key=]

追加のドットを忘れないでください!これはスクリプトが環境変数を設定します! –key と –port はオプションです。–key と –port はオプションです

3  Salsicha  2015-12-05


一般的には、~/.ssh/configを使用したい。以下のように、サーバアドレスと使用したいキーをペアリングするだけです

Host github.com
IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
IdentityFile ~/.ssh/id_rsa.heroku
Host *
IdentityFile ~/.ssh/id_rsa

Host *は任意のサーバを表すので、~/.ssh/id_rsaをデフォルトのキーに設定して使用しています

3  Zaz  2016-02-11


私は @shellholic と このSOスレッド をいくつかのティークで構築しています。私はGitHubを例に挙げ、~/.ssh/githubで秘密鍵を持っていること(そうでない場合はこのSOスレッドを参照)と、公開鍵をGitHubのプロフィールに追加したこと(そうでない場合はGitHubのヘルプを参照)を想定しています

必要に応じて、~/.ssh/configに新しいSSH設定ファイルを作成し、パーミッションを400に変更します

touch ~/.ssh/config
chmod 600 ~/.ssh/config

これを~/.ssh/configファイルに追加します

Host github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

すでにリモート設定をしている場合は、削除した方が良いでしょう。そうでない場合は、ユーザー名とパスワードの入力を求められることがあります

git remote rm origin

次にリモートをgitリポジトリに追加し、ユーザー名の前にコロンがあることに気づきます

git remote add origin git@github.com:user_name/repo_name.git

そして、git コマンドが正常に動作するようになります

git push origin master
git pull origin

このSOスレッドにある@HeyWatchThisは、各プロトコルのデフォルトのファイル名にマッチするIDファイルを送信するというSSHのデフォルトの動作を防ぐためにIdentitiesOnly yesを追加することを提案しました。より詳しい情報と参考文献はそのスレッドを参照してください

3  miguelmorin  2018-05-03


同じホストに異なるキーで接続する必要がある場合は、次のようにして実現することができます

  1. ~/.ssh/configを異なるHostでも同じHostNamesで構成します
  2. 適切なホストを使用してレポをクローンします

Example:

~/.ssh/config

Host work
HostName bitbucket.org
IdentityFile ~/.ssh/id_rsa_work
User git

Host personal
HostName bitbucket.org
IdentityFile ~/.ssh/id_rsa_personal
User git

その代わりに、リポジトリのクローンを作成します

git clone git@bitbucket.org:username/my-work-project.git
git clone git@bitbucket.org:username/my-personal-project.git

なければならない

git clone git@work:username/my-work-project.git
git clone git@personal:username/my-personal-project.git

3  Maistora  2020-01-24


ssh-agentssh-addのコマンドを使えばいいだけです

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

上記のコマンドを実行した後、両方のキーを同時に使用することができます。と入力してください

git clone git@github.com:<yourname>/<your-repo>.git

を使ってリポジトリをクローンします

マシンを再起動した後に上記のコマンドを実行する必要があります

1  Jinmiao Luo  2018-07-05


    # start :: how-to use different ssh identity files

# create the company identity file
ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
# save private key to ~/.ssh/id_rsa.corp,
cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

# create your private identify file
ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
# save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

# clone company internal repo as follows
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git clone git@git.in.corp.com:corp/project.git

export git_msg="my commit msg with my corporate identity, explicitly provide author"
git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git push
# and verify
clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

# clone public repo as follows
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git clone git@github.com:acoolprojectowner/coolproject.git

export git_msg="my commit msg with my personal identity, again author "
git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git push ;
# and verify
clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

# stop :: how-to use different ssh identity files

1  Yordan Georgiev  2019-08-31


私はgitのバージョン2.16を使っていますが、設定や変更されたコマンドすらスクリプトの一部も必要ありません

  • 秘密鍵を .ssh/id_rsa にコピーしました
  • パーミッションを600に設定します

そしてgitは自動的にkeyに読み込んでくれます。何も聞かないし、エラーも出ない。正常に動作しています

0  akjprajapati  2018-06-06


この質問はそれを要求していませんが、のためだけに、同じ問題を解決しようとしている人のために、この回答を含めています

gitlab のソリューション

私は environment-variables のアプローチを使ってみましたが、the git documentation でさえ、単純なケース以外では ~/.ssh/config を使うことを推奨しています。私の場合は、gitlab サーバーにプッシュしています。key” rel=”tag” title=”show questions tagged ‘private-key'”>private-key の間、authenticationはユーザ名gitではありません。一旦実装されると、私は以下のように単純に実行します

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

Setup

/myfolder/.ssh/my_gitlab_id_rsaの場所を思い出してみてください

~/.ssh/configにエントリを追加します

Host gitlab-delegate
HostName gitlab.mydomain.com
User git
IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
IdentitiesOnly yes

~/.gitconfigに追加します

mypush = "!f() { \
path=$(git config --get remote.origin.url | cut -d':' -f2); \
branch=$(git rev-parse --abbrev-ref HEAD); \
git remote add gitlab_as_me git@gitlab-delegate:$path && \
git push gitlab_as_me $branch && \
git pull origin $branch; \
git remote remove gitlab_as_me; \
}; f"

ボーナスとして、このを使って、この同じホスト上で特定のユーザとしてコミットを実行します

mycommit = "!f() { \
git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
}; f"

Explanation

上記のすべては、関連するリモートが origin で、関連するブランチが現在チェックアウトされていることを前提としています。参考までに、対処しなければならないいくつかの項目に遭遇しました

  • この解決策には新しいリモート gitlab_as_me を作成する必要がありますが、余分なリモート がログツリーにぶら下がっているのを見るのが嫌だったので、終了したら削除しました
  • リモートを作成するためには、その場でリモートの URL を生成する必要があります – gitlab の場合は、シンプルなバッシュ で実現しました
  • gitlab_as_me へのプッシュを行う際には、プッシュするブランチを明確にする必要があります
  • プッシュを実行した後、ローカルの origin ポインタは gitlab_as_me にマッチするように “更新” される必要があります (これは git pull origin $branch が行います)

0  dtmland  2019-01-07


複数のgitアカウントを持っていて、異なるssh鍵が必要な場合

ssh鍵の生成も同じ手順で行いますが、必ず確認してください

ssh-keygen -t ed25519 -C "your-email-id@gmail.com"

保存したいパスを入力してください(例: my-pc/Desktop/.ssh/ed25519)

gitlabに公開鍵を追加します(How to adding ssh key to gitlab)

以下のコマンドを使用して、新しいssh IDを取得します

ssh-add ~/my-pc/Desktop/.ssh/ed25519

0  Srikrushna  2019-04-06


タイトルとURLをコピーしました