2つの異なるSSHキーを必要とする2つのGitサーバーがあります。
git clone user1@server1:blahblahblah
を使用~/.ssh/id_rsa
しますが、接続しているサーバーに応じて使用するキーを指定する必要があります。
この仕事をするGitコマンドラインパラメーターは何ですか?(私はLinuxを実行しています。)
2つの異なるSSHキーを必要とする2つのGitサーバーがあります。
git clone user1@server1:blahblahblah
を使用~/.ssh/id_rsa
しますが、接続しているサーバーに応じて使用するキーを指定する必要があります。
この仕事をするGitコマンドラインパラメーターは何ですか?(私はLinuxを実行しています。)
回答:
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
この記事にはさらに詳細があります。
ssh-agent
して使用してssh-add
から、gitを使用することもできます。gitがssh経由で接続する場合、キーはすでに有効になっています。ほら、いくつかの方法がありますが、元の答えは実際には役に立ちません。
別の可能性があります。それは設定することです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
コマンドを使用してこれを永続的に設定できます。
git init
リポジトリをローカルで構成して正しいsshコマンドを使用し、リモートを追加することもできます(「gitclone」を使用した場合は1つだけであるのに対し、3つのステップ)。
通常、~/.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
するデフォルトのキーとして設定するために使用します。
私のシナリオでは、@ 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
必要に応じて変数が自動的に設定されます。
--globalまたは--local構成を設定できます。グローバルは~/.gitconfig
ファイルを更新し、ローカルはリポジトリ内の構成を更新し.git/config
、グローバル(〜/ .gitconfig)構成をオーバーライドします。
git config --local --add core.sshCommand'ssh -i〜 / .ssh / my_key '
ここの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
。これは、クローン作成時に提案するように環境を設定するよりも優れています。
他の回答から、コマンドラインオプションまたは(存在する場合は)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
別のオプションは、作成する小さなスクリプトを書くことです 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キーへのデフォルトのフォールバック」などを持つようにをます。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