ssh
には、認証時にどの秘密鍵ファイルを使用するかを指定する -i
オプションがあります
-i identity_file
RSA または DSA 認証の ID (秘密鍵) を読み込むファイルを選択します。既定値は、プロトコルバージョン 1 の場合は
~/.ssh/identity
、プロトコルバージョン 2 の場合は~/.ssh/id_rsa
および~/.ssh/id_dsa
です。IDファイルは、設定ファイルでホストごとに指定することもできます。 複数の-i
オプション (および設定ファイルで指定された複数の ID) を持つことも可能です
~/.ssh
ディレクトリに複数の秘密鍵があるシステムで、git
にどの秘密鍵ファイルを使用するかを伝える方法と似たような方法があるのでしょうか?
762 jrdioko 2011-01-12
~/.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}
は GitHub ユーザーアカウント (または組織アカウント) の GitHub URI 名ですgithub.com
の後にスラッシュ/
の代わりにコロン:
があることに注意してください – これはURIではないので
- そして、
{REPO_NAME}
はGitHubレポのURI名です - 例えば、for the Linux kernelの場合、これは
git clone git@github.com:torvalds/linux.git
になります。)
注意: LinuxとmacOSでは、IdentityFile
のパーミッションが400であることを確認してください。SSH は、はっきりとした方法ではありませんが、 あまりにも読みやすい SSH 鍵を拒否します。クレデンシャル拒否のように見えてしまうだけです。この場合の解決策は
chmod 400 ~/.ssh/id_rsa_github
773 shellholic 2011-01-12
環境変数 GIT_SSH_COMMAND
Gitバージョン2.3.0からは、環境変数GIT_SSH_COMMAND
をこのように使うことができます
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example
-i
は設定ファイルによって上書きされることがあることに注意してください
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example
Configuration core.sshCommand
:
Git バージョン 2.10.0 からは、これをレポごとに設定したり、グローバルに設定したりできるようになったので、環境変数を設定する必要がなくなりました!
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
449 Flimm 2015-05-08
リポジトリ認証はgit
に依存しているので、どの秘密鍵を使うかをgit
に直接伝える方法はありません。しかし、目的を達成するための方法はいくつかあります
オプション1: ssh-agent
の場合
ssh-agent
を使って秘密鍵を一時的に認証することができます
For example:
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
選択肢2:GIT_SSH_COMMAND
の場合
環境変数 GIT_SSH_COMMAND
を使って ssh の引数を渡します (Git 2.3.0+)
For example:
$ 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
を使用して、代替の ssh
バイナリを指定して ssh の引数を渡します
For example:
$ 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
注: 上記の行はシェル (ターミナル) コマンドラインであり、ターミナルに貼り付ける必要があります。これらは ssh
という名前のファイルを作成し、実行可能にし、(間接的に)実行します
注: GIT_SSH
は v0.99.4 (2005) 以降で利用可能です
選択肢4:~/.ssh/config
の場合
秘密鍵の場所を指定するために、他の回答で示唆されているように、~/.ssh/config
ファイルを使用してください
Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_rsa
135 kenorb 2015-01-23
必要な引数を指定して ssh
を呼び出すスクリプトを書いて、$GIT_SSH
にスクリプトのファイル名を入れてください。あるいは、設定を ~/.ssh/config
に記述するだけでも構いません
33 Ignacio Vazquez-Abrams 2011-01-12
~/.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
32 thucnguyen 2016-05-17
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など)が必要な場合に便利です
- 間違いなく、外部ツールは必要ありません
24 flaviovs 2015-07-21
私が$GIT_SSH
と格闘した後、私に効果があったことを共有したいと思います
この例では、あなたの秘密鍵が/home/user/.ssh/jenkins
にあると仮定しています
回避すべきエラーです。GIT_SSH の値にはオプションが含まれています
$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"
などを実行しても失敗します。そのため、スクリプトを作成する必要があります
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
そうすれば、すべてがうまくいく
17 Jan Vlcinsky 2015-05-28
そこで、git_sshのenv変数を$HOME/bin/git-ssh
にしてみました
どの ssh ID を使用するかをレポの設定で指定できるようにするために、 ~/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 config の値を設定すればいいのです
$ git config --local ssh.identity ~/.ssh/any_other_id_rsa
Voila!
それぞれの ID に対して異なるメールアドレスを設定できれば、さらにシンプルになります
#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*
7 Brendan Baldwin 2018-12-04
自分でラッパーを作るのではなく、ssh-ident を使えばいいのです
でもっと読むことができます。https://github.com/ccontavalli/ssh-ident
それは、複数のログインセッション、xtermsまたはNFS共有ホームであっても、最初に必要とされるときに、一度、オンデマンドでsshキーをロードします
小さな設定ファイルを使えば、必要なことに応じて、自動的に異なるキーをロードして、異なるエージェントに分けておくことができます(エージェント転送用)
6 rabexc 2013-03-23
私は別のgithubアカウントを必要とするクライアントを持っていました。そのため、このプロジェクトのためだけに別のキーを使う必要がありました
私の解決策は、これを .zshrc / .bashrc に追加することでした
alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"
そのプロジェクトでgitを使いたいときは、いつも “infogit “をgitに置き換えています
infogit commit -am "Some message" && infogit push
私にとっては、その方が覚えやすいです
6 Michael Cole 2018-03-26
私の解決策はこれでした
スクリプトを作成します
#!/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 はオプションです。–key と –port はオプションです
3 Salsicha 2015-12-05
一般的には、~/.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
をデフォルトのキーに設定して使用しています
3 Zaz 2016-02-11
私は @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 コマンドが正常に動作するようになります
git push origin master
git pull origin
このSOスレッドにある@HeyWatchThisは、各プロトコルのデフォルトのファイル名にマッチするIDファイルを送信するというSSHのデフォルトの動作を防ぐためにIdentitiesOnly yes
を追加することを提案しました。より詳しい情報と参考文献はそのスレッドを参照してください
3 miguelmorin 2018-05-03
同じホストに異なるキーで接続する必要がある場合は、次のようにして実現することができます
~/.ssh/config
を異なるHostでも同じHostNamesで構成します- 適切なホストを使用してレポをクローンします
Example:
~/.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
3 Maistora 2020-01-24
ssh-agent
とssh-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 git@github.com:<yourname>/<your-repo>.git
を使ってリポジトリをクローンします
マシンを再起動した後に上記のコマンドを実行する必要があります
1 Jinmiao Luo 2018-07-05
# 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 Yordan Georgiev 2019-08-31
私はgitのバージョン2.16を使っていますが、設定や変更されたコマンドすらスクリプトの一部も必要ありません
- 秘密鍵を .ssh/id_rsa にコピーしました
- パーミッションを600に設定します
そしてgitは自動的にkeyに読み込んでくれます。何も聞かないし、エラーも出ない。正常に動作しています
0 akjprajapati 2018-06-06
この質問はそれを要求していませんが、gitlabのためだけに、同じ問題を解決しようとしている人のために、この回答を含めています
gitlab のソリューション
私は environment-variables のアプローチを使ってみましたが、the git documentation でさえ、単純なケース以外では ~/.ssh/config
を使うことを推奨しています。私の場合は、gitlab サーバーにプッシュしています。key” rel=”tag” title=”show questions tagged ‘private-key'”>private-key の間、authenticationはユーザ名git
ではありません。一旦実装されると、私は以下のように単純に実行します
~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]
Setup
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
git-aliasを~/.gitconfig
に追加します
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"
Explanation
上記のすべては、関連するリモートが origin
で、関連するブランチが現在チェックアウトされていることを前提としています。参考までに、対処しなければならないいくつかの項目に遭遇しました
- この解決策には新しいリモート
gitlab_as_me
を作成する必要がありますが、余分なリモート がログツリーにぶら下がっているのを見るのが嫌だったので、終了したら削除しました - リモートを作成するためには、その場でリモートの URL を生成する必要があります – gitlab の場合は、シンプルなバッシュ cut で実現しました
gitlab_as_me
へのプッシュを行う際には、プッシュするブランチを明確にする必要があります- プッシュを実行した後、ローカルの
origin
ポインタはgitlab_as_me
にマッチするように “更新” される必要があります (これはgit pull origin $branch
が行います)
0 dtmland 2019-01-07
複数のgitアカウントを持っていて、異なるssh鍵が必要な場合
ssh鍵の生成も同じ手順で行いますが、必ず確認してください
ssh-keygen -t ed25519 -C "your-email-id@gmail.com"
保存したいパスを入力してください(例: my-pc/Desktop/.ssh/ed25519)
gitlabに公開鍵を追加します(How to adding ssh key to gitlab)
以下のコマンドを使用して、新しいssh IDを取得します
ssh-add ~/my-pc/Desktop/.ssh/ed25519
0 Srikrushna 2019-04-06