特定のドメインのgit pushのSSHキーを指定します


342

次の使用例があります。「自分の」秘密鍵の使用にプッシュしたいのに、git@git.company.com:gitolite-adminuserの秘密鍵の使用gitolite-adminにプッシュしたいのですがgit@git.company.com:some_repo。私の知る限り~/.ssh/config、ユーザー名とサーバー名はどちらも同じであるため、を使用してこれを解決することはできません。私は主に自分の秘密鍵を使用しているので、それを~/.ssh/configfor で定義していgit@git.company.comます。単一のgit呼び出しに使用されるキーをオーバーライドする方法を誰かが知っていますか?

(脇に:gitoliteは、キーに基づいてプッシュを実行しているユーザーを区別するため、アクセス、所有権、および監査の点で、user @ server文字列がユーザーごとに同一であっても問題ありません。)


回答:


597

ユーザーとホストが同じであっても、ではそれらを区別でき~/.ssh/configます。たとえば、構成が次のようになっているとします。

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

次に、URLでホスト名の代わりにを使用gitolite-as-alicegitolite-as-bobます。

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

注意

IdentitiesOnly yesデフォルトIDの使用を防止するオプションを含める必要があります。それ以外の場合は、デフォルト名と一致するidファイルもある場合、他の構成オプション(「最初に優先」に従う)とは異なり、IdentityFileオプションが試行するIDのリストに追加されるため、最初に試行されます。参照:https : //serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807


9
素晴らしいです、ありがとう。〜/ .ssh / configでホスト仕様の「エイリアス」を自由に選択できることを理解していませんでした
混乱

4
この答えをありがとう!私にとって1つの問題は、IdentityFileが完全なパスである必要があることでした(IdentityFileへの引数としてid_rsa.rickのみを指定しましたが、これは失敗しました)。IdentityFileの他の構文については、ssh_config(5)のマニュアルページを参照してください。
rickumali

1
明確で非常に役立つ回答をありがとうございました。私はこれをしばらくの間動作させるようにしましたが、同じユーザーが同じid_rsa秘密鍵ファイルを使用する必要があるという前提で前に諦めました。
DrCord 2013

7
git@リモートの部分は、構成のUser行で指定されているため必要ありません。
ドルメン

2
ホストのIdentitiesOnly yes行の直後にを含む別の行を追加するまで、この解決策に苦労していIdentityFileました。複数のIDを通過しており、そのうちの1つがホストへのアクセスをブロックされていたようです。
Fitter Man

57

上記でMark Longair提供した方法の代替アプローチは、代替SSHキーを使用して、任意のリモートで任意の gitコマンドを実行するエイリアスを使用することです。基本的には、gitコマンドを実行するときにSSH IDを切り替えることです。

他の回答のホストエイリアスアプローチと比較した利点:

  • で動作するすべてのユーザーが指定できない場合でも、gitのコマンドまたはエイリアスremoteを明示的。
  • 各クライアントマシンのリポジトリごとに1回設定する必要はなく、クライアントマシンごとに1回設定するだけで済むため、多くのリポジトリでの作業が簡単になります。

いくつかの小さなスクリプトとgitエイリアスを使用していadminます。そうすれば、たとえば次のことができます。

git admin push 

代替( "admin")SSHキーを使用してデフォルトのリモートにプッシュします。繰り返しますがpush、このエイリアスでは(だけでなく)任意のコマンドを使用できます。git admin clone ...「admin」キーを使用してのみアクセスできるリポジトリのクローンを作成することもできます。

ステップ1:代替SSHキーを作成します。他の人のマシンでこれを行う場合に備えて、オプションでパスフレーズを設定します。

ステップ2:「ssh-as.sh」というスクリプトを作成します。このスクリプトは、SSHを使用するものを実行しますが、デフォルトではなく特定のSSHキーを使用します。

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

ステップ3:指定されたSSHキーを使用してgitコマンドを実行する「git-as.sh」というスクリプトを作成します。

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

ステップ4:エイリアスを追加します(以下の「PATH_TO_SCRIPTS_DIR」に適したものを使用):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

詳細:http : //noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/


