ssh
には、認証時に使用する秘密鍵ファイルを指定するための-i
オプションがあります。
-i identity_file
RSAまたはDSA認証用のID(秘密鍵)が読み取られるファイルを選択します。デフォルトは、プロトコルバージョン1の場合は
~/.ssh/identity
、プロトコルバージョン2の場合は~/.ssh/id_rsa
および~/.ssh/id_dsa
です。アイデンティティファイルは、構成ファイルでホストごとに指定することもできます。複数の-i
オプション(および構成ファイルで指定された複数の識別情報)を持つことが可能です。
~/.ssh
ディレクトリに複数の秘密鍵があるシステムで、どの秘密鍵ファイルを使用するかをgit
に指示するための同様の方法はありますか?
~/.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
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
リポジトリ認証ではgit
name__に依存しているため、ssh
name__にどの秘密鍵を使用するかを指示するno直接の方法があります。しかし、目標を達成するにはまだいくつかの方法があります。
ssh-agent
プライベートキーを一時的に認証するためにssh-agent
を使用できます。
例えば:
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@Host'
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行にすべて入力することができます - $
を無視し、\
を省略します。
GIT_SSH
GIT_SSH
環境変数を使用して代替のssh
name__バイナリーを指定して、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
注:上記の行はシェル(端末)コマンド行で、これを端末に貼り付ける必要があります。彼らはssh
NAME _という名前のファイルを作成し、それを実行可能にし、そして(間接的に)それを実行します。
注: GIT_SSH
はv0.99.4 (2005)から利用可能です。
~/.ssh/config
秘密鍵の場所を指定するには、他の回答で提案されているように~/.ssh/config
ファイルを使用します。
Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_rsa
必要な引数で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)
私はこのソリューションが優れていると考えています。
$GIT_SSH
との闘いの後、私は私のために働いたことを共有したいと思います。
私の例では、あなたの秘密鍵は/home/user/.ssh/jenkins
にあると思います。
$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"
gitは値をファイルとして実行しようとします。そのため、スクリプトを作成する必要があります。
/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
そしてすべてがうまくいくでしょう。
このように、~/.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
あなた自身のラッパーを作成する代わりにssh-identを使うことができます。
あなたはもっと読むことができます: https://github.com/ccontavalli/ssh-ident
複数のログインセッション、xterms、NFS共有ホームの場合でも、最初に必要になったときに一度だけsshキーをオンデマンドでロードします。
小さな設定ファイルで、あなたがする必要があることに応じて、それは自動的に異なるキーをロードし、(エージェント転送のために)異なるエージェントにそれらを分離しておくことができます。
別のgithubアカウントを必要とするクライアントがありました。だから私はこのプロジェクトのためだけに別のキーを使う必要がありました。
私の解決策はこれを私の.zshrc/.bashrcに追加することでした。
alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"
そのプロジェクトにgitを使いたいときはいつでも、 "infogit"をgitに置き換えます。
infogit commit -am "Some message" && infogit Push
私にとっては、覚えるほうが簡単です。
そこで、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 $*
私の解決策はこれでした:
スクリプトを作成します。
#!/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はオプションです。
私は@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
を追加することを推奨プロトコル。詳細と参照についてはそのスレッドを参照してください。
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 [email protected]:<yourname>/<your-repo>.git
リポジトリのクローンを作成します。
マシンを再起動した後に上記のコマンドを実行する必要があります。
通常、これには~/.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
をデフォルトのキーとして設定するために使用します。
私はgitバージョン2.16を使っています、そしてconfigや修正されたコマンドでさえも、1つのスクリプトを必要としません。
そしてgitは自動的にキーを読みます。私は何も聞かないし、それはエラーを投げません。ただうまく働きます。
質問はそれを要求していませんが、 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
~/.gitconfig
に git-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
を作成する必要があり、余分なリモート ログツリー内を移動する が表示されないので、終了したら削除しますgitlab_as_me
へのプッシュを実行するときは、プッシュするブランチを明確にする必要がありますOrigin
ポインターをgitlab_as_me
に一致させるために「更新」する必要があります(git pull Origin $branch
はこれを行います)あなたが複数の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