web-dev-qa-db-ja.com

どの秘密鍵を使うべきかをgitに教えるにはどうすればいいですか?

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

-i identity_file

    RSAまたはDSA認証用のID(秘密鍵)が読み取られるファイルを選択します。デフォルトは、プロトコルバージョン1の場合は~/.ssh/identity、プロトコルバージョン2の場合は~/.ssh/id_rsaおよび~/.ssh/id_dsaです。アイデンティティファイルは、構成ファイルでホストごとに指定することもできます。複数の-iオプション(および構成ファイルで指定された複数の識別情報)を持つことが可能です。

~/.sshディレクトリに複数の秘密鍵があるシステムで、どの秘密鍵ファイルを使用するかをgitに指示するための同様の方法はありますか?

587
jrdioko

~/.ssh/configに以下を追加します。

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

これでgit clone [email protected]:username/repo.gitを実行できます。

注:IdentityFileのアクセス許可が400であることを確認してください。それは単にクレデンシャル拒否のように見えます。この場合の解決策は次のとおりです。

chmod 400 ~/.ssh/id_rsa_github
625
shellholic

環境変数GIT_SSH_COMMAND

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

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

-iはあなたの設定ファイルで上書きされることがあるので注意してください。その場合、あなたはSSHに空の設定ファイルを与えるべきです。

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

設定core.sshCommand

Gitバージョン2.10.0から、これはリポジトリごとにあるいはグローバルに設定できるので、もう環境変数を設定する必要はありません!

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

リポジトリ認証ではgitname__に依存しているため、sshname__にどの秘密鍵を使用するかを指示するno直接の方法があります。しかし、目標を達成するにはまだいくつかの方法があります。

オプション1:ssh-agent

プライベートキーを一時的に認証するためにssh-agentを使用できます。

例えば:

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

オプション2:GIT_SSH_COMMAND

GIT_SSH_COMMAND環境変数(Git 2.3.0以降)を使用してssh引数を渡します。

例えば:

$ 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環境変数を使用して代替のsshname__バイナリーを指定して、ssh引数を渡します。

例えば:

$ 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

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

注: GIT_SSHはv0.99.4 (2005)から利用可能です。

オプション4:~/.ssh/config

秘密鍵の場所を指定するには、他の回答で提案されているように~/.ssh/configファイルを使用します。

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

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

Gitを実行するたびに環境変数を指定したくない場合、他のラッパースクリプトを使用しない場合、ssh-agent(1)を実行しない場合、またはこれ以外のパッケージをダウンロードしない場合-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など)が必要な場合に便利です。
  • もちろん、外部ツールは必要ありません
17
flaviovs

$GIT_SSHとの闘いの後、私は私のために働いたことを共有したいと思います。

私の例では、あなたの秘密鍵は/home/user/.ssh/jenkinsにあると思います。

避けるべきエラー:GIT_SSH値にオプションが含まれています

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

gitは値をファイルとして実行しようとします。そのため、スクリプトを作成する必要があります。

$ 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

そしてすべてがうまくいくでしょう。

15
Jan Vlcinsky

このように、~/.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  
13
thucnguyen

あなた自身のラッパーを作成する代わりにssh-identを使うことができます。

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

複数のログインセッション、xterms、NFS共有ホームの場合でも、最初に必要になったときに一度だけsshキーをオンデマンドでロードします。

小さな設定ファイルで、あなたがする必要があることに応じて、それは自動的に異なるキーをロードし、(エージェント転送のために)異なるエージェントにそれらを分離しておくことができます。

5
rabexc

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

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

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

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

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

私にとっては、覚えるほうが簡単です。

4
Michael Cole

そこで、GIT_SSH env変数を$HOME/bin/git-sshに設定しました。

私のリポジトリ設定がどのsshアイデンティティを使うかを決定することをサポートするために、私の~/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設定値を設定することができます。

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

ほら!

それぞれのアイデンティティに対して異なるEメールアドレスを持つことができれば、Eメールアドレスの後にキーに名前を付けて、git configのuser.emailにこのような~/bin/git-sshのキー選択をさせることができるので、さらに簡単になります。

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

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

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

#!/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はオプションです。

2
Salsicha

私は@shellholicと このSO thread をいくつかのチークで構築します。私は例としてGitHubを使い、あなたが~/.ssh/githubに秘密鍵を持っていると仮定します(そうでなければ、 this SO thread を見てください)。あなたはあなたのGitHubプロファイルに公開鍵を追加しました(そうでなければ GitHubのヘルプ をご覧ください)。

必要に応じて、新しいSSH設定ファイルを~/.ssh/configに作成し、権限を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 [email protected]:user_name/repo_name.git

そしてgitコマンドは普通に動作します。

git Push Origin master
git pull Origin 

@HeyWatchThis on this SO thread は、それぞれのデフォルトファイル名に一致するIDファイルを送信するというSSHのデフォルト動作を防ぐためにIdentitiesOnly yesを追加することを推奨プロトコル。詳細と参照についてはそのスレッドを参照してください。

2
mmorin

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 [email protected]:<yourname>/<your-repo>.git

リポジトリのクローンを作成します。

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

1
Jinmiao Luo

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

1
Zaz

私はgitバージョン2.16を使っています、そしてconfigや修正されたコマンドでさえも、1つのスクリプトを必要としません。

  • 私の秘密鍵を.ssh/id_rsaにコピーしただけです。
  • 権限を600に設定

そしてgitは自動的にキーを読みます。私は何も聞かないし、それはエラーを投げません。ただうまく働きます。

0
akprajapati

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

Gitlabソリューション

environment-variables アプローチを使用しようとしましたが、 gitドキュメント でさえ、単純なケース以外には~/.ssh/configを使用することをお勧めします。私の場合、私は gitlab サーバーにプッシュしています-そして、私は private-key で定義されている特定のユーザーとして- authentication ではなく、ユーザー名git。実装したら、次を実行するだけです。

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

セットアップ

private-key/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

~/.gitconfiggit-alias を追加します。

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 "[email protected]" commit \"$@\"; \
           }; f"

説明

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

  • このソリューションでは、新しいリモートgitlab_as_meを作成する必要があり、余分なリモート ログツリー内を移動する が表示されないので、終了したら削除します
  • リモートを作成するには、その場でリモートのURLを生成する必要があります-gitlabの場合、これは単純なbash cut で実現されました
  • gitlab_as_meへのプッシュを実行するときは、プッシュするブランチを明確にする必要があります
  • プッシュを実行した後、ローカルOriginポインターをgitlab_as_meに一致させるために「更新」する必要があります(git pull Origin $branchはこれを行います)
0
dtmland

あなたが複数のgitアカウントを持っていて、違うsshキーが欲しいとき

Sshキーを生成するのと同じ手順に従う必要がありますが、

ssh-keygen -t ed25519 -C "[email protected]" 

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

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

下記のコマンドを使って新しいsshのアイデンティティを持っています

ssh-add ~/my-pc/Desktop/.ssh/ed25519
0
Srikrushna Pal