web-dev-qa-db-ja.com

GitでShellコマンドを実行するときに使用するプライベートSSHキーを指定する方法

かなり珍しい状況かもしれませんが、ローカルコンピュータから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でリモートサーバーに接続する例を見ましたが、これはローカルコマンドです。出来ますか?

865
Christoffer

このようなものでうまくいくはずです(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のいずれかを含みます。

610

これらの解決策のどれも私のために働きませんでした。 

代わりに、@ 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 yesSSHのデフォルトの振る舞いを防ぐために必要です /各プロトコルのデフォルトのファイル名と一致する識別ファイルを送信する~/.ssh/id_rsaという名前のファイルがある場合は、このオプションなしで~/.ssh/id_rsa.githubの前に試してください。

参考文献

999
HeyWatchThis

~/.ssh/configに関する他の人々の提案は非常に複雑です。それは次のように単純になります。

Host github.com
  IdentityFile ~/.ssh/github_rsa
367
philfreo

Git 2.3.0からは、単純なコマンドもあります(設定ファイルは必要ありません)。

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@Host:repo.git

あなたのマシン上でsshサービスを再起動する必要があるかもしれません。

295

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
126
Joe Block

答えと コメント をまとめるには、異なるキーファイルを使うように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を実行します。

81
Dan Dascalescu

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 fetchgit 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
65
VonC

ここに述べたように: https://superuser.com/a/912281/607049

レポごとに設定できます。

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

GIT_SSH環境変数を使いました。上のJoe Blockのラッパーと似ていますが、任意の数の引数を処理するラッパーです。

ファイル〜/ gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

次に、私の.bashrcに以下を追加します。

export GIT_SSH=~/gitwrap.sh
30
Jamie

その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)
28
thamster

通常のリクエスト(git pull Origin master)でgithubに接続する必要があるとき、*のHostを~/.ssh/configに設定するとうまくいきましたが、他のHost(例えば "github"や "gb")はうまくいきませんでした。

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
7
chopstik

これらの解決策の多くは魅力的に見えました。しかし、私は次のリンクにある一般的なgit-wrapping-scriptアプローチが最も有用であることがわかりました。

gitコマンドでsshキーファイルを指定する方法

重要なのは、次のような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 updategit pull、およびgit cloneを使用して、リモートのbitbucketリポジトリのユーザー/キー認識で発生していた問題がこれで解決したことを確認できます。これらはすべて、cronジョブスクリプトではうまく機能しますが、そうでなければ制限付きシェルをナビゲートするのに問題がありました。私はR内からこのスクリプトを呼び出すこともでき、それでもまったく同じcron execute問題(例えばsystem("bash git.sh -i ~/.ssh/thatuserkey.pem pull"))を解決することができました。

RはRubyと同じではありませんが、Rができれば…O :-)

7
Paul McMurdie

ここで他の解決策がどれもうまくいかず、複数の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 を参照してください。

4
cgnorthcutt

GIT_SSH_COMMAND = "ssh -i/path/to/git-private-access-key" gitクローン$ git_repo

3
carlsborg

パス上に特定の識別ファイルで署名したいディレクトリがある場合は、 ControlPath を設定することにより、.ssh/configファイルで特定の識別ファイルを使用するように指定できます。

Host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

それからsshは与えられた作業パスの下でgitコマンドを実行するとき指定されたアイデンティティファイルを使用します。

3
cristobal

私にとってのトリックは、 http:// hostname の代わりにgit @ hostnameを使うことでした。

2
AmazingTurtle

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 Origingit cloneで変更できます。

これをGit Bashに入力すると、パスフレーズの入力を求められます。

Openssh秘密鍵とPuTTY秘密鍵が異なることに注意してください。

あなたがputtygenであなたの鍵を作成したなら、あなたはあなたの秘密鍵をopensshに変換しなければなりません!

2
Peyman Mahdavi

GIT_SSH環境変数を使うことができます。しかし、sshとオプションをシェルスクリプトにラップする必要があります。

コマンドシェルのgit manual:man gitを参照してください。

2
rudimeier

これが私がこの問題の解決策を見つけている間に見つけた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'

ほら!いつでもキーを切り替えるショートカットがあります。

これがあなたのために働くことを願っています。 

1
penduDev

gitlab の場合RSAAuthentication yes 

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

docはこちら

1
Alupotha

以下のように〜/ .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
0
gajanan malvade

問題は、同じホスト上に異なるリモートリポジトリ(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)

これで、正しいキーで自動的にプッシュ、フェッチ、…できます。

0
rodo

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
0
w..k

私は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'
  • SSHエージェントを起動する
  • エージェントに読み取り専用キーを追加する
  • ディレクトリを私のgitリポジトリに変更します
  • レポジトリへのcdが成功したら、リモートレポジトリから引っ張ります。
  • 生成されたssh-agentを殺します。 (私はエージェントの多くが長続きしたくないでしょう。)
0
sdkks

私のような人なら、次のことができます。

  • 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

それが役立つことを願っています。 - レックス

0
l3x