2011-01-12 18:20:31 +0000 2011-01-12 18:20:31 +0000
702
702

どの秘密鍵を使うかを git に伝えるには?

ssh には、認証時にどの秘密鍵ファイルを使うかを伝えるための -i オプションがあります。  デフォルトは、プロトコルバージョン 1の場合は-i identity_file、プロトコルバージョン 2の場合は~/.ssh/identity~/.ssh/id_rsaです。 IDファイルは、設定ファイルでホストごとに指定することもできます。  複数の~/.ssh/id_dsaオプション(および設定ファイルで指定された複数のID)を持つことも可能です。

-iディレクトリに複数の秘密鍵があるシステムで、どの秘密鍵ファイルを使用するかをgitに伝える同様の方法はありますか?

回答 (19)

720
720
720
2011-01-12 19:36:21 +0000

設定ファイルが新しい場合は、~/.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}があることに注意してください - これはURIではないからです。 - そして:はGitHubレポのURI名です。SSHは、明確に明示されていない方法で、あまりにも読みやすいSSHキーを拒否します。クレデンシャル拒否のように見えてしまうだけです。この場合の解決策は、次のようになります:

chmod 400 ~/.ssh/id_rsa_github
387
387
387
2015-05-08 09:43:07 +0000

環境変数 GIT_SSH_COMMAND:

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

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

設定 -i:

Git バージョン 2.10.0 からは、レポごとにもグローバルにも設定できるようになっています。 10.0からは、これをレポ単位でもグローバルでも設定できるようになったので、もう環境変数を設定する必要はありません!

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example
122
122
122
2015-01-23 22:08:00 +0000

リポジトリ認証は git に依存しているため、どの秘密鍵を使用するかを ssh に指示する _直接的な方法** はありません。しかし、目的を達成するためにはいくつかの方法があります:

オプション 1: ssh-agent

秘密鍵を一時的に認証するために ssh-agent を使用することができます。

例:

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

オプション 3: GIT_SSH_COMMAND

別の GIT_SSH_COMMAND バイナリを指定するために環境変数 $ を使って ssh 引数を渡します。これらは _リポジトリ認証はgitに依存しているため、どの秘密鍵を使用するかをssh` に指示する _直接的な方法** はありません。しかし、目的を達成するためにはいくつかの方法があります:

オプション 1: ssh-agent

秘密鍵を一時的に認証するために ssh-agent を使用することができます。

例:

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

オプション 3: GIT_SSH_COMMAND

別の GIT_SSH_COMMAND バイナリを指定するために環境変数 $ を使って ssh 引数を渡します。これらは __ という名前のファイルを作成し、それを実行可能にし、(間接的に)それを実行します。

33
33
33
2011-01-12 18:25:51 +0000

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

22
22
22
2016-05-17 15:03:09 +0000

カスタムホストの設定を ~/.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
22
22
22
2015-07-21 19:44:50 +0000

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 で) したい場合に便利です。 例えば cron で)
  • 間違いなく、外部ツールは必要ありません。
17
17
17
2015-05-28 17:09:40 +0000

私の例では、あなたが秘密鍵を持っていると仮定して、$GIT_SSH

Error to avoid. GIT_SSHの値にはオプションが含まれていますが、gitがファイルとして実行しようとするため、002

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

または似たようなものは失敗します。このため、スクリプトを作成する必要があります。

$GIT_SSH スクリプトの動作例 /home/user/.ssh/jenkins

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

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

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

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

002 最後の /home/user/gssh.sh は重要な部分です。

あなたのデフォルトのコンフィグファイル(使用するポートを明示的に言及することに加えて)の何かとの任意の可能な競合を防ぐであろうさらに安全な代替手段は、次のとおりです:

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

スクリプトが$*にあると仮定すると、次のようにしなければなりません:

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

とすべてが動作しなければなりません。

7
7
7
2013-03-23 01:35:15 +0000

独自のラッパーを作成する代わりに ssh-ident を使用することができます。 https://github.com/ccontavalli/ssh-ident

複数のログインセッションや xterms、NFS 共有ホームでも、最初に必要とされたときに一度だけ、必要に応じて ssh 鍵をロードします。

6
6
6
2018-03-26 19:26:38 +0000

私は別のgithubアカウントを必要とするクライアントを持っていました。

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

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

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

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

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

5
5
5
2018-12-04 22:21:13 +0000

リポジトリの設定でどの ssh ID を使用するかを指定できるようにするために、私の $HOME/bin/git-ssh ファイルは次のようになります。

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

3
3
3
2018-05-03 10:17:14 +0000

私は、@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 コマンドは普通に動作します。 g.:

git push origin master
git pull origin

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

3
3
3
2015-12-05 12:22:32 +0000

私の解決策はこれでした:

スクリプトを作成します:

#!/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を変更する必要があるときに実行:

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

余分なドットを忘れないでください!これは、スクリプトが環境変数を設定します! –keyと–portはオプションです。–keyおよび–portは任意である。

3
3
3
2016-02-11 22:44:57 +0000

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

2
2
2
2018-07-05 09:53:09 +0000
# 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

&001

と入力するだけで、リポジトリのクローンを作成できます。

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

1
1
1
2019-08-31 05:43:47 +0000
# 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
1
1
2019-01-07 18:26:23 +0000

この質問では要求されていませんが、同じ問題を解決しようとしている人のために gitlab のためだけにこの回答を載せておきます。

gitlab の解決策

私は environment-variables のアプローチを使ってみましたが、 git documentation でも、単純なケース以外では ~/.ssh/config を使うことを推奨しています。私の場合は gitlab サーバーにプッシュしていますが、特定のユーザーとしてプッシュしたかったのです。一旦実装すると、以下のようになります:

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

Setup

私の場合は、private-key gitの場所を思い出してください。

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

/myfolder/.ssh/my_gitlab_id_rsa にエントリを追加する ~/.ssh/config:

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"

おまけとして、この git-alias を使って このホストで特定のユーザーとしてコミットを実行する を追加します。

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

解説

上記のすべては、関連するリモートが ~/.gitconfig であり、関連するブランチが現在チェックアウトされていることを前提としています。参考までに、私は対処する必要があったいくつかの項目に遭遇しました。

  • ソリューションは、新しいリモートを作成する必要があります origin、そして私は余分なリモートを見て好きではなかったので、私は終了したときにそれを削除します (/questions/tagged/git-alias “show questions tagged ‘git-alias’”) [私のログツリーの周りにぶら下がっている]
  • リモートを作成するために。リモートの URL をその場で生成する必要があります - gitlab の場合は、シンプルな bash cut
  • gitlab_as_me へのプッシュを行う際には、どのブランチをプッシュするのかを明確にする必要があります
  • プッシュを行った後、ローカルの gitlab_as_me ポインタを origin と一致させるために “更新” する必要があります (これは gitlab_as_me が行っています)。
1
1
1
2019-04-06 20:42:39 +0000

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

ssh 鍵の生成は同じ手順で行いますが、必ず

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

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

公開鍵をgitlabに追加する gitlabにssh鍵を追加する方法 )

以下のコマンドを使って、新しいssh鍵を生成します。

0
0
0
2018-06-06 04:37:12 +0000

git バージョン 2.16 を使っていますが、スクリプトは一切必要ありませんし、設定や変更したコマンドも必要ありません。何も聞かないし、エラーも出ません。正常に動作しています。

0
0
0
2020-01-24 00:58:26 +0000

同じホストに異なるキーで接続する必要がある場合、以下の方法で接続することができます:

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

例:

~/.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
``` をしなければなりません。