4
とてもいい答えです。安全のために$@-> "$@"を二重引用符で囲むことを忘れないでください。
kevinarpe 2014年

@sinelawこれはまだ機能しますか?Permission denied errorが常に表示される
Alok Kumar

55

git環境変数を利用できますGIT_SSH_COMMAND。gitリポジトリの下のターミナルでこれを実行します。

GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init

~/.ssh/your_private_key使用したいssh秘密鍵のパスに置き換えます。そして、あなたは(例であり、後続のgitコマンドを変更することができますgit submodule update --initように他の人に)git pullgit fetchなど、


1
完全なドキュメントはgit-scm.com/docs/git#git-codeGITSSHcodeにあります。ただし、最近の Git(> = 2.3。*)が必要です。
クリスチャンウルブリッヒ2018

2
1つの環境変数を設定する以外に何も必要としない簡単な解決策をありがとう。
Noah Sussman、2018年

4
〜/ .ssh / id_rsa(またはデフォルトのキーが何であれ)は、-iを介して渡すものよりも優先されることに注意してください。したがって、本当にGIT_SSH_COMMAND = 'ssh -i〜/ .ssh / your_private_key -o IdentitiesOnly = yes'を使用して他のキーを無視したい
staktrace

どうすればgit pushを更新できますか?ドキュメントでそれを見つけることができませんでした
lebed2045

bashまたはgitエイリアスを作成すると便利です-sinelawの回答に似ていますが、どこかにスクリプトを作成する代わりにこの方法を使用します。
イニゴ

14

一つのUNIXベースのシステム(Linuxでは、BSD、Mac OS Xは)、デフォルトのアイデンティティは、ディレクトリに格納されたの$ HOME /の.ssh 2つのファイルで、: private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub あなたが使用する場合はsshオプションなしで-i、それはリモートシステムで認証するデフォルトの秘密鍵を使用しています。

$ HOME / .ssh / deploy_keyなど、使用したい別の秘密鍵がある場合は、ssh -i ~/.ssh/deploy_key ...

迷惑です。$ HOME / .bash_profileに次の行を追加できます。 ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

したがって、sshorまたはgitor を使用するたびにscp(基本的にsshも)、オプションを使用する必要がなくなり-iます。

$ HOME / .bash_profileファイルに、好きなだけキーを追加できます。


10

もう1つの方法は、ssh-identを使用して、ssh IDを管理することです。

現在の作業ディレクトリ、sshオプションなどに基づいて、さまざまなキーを自動的にロードして使用します...つまり、sshでさまざまなキーとIDを透過的に使用することになるwork /ディレクトリとprivate /ディレクトリを簡単に作成できます。


9

Win7でGit Bashを使用しています。以下は私のために働いた。

〜/ .ssh / configまたはc:/ users / [your_user_name] /。ssh / configに構成ファイルを作成します。ファイルに次のように入力します。

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

ホストは、ホストの単なる「名前」や参照ではなく、URLである必要があると思います。例えば、

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

パスは/ c / users / [user_name] / ....形式でも記述できます

Giordano Scalzoが提供するソリューションも素晴らしいです。 https://stackoverflow.com/a/9149518/1738546


9

git 2.10以降では、gitconfig sshCommand設定を使用することもできます。ドキュメントの状態

この変数が設定されている場合、git fetchおよびgit pushは、リモートシステムに接続する必要があるときに、sshではなく指定されたコマンドを使用します。コマンドはGIT_SSH_COMMAND環境変数と同じ形式であり、環境変数が設定されるとオーバーライドされます。

使用例は次のようになります。 git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]

ssh_configがコマンドを上書きするため、これが機能しない場合ssh -i ~/.ssh/[insert_your_keyname] -F /dev/nullがあります。この場合、ssh_configを使用しないようにしてください。


8

いくつかの手法を組み合わせた他の回答を読んだことに基づいて、私はgithubで次のアプローチを一緒にチェックしてテストしました。

  • 正しいSSH設定
  • git URLの書き換え

このアプローチの利点は、いったん設定すると、正しくするために追加の作業を必要としないことです。たとえば、リモートURLを変更したり、別の方法で複製することを覚えたりする必要がありません-URLの書き換えですべてが機能します。

