Gitで使用する秘密鍵を選択します


84

2つの異なるSSHキーを必要とする2つのGitサーバーがあります。

git clone user1@server1:blahblahblahを使用~/.ssh/id_rsaしますが、接続しているサーバーに応じて使用するキーを指定する必要があります。

この仕事をするGitコマンドラインパラメーターは何ですか?(私はLinuxを実行しています。)


2
この質問はsuperuser.com/questions/232373/…で回答されています
ダイラホップウッド


回答:


60

SSH経由で接続している場合、キーはgitパラメーターではなくSSHパラメーターによって制御されます。

SSHは、~/.ssh/configファイルで構成パラメーターを探します。そのファイルを変更し、次のように2つのGitサーバーのIdentityFileエントリを追加します。

Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2

この記事にはさらに詳細があります。


13
それは質問に答えませんでした。問題は、sshが承認を処理するときに、どうすればgitにこのパラメーターを与えることができるかということです。
keks 2013

@Keks:gitコマンドラインからssh引数を渡すことはできません。この回答は回避策を提供します。他にも可能な回避策があります。たとえば、git.wiki.kernel.org / index.php /…。このアプローチでは、コマンドライン引数を使用してsshの動作を変更しないことに注意してください。
キャメロンスキナー

12
それは本当です、しかしあなたの最初の答えは質問に答えませんでした。使用ssh-agentして使用してssh-addから、gitを使用することもできます。gitがssh経由で接続する場合、キーはすでに有効になっています。ほら、いくつかの方法がありますが、元の答えは実際には役に立ちません。
keks 2013

これはほとんどリンクのみの回答です。あなたの答えの中で記事の関連する部分を要約できますか?
flimm 2016

@Flimm:要約が追加されました。
キャメロンスキナー

105

別の可能性があります。それは設定することですcore.sshCommand、例えば

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"

この戦略が特に役立つ特定のシナリオが1つあります。それは、Githubに複数のアカウントがあり、すべてのアカウントsshがGithubにgit@github.comあり、sshキーを使用してユーザーがどのGithubユーザーであるかを判別する場合です。この場合、あなたが望むことをすること.ssh/configも、ssh-agentすることもありません。

更新—ローカルリポジトリが作成されるまで上記を実行できないため、リモートリポジトリのクローンを作成する場合は、drewbie18の回答に従って手動でキーを指定する必要があります。

git clone -c core.sshCommand="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git@github.com:me/repo.git

リポジトリのクローンを作成したら、git configコマンドを使用してこれを永続的に設定できます。


8
これが選択された答えであるはずです。必要な構成は、さまざまなgitサーバーにアクセスするためにさまざまなsshキーを使用する必要があるリポジトリに適切にローカライズされています。〜/ .ssh / config(GitHubに複数のアカウントがある場合は/ etc / hosts)を変更する必要はありません。
mr.b 2017

1
ただし、問題が1つあります。それは、構成する前にリポジトリのクローンを作成できないことです。リポジトリを構成するには、最初にリポジトリのクローンを作成する必要があります。または、git initリポジトリをローカルで構成して正しいsshコマンドを使用し、リモートを追加することもできます(「gitclone」を使用した場合は1つだけであるのに対し、3つのステップ)。
mr.b 2017

3
リポジトリのクローンを作成するには、以下の@Gussのソリューションを使用して、GIT_SSH_COMMAND環境変数を設定します。しかし、通常の使用では、新しいシェルを開始するたびにその変数を再エクスポートする必要がないため、ソリューションを好みます。
リチャードスミス

命の恩人!./ssh/configを使用してこれを設定する方法や、Mac用のssh-agent / ssh-add-Kを使用する方法を示す人はたくさんいます。1年間使用していましたが、最新のパッチを適用すると、HighSierraでの動作が突然停止しました。core.sshCommandは、他のすべてが失敗したときに機能しました。ありがとう!
スティーブ

2
このエレガントなソリューションをありがとうございます。しかし、私はちょうどcore.sshCommandはのためにのみ利用可能であることを正確にしたいのgit> = 2.10.0
slonepi

32

通常、~/.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するデフォルトのキーとして設定するために使用します。


9
GitHubのように1つのサーバーに複数のアカウントがあり、それぞれに異なる秘密鍵が必要な場合、このアイデアは機能しません。
flimm 2016

一つのサーバ上で複数のアカウントについては、この回答を参照stackoverflow.com/questions/3225862/...
lexicalscope

23

私のシナリオでは、@ Richard Smithシナリオ(そのソリューション、ところで、私には機能しませんでした)と同様に、異なるリポジトリーの下の同じサーバーに異なるキーを使用する必要があります。

私にとっての回避策はGIT_SSH_COMMAND、次のように、環境変数を使用してセッションを正しく設定することでした。

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"

更新

ここで注意すべきもう一つは、である私のようなものが提供するコマンドプロンプト修正施設使用していますので、ハッスルすることができ、正しく環境変数を設定する液体プロンプト魚のシェルをシェルにフックとに応じて環境変数を更新し続けるために現在のディレクトリといくつかのルール。たとえば、Gitlabで個人のSSHキーを必要とするすべての個人プロジェクトは下にある~/Documents/Projects/personalため、シェルフックが実行さpwdれ、現在のディレクトリがそのパスの下にあることが検出されると、GIT_SSH_COMMAND必要に応じて変数が自動的に設定されます。


15

ssh-add path-to-private-key箱から出してすぐに使用できます。


