かなり珍しい状況かもしれませんが、ローカルコンピュータからShell(git)コマンドを実行するときに使用するプライベートSSHキーを指定したいと思います。
基本的にこのように:
git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
もっと良いのは(Rubyでは):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end
指定された秘密鍵を使用するNet :: SSHでリモートサーバーに接続する例を見ましたが、これはローカルコマンドです。出来ますか?
このようなものでうまくいくはずです(oripが提案)。
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'
もしあなたがサブシェルを好むなら、あなたは次のことを試みることができます(それはもっと壊れやすいですが):
ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)
GitはSSHを起動し、環境変数でエージェントを見つけます。これにより、キーがロードされます。
あるいは、HOME
として.ssh
ディレクトリのみを含むディレクトリを設定したい場合は、HOME
を設定してもうまくいきます。これはidentity.pub、または 設定ファイル 設定IdentityFileのいずれかを含みます。
これらの解決策のどれも私のために働きませんでした。
代わりに、@ Martin v。LöwisがSSH用のconfig
ファイルを設定することについて述べています。
SSHはユーザーの~/.ssh/config
ファイルを探します。私の設定は次のとおりです。
Host gitserv
Hostname remote.server.com
IdentityFile ~/.ssh/id_rsa.github
IdentitiesOnly yes # see NOTES below
そしてリモートのgitリポジトリを追加します。
git remote add Origin git@gitserv:myrepo.git
それから、gitコマンドは私にとっては普通に動作します。
git Push -v Origin master
_メモ_
IdentitiesOnly yes
は SSHのデフォルトの振る舞いを防ぐために必要です /各プロトコルのデフォルトのファイル名と一致する識別ファイルを送信する~/.ssh/id_rsa
という名前のファイルがある場合は、このオプションなしで~/.ssh/id_rsa.github
の前に試してください。参考文献
~/.ssh/config
に関する他の人々の提案は非常に複雑です。それは次のように単純になります。
Host github.com
IdentityFile ~/.ssh/github_rsa
Git 2.3.0からは、単純なコマンドもあります(設定ファイルは必要ありません)。
GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@Host:repo.git
あなたのマシン上でsshサービスを再起動する必要があるかもしれません。
My_git_ssh_wrapperの内容:
#!/bin/bash
ssh -i /path/to/ssh/secret/key $1 $2
そうすれば、次のようにして鍵を使用できます。
GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git
答えと コメント をまとめるには、異なるキーファイルを使うようにgitを設定し、それを忘れるのが最も良い方法です。これはWindowsでも機能します。~/.ssh/config
(またはc:\Users\<your user>\.ssh\config
)を編集して複数のIDを指定することです。
Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv
Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser
次に、個人ユーザーとしてプロジェクトを複製するには、通常のgit clone
コマンドを実行するだけです。
リポジトリをworkuser
として複製するには、git clone git@github-work:company/project.git
を実行します。
Git 2.10以降(2016年第3四半期:2016年9月2日リリース)では、GIT_SSH_COMMAND
に config を設定することができます( Rober Jack Will 'で説明されている環境変数だけではありません) s 答え )
commit 3c8ede3 (26 Jun 2016)による NguyễnTháiNgọcDuy(pclouds
) を参照。
( Junio C Hamano - gitster
- in commit dc21164 、2016年7月19日にマージ)
新しい設定変数
core.sshCommand
がに追加され、GIT_SSH_COMMANDにリポジトリごとに使用する値を指定します。
core.sshCommand:
この変数が設定されていると、
git fetch
とgit Push
は、リモートシステムに接続する必要があるときに、ssh
ではなく指定されたコマンドを使用します。
このコマンドはGIT_SSH_COMMAND
環境変数と同じ形式であり、環境変数が設定されているとオーバーライドされます。
git clone
は次のようになります。
cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file'
# later on
git clone Host:repo.git
ここに述べたように: https://superuser.com/a/912281/607049
レポごとに設定できます。
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git Push
GIT_SSH環境変数を使いました。上のJoe Blockのラッパーと似ていますが、任意の数の引数を処理するラッパーです。
ファイル〜/ gitwrap.sh
#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"
次に、私の.bashrcに以下を追加します。
export GIT_SSH=~/gitwrap.sh
そのHostまたはipを.ssh/config
ファイルに追加するほうがよいでしょう。
Host (a space separated list of made up aliases you want to use for the Host)
User git
Hostname (ip or hostname of git server)
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
通常のリクエスト(git pull Origin master
)でgithubに接続する必要があるとき、*
のHostを~/.ssh/config
に設定するとうまくいきましたが、他のHost(例えば "github"や "gb")はうまくいきませんでした。
Host *
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_xxx
これらの解決策の多くは魅力的に見えました。しかし、私は次のリンクにある一般的なgit-wrapping-scriptアプローチが最も有用であることがわかりました。
重要なのは、次のようなgit
コマンドがないことです。
git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Alvinの解決策は、このギャップを埋める、明確に定義されたbash-wrapperスクリプトを使用することです。
git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
git.sh
は次のとおりです。
#!/bin/bash
# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command
if [ $# -eq 0 ]; then
echo "Git wrapper script that can specify an ssh-key file
Usage:
git.sh -i ssh-key-file git-command
"
exit 1
fi
# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0
if [ "$1" = "-i" ]; then
SSH_KEY=$2; shift; shift
echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
chmod +x /tmp/.git_ssh.$$
export GIT_SSH=/tmp/.git_ssh.$$
fi
# in case the git command is repeated
[ "$1" = "git" ] && shift
# Run the git command
git "$@"
git remote update
、git pull
、およびgit clone
を使用して、リモートのbitbucketリポジトリのユーザー/キー認識で発生していた問題がこれで解決したことを確認できます。これらはすべて、cron
ジョブスクリプトではうまく機能しますが、そうでなければ制限付きシェルをナビゲートするのに問題がありました。私はR内からこのスクリプトを呼び出すこともでき、それでもまったく同じcron
execute問題(例えばsystem("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
)を解決することができました。
RはRubyと同じではありませんが、Rができれば…O :-)
ここで他の解決策がどれもうまくいかず、複数のsshキーを作成したが、それでも簡単なことができない場合は、
git pull
次に、2つのsshキーファイルがあるとします。
id_rsa
id_rsa_other_key
それからあなたが苦労しているgitリポジトリの中で(そこへcdして)、試してみてください。
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key
また、githubのデフォルトのユーザー名とユーザーIDが正しいことを確認します。
# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]"
詳細については https://Gist.github.com/jexchan/2351996 を参照してください。
GIT_SSH_COMMAND = "ssh -i/path/to/git-private-access-key" gitクローン$ git_repo
パス上に特定の識別ファイルで署名したいディレクトリがある場合は、 ControlPath
を設定することにより、.ssh/configファイルで特定の識別ファイルを使用するように指定できます。
Host github.com
ControlPath ~/Projects/work/**
HostName github.com
IdentityFile ~/.ssh/id_work
User git
それからssh
は与えられた作業パスの下でgitコマンドを実行するとき指定されたアイデンティティファイルを使用します。
私にとってのトリックは、 http:// hostname の代わりにgit @ hostnameを使うことでした。
Git BashがインストールされているWindowsでは、以下を使用してリポジトリ ssh-agent bash -c 'ssh-add "key-address"; git remote add Origin "rep-address"'
を追加できます。ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add Origin [email protected]:test/test.git'
どの秘密鍵がDドライブにあるか、コンピュータのフォルダテスト。また、リポジトリを複製したい場合は、git remote add Origin
をgit clone
で変更できます。
これをGit Bashに入力すると、パスフレーズの入力を求められます。
Openssh秘密鍵とPuTTY秘密鍵が異なることに注意してください。
あなたがputtygenであなたの鍵を作成したなら、あなたはあなたの秘密鍵をopensshに変換しなければなりません!
GIT_SSH環境変数を使うことができます。しかし、sshとオプションをシェルスクリプトにラップする必要があります。
コマンドシェルのgit manual:man git
を参照してください。
これが私がこの問題の解決策を見つけている間に見つけたSSHキーハックです:
たとえば、2つの異なるキーセットがあります。
key1, key1.pub, key2, key2.pub
これらのキーを.ssh
ディレクトリに保存してください。
.bashrc
または.bash_profile
エイリアスファイルに、これらのコマンドを追加します。
alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'
alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'
ほら!いつでもキーを切り替えるショートカットがあります。
これがあなたのために働くことを願っています。
gitlab の場合RSAAuthentication yes
Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/your_private_key_name
IdentitiesOnly yes
以下のように〜/ .ssh/configを作成する必要があります。
Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file
下記のように許可
-rw------- $HOME/.ssh/config
あなたのgitにあなたの公開鍵を追加しなさい
そして以下のようにクローンをgit
git clone ssh://[email protected]/userid/test.git
問題は、同じホスト上に異なるリモートリポジトリ(github.comと言う)があり、異なるsshキー(つまり異なるGitHubアカウント)を使用してそれらとやり取りしたい場合です。
それをするために:
1)最初に〜/ .ssh/configファイルであなたの異なるキーを宣言するべきです。
# Key for usual repositories on github.com
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# Key for a particular repository on github.com
Host XXX
HostName github.com
User git
IdentityFile ~/.ssh/id_other_rsa
これを行うことで、2番目のキーをgithub.comの新しいフレンドリ名 "XXX"に関連付けます。
2)それからあなたはあなたの特定のリポジトリのリモートOriginを変更しなければならないので、それはあなたがあなたが定義したフレンドリーネームを使うように。
コマンドプロンプト内であなたのローカルリポジトリフォルダに行き、現在のリモートOriginを表示してください。
>git remote -v
Origin [email protected]:myuser/myrepo.git (fetch)
Origin [email protected]:myuser/myrepo.git (Push)
次にOriginを変更します。
>git remote set-url Origin git@XXX:myuser/myrepo.git
>git remote -v
Origin git@XXX:myuser/myrepo.git (fetch)
Origin git@XXX:myuser/myrepo.git (Push)
これで、正しいキーで自動的にプッシュ、フェッチ、…できます。
SSHポート番号が22(デフォルト)ではない場合、Port xx
に~/.ssh/config
を追加します。
私の場合(類義語)、
Host my_synology
Hostname xxxx.synology.me
IdentityFile ~/.ssh/id_rsa_xxxx
User myname
Port xx
それからconfigでHost titleを使ってクローンを作成します。 ( "my_synology"。@ chopstikの "*"を避けるため)
git clone my_synology:path/to/repo.git
私はzsh
を使用し、私のラップトップ上の他の目的(すなわちリモートサーバーへのアクセス)のために異なるキーが私のzshシェルのssh-agent
に自動的にロードされます。 @ Nickの答えを修正し、頻繁に更新する必要がある自分のリポジトリの1つにそれを使用しています。 (この場合、私のdotfiles
は私が働いているところはどこでも、私のすべてのマシンで同じ最新バージョンが欲しいのです。)
bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
cd
が成功したら、リモートレポジトリから引っ張ります。私のような人なら、次のことができます。
SSHキーを整理しておく
Git cloneコマンドをシンプルにしてください
任意の数のリポジトリに対して任意の数のキーを処理します。
あなたのSSHキーのメンテナンスを減らす。
キーは~/.ssh/keys
ディレクトリに保存しています。
私は設定よりも規約を好む。
コードは法律だと思います。それが単純であるほど、より良いです。
ステップ1 - エイリアスの作成
このエイリアスをあなたのシェルに追加してください:alias git-clone='GIT_SSH=ssh_wrapper git clone'
ステップ2 - スクリプトを作成する
この ssh_wrapper スクリプトをPATHに追加してください。
#!/bin/bash
# Filename: ssh_wrapper
if [ -z ${SSH_KEY} ]; then
SSH_KEY='github.com/l3x' # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "$@"
_例_
Github.com/l3xキーを使用してください。
KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go
次の例でも github.com/l3x キーを使用しています(デフォルト)。
git-clone https://github.com/l3x/learn-fp-go
Bitbucket.org/lsheehanキーを使用してください。
KEY=bitbucket.org/lsheehan git-clone [email protected]:dave_andersen/exchange.git
_メモ_
Ssh_wrapperスクリプトのデフォルトのSSH_KEYを、ほとんどの場合に使用するものに変更します。そうすれば、ほとんどの場合KEY変数を使用する必要がなくなります。
「ちょっと、それはエイリアス、スクリプト、そしていくつかのキーのディレクトリでよく起こっている」と思うかもしれませんが、私にとってはそれは慣例です。ほぼすべての私のワークステーション(およびそのことについてはサーバー)も同様に構成されています。
ここでの私の目標は、私が定期的に実行するコマンドを単純化することです。
私の慣習、例えばBashスクリプト、エイリアスなどは、一貫した環境を作り出し、物事を単純に保つのに役立ちます。
KISSと名前は重要です。
デザインのヒントについては、私の本の第4章SOLID Design in Goを参照してください。 https://www.Amazon.com/Learning-Functional-Programming-Lex-Sheehan-電子ブック/ dp/B0725B8MYW
それが役立つことを願っています。 - レックス