~/.ssh/config

# Personal GitHub
Host github.com
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github_id_rsa

# Work GitHub
Host github-work
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/work_github_id_rsa

Host *
  IdentitiesOnly yes

~/.gitconfig

[user]
    name = My Name
    email = personal@personal.email

[includeIf "gitdir:~/dev/work/"]
    path = ~/dev/work/.gitconfig

[url "github-work:work-github-org/"]
    insteadOf = git@github.com:work-github-org/

~/dev/work/.gitconfig

[user]
    email = work@work.email

すべての作業リポジトリを〜/ dev / workおよび個人的なものの下に保持している限り、gitはサーバーへのプル/クローン/プッシュを実行するときに正しいSSHキーを使用し、すべてに正しいメールアドレスを添付しますあなたのコミット。

参照:


これはクローンでどのように機能しますか?私が思っincludeIf.gitディレクトリが存在する場合にのみ動作するはずですか?
detly

私が理解するまで待ってください。それを処理するのはURLの書き換えです。この答えは信じられないほど便利です!
detly

4

WindowsでGitバージョンのsshを使用している場合、ssh構成のIDファイルの行は次のようになります。

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

どこ/cc:

確認するには、gitのbashで

cd ~/.ssh
pwd 

3

デフォルトのホスト構成を削除(またはコメント化)する必要がある場合があります .ssh / config


1

あなたはファイル設定キーsshで最も指定しました:

# Default GitHub user
Host one
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-one
 IdentitiesOnly yes

#two user
Host two
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-two
 IdentitiesOnly yes

0

他の誰かが述べたように、core.sshCommandSSHキーと他のパラメーターを上書きするためにconfigを使用できます。

以下に、名前を付けた代替キーが~/.ssh/workrsaあり、で複製されたすべてのリポジトリにそれを使用したい場合の例を示します~/work

  1. .gitconfig下に新しいファイルを作成します~/work
[core]
  sshCommand = "ssh -i ~/.ssh/workrsa"
  1. グローバルgit configに~/.gitconfig、以下を追加します。
[includeIf "gitdir:~/work/"]
  path = ~/work/.gitconfig

0

使用する1つの可能性~/.ssh/configは、Match制限の代わりに制限を使用することですHost。特にMatch Exec、シェルコマンドを呼び出して、宣言を適用するかどうかを決定します。bashでは、次のコマンドを使用できます。

[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]

これはbash [コマンドを使用して、2つの文字列が等しいかどうかを確認します。この場合git@git.company.com:gitolite-admin$(git config --get remote.origin.url)''コマンドから取得した出力と文字列が一致するかどうかをテストしています。

シェルが存在するリポジトリーを識別する他のコマンドを使用できます。これが機能するためには、変数をシェルに定義することが重要$SHELLです(私の場合)/bin/bash。完全な例は次のようになります~/.ssh/config

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

Match Exec "[ git@git.company.com:some_repo = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

この例では、私はそれが前提と~/.ssh/yourOwnPrivateKeyあなた自身の秘密鍵が含まれており、それが~/.ssh/gitolite-adminユーザーの秘密鍵が含まれていますgitolite-adminMark LongairがIdentitiesOnly yes言及しているように、gitサーバーに提供されるキーが1つだけであることを確認する宣言を含めました。その他の宣言は、gitの標準のsshオプションにすぎません。

some_repo異なるキーで使用したいものがいくつかある場合は、この構成を追加できます。複数のリポジトリがgit@git.company.comあり、それらのほとんどを使用して~/.ssh/yourOwnPrivateKeyいる場合は、このキーをホストのデフォルトとして含める方が理にかなっています。この場合、次の~/.ssh/configようになります。

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes

Host git.company.com
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

順序が重要であり、Host git.company.com制限がMatch Exec1つまたは複数の後に表示されることに注意してください。


0

を使用してリポジトリを設定しますgit config。例えば:

git config --add --local core.sshCommand 'ssh -i ~/.ssh/<<<PATH_TO_SSH_KEY>>>'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.