5
2つのデプロイキーがあり、それらが特定のリポジトリでのみ機能する場合は違います。その場合、間違ったキーを使用して、アクセス権がないと表示される可能性があります。
cdmckay

cdmckayが言った問題が発生しました
Suge

7

--globalまたは--local構成を設定できます。グローバルは~/.gitconfigファイルを更新し、ローカルはリポジトリ内の構成を更新し.git/config、グローバル(〜/ .gitconfig)構成をオーバーライドします。

git config --local --add core.sshCommand'ssh -i〜 / .ssh / my_key '


2
チャームとして機能しました。これはまさに私が必要としていたものであり、特定のリポジトリのソリューションでした。
QuaestorLucem19年

6

ここのWindowsユーザー、私はちょうどこの問題に遭遇し、少し異なる解決策を持っています、それから私はこれまでここを読みました。私が直面した問題は、特定のプライベートsshキーを使用してリポジトリのクローンを作成したいだけで、PowerShellで作業する場合のように、gitconfigをグローバルに構成したり特定のgitbash設定を追加したりする必要がないことです。基本的に、.sshフォルダーにいくつかの秘密鍵を置きたいだけで、必要に応じて特定のリポジトリでそれらを参照します。

これには、次のコマンドが機能します。

git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>

基本的に、これはgitリポジトリの初期化時に、クローンを実行する前にcore.sshCommandオプションを設定します。したがって、このリポジトリに使用する特定のsshキーは、このリポジトリに対してのみ設定されます。これはすべての場合に理想的な解決策ではないかもしれませんが、私が望むものにはそうです。


ありがとうございました。私は-cへのオプションを知りませんでしたgit clone。これは、クローン作成時に提案するように環境を設定するよりも優れています。
リチャードスミス

1

他の回答から、コマンドラインオプションまたは(存在する場合は)git remote-vの値に応じてsshキーを選択する小さなスクリプトを作成するようになりました。それが役に立てば幸い!

実際に質問に答えるには:gatを使用します。

https://bitbucket.org/eikerobert/gat/src/master/も参照してください

#!/bin/bash

usegat=false

for VAR in "$@"
do
    if [ "$VAR" != "${VAR/git@bitbucket.org:myaccount/}" ]; then
        usegat=true
    fi
done

if [ $usegat=false ]; then
   /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1
   isinsidegitrepo=$?
    #echo $isinsidegitrepo
   if [ $isinsidegitrepo = 0 ]; then
       remote=`/usr/bin/git remote -v`
       if [ "$remote" != "${remote/git@bitbucket.org:myaccount/}" ]; then
           usegat=true
       fi
   fi
fi


if [ $usegat = true ]; then
    # echo "TRUE"
    /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@"
else
     #echo "FALSE"
    /usr/bin/git "$@"
fi

1

別のオプションは、作成する小さなスクリプトを書くことです core.sshCommand、少しスマートです。現在の作業ディレクトリに特定のSSHキーが構成されているかどうかを確認し、構成されている場合はそれを使用します。そうでない場合は、標準のSSHキー解決に依存します。

これが私の最初のバージョンです:

#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
        ssh "$@"
fi

次に、グローバルgitSSHコマンドとして設定します。

chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command

(これ~/.local/binは、SystemDオペレーティングシステムでの「ユーザースクリプトをここに配置するの現在の標準です。

これを設定した後、設定オプションを設定することにより、特定のSSHキーを使用するように任意のリポジトリを設定できますssh.key

git config --local ssh.key ~/.ssh/my-non-default-private-key

追加のオプションのトリック

  • グローバルを設定する ssh.key「デフォルト以外のSSHキーへのデフォルトのフォールバック」などを持つようにをます。
  • gitがcore.sshCommandリポジトリのルートディレクトリで実行されると、カスタムgit-ssh-commandはそれを確認し、ディレクトリ名に関するヒューリスティックを取得できます。これはelseセクションで実行できるため、ヒューリスティックはに特定のキーがない場合にのみ開始されssh.keyます。
  • あなたは付け加えられます git remote -vアイケのスクリプトのように、リモコンに基づくヒューリスティックを追加するために、チェックを
  • リポジトリremote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"のリモートを確認したいが、異なるキーを必要とする複数のリモートがある場合は、スクリプトの先頭に追加して、操作対象のリモートを解決し、それを確認でき$remoteます(git remote -v出力の中央の列のようになります)。

更新:

これは、リモートURLを調べていくつかのヒューリスティックを実行するカスタムSSHコマンドのバージョンです-私の場合、同じパブリックgitホスティングサービス(1つは仕事用、もう1つは個人用など)でいくつかの異なるIDを持っており、選択できますリモートURLを確認することによる正しいID(GitlabグループまたはGithub組織の調査など):

#!/bin/bash
if [[ "$2" =~ ^git-lfs-authenticate.* ]]; then # reconstruct url for git-lfs
        remote="$1:$(awk '{print$2}'<<<"$2")"
else # reconstruct url for standard git commands
        remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
fi
#echo "Detected $remote from $@" >&2 # optional debug log
key="$(git config ssh.key)"
if [ -n "$key" ]; then # use specified SSH key, if set
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
elif [[ "$remote" == git@gitlab.com:my-company* ]]; then # use company id
        ssh -o IdentitiesOnly=yes -i ~/.ssh/company-id "$@"
elif [[ "$remote" =~ git@bitbucket.org:.*other-org.* ]]; then # bitbucket has weird urls
        ssh -o IdentitiesOnly=yes -i ~/.ssh/custom-org-key "$@"
else # otherwise use whatever the agent has (my personal key)
        ssh "$@"
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.