Gitでシェルコマンドを実行するときに使用する秘密SSHキーを指定する方法


1110

かなり珍しい状況かもしれませんが、ローカルコンピューターからシェル(git)コマンドを実行するときに使用する秘密のSSHキーを指定したいと思います。

基本的にこのように:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

またはさらに良い(Rubyで):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

指定した秘密鍵を使用するNet :: SSHを使用してリモートサーバーに接続する例を見てきましたが、これはローカルコマンドです。出来ますか?


6
SuperUserでもこの質問を参照してください。
Flimm

28
なぜこれが非常に珍しいのか、Gitの-iようにオプションがないのかと思いますssh
Nick T

29
git 2.10(2016年第3四半期)では、新しい構成も用意されていますgit config core.sshCommand 'ssh -i private_key_file'以下の私の回答を
VonC

3
私の意見では、HeyWatchThisの回答は受け入れられた回答である必要があります。現在の受け入れられた回答が必要とするように、各gitコマンドのサブシェルを作成する必要がなく、セットアップ後にすべてのgitコマンドを通常どおり実行できるからです。
gloriphobia 2017

回答:


801

このようなものが動作するはずです(oripが推奨)。

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

サブシェルを使用したい場合は、次の方法を試してみてください(ただし、より脆弱です)。

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

GitはSSHを呼び出し、環境変数によってエージェントを見つけます。これにより、キーが読み込まれます。

別の方法としてHOME.sshディレクトリだけを含むディレクトリをとして設定する場合は、設定で問題が解決することもありますHOME。これには、identity.pub、またはIdentityFileを設定する構成ファイルが含まれます


5
しかし、これは受け入れられたSSHキーとしてキーを永続的に追加しますよね?これを避けて、user2がユーザーのプロジェクトを混乱させないようにします。これはWebアプリケーション用であるため、異なるOSユーザーを使用することは現実的ではありません。
Christoffer 2010

28
いいえ、gitが完了すると、ssh-agentは終了し、キーは忘れられます。
Martin v。Löwis

6
このコマンドはWindows git bashでは機能しません。予期しないトークン 'ssh-add'近くの構文エラーを示しています
Mohit

116
:(WindowsまたはLinux用)を修正し、コマンドラインは次のようなものになるだろうssh-agent bash -c 'ssh-add sshkey; git clone url'
のoriP

4
ssh-agent $(..)構文は私のために働いていないと私はこれが仕事に想定されるかどうかはわかりません:(BA)のshは、内部のコマンドを実行する必要があり$(..)、パラメータとして出力を持つ最初の、そして実行のssh-agentを。
ヨハネス '魚' Ziemke

1200

これらの解決策はどれも私にとってうまくいきませんでした。

代わりに、@ Martin v。Löwis configがSSH用のファイルを設定することについて言及したことについて詳しく説明します。

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は、各プロトコルのデフォルトのファイル名と一致するIDファイルを送信するというSSHのデフォルトの動作防ぐために必要です。という名前のファイルがある場合、このオプションを使用しない場合は、~/.ssh/id_rsaその前に試行され~/.ssh/id_rsa.githubます。

参考文献


17
.ssh / configを使用して複数のキーを指定する場合、「git remote add」コマンドの一部として「Host」行でホストフレンド名を使用する必要があることがわかりました。行が「Host stg」の場合、git remote add <someName> user @ stg:/path_to_git_repo.git "を使用する必要があります。user@ myserver.com:/path_to_git_repo.gitのような正確なサーバー名を使用する場合、設定ファイルはgitによって選択されません。そのため、秘密鍵ファイルを正しく選択していません。同じコンテンツをgithubとherokuにプッシュすることでこれを試し、「git remote add」でフレンドリ名を指定した場合にのみ機能します
Gopinath MR

2
githubのホストについて確信が持てませんでした。私はこのリンクを見つけました:gist.github.com/jexchan/2351996
Karsten 14

1
見てください、ここであなたは、いくつかのgitリポジトリのためのいくつかの重要なファイルを持っているしたい場合は
e271p314

1
Host remote.server.com元のURLを使用して使い続けることができます
MauganRa

5
これは、2つの変更後に機能しました。設定ファイルが新しい場合は、忘れずに実行してくださいchmod 600 ~/.ssh/configここを参照)。そして、あなたはGitHubに、交換してください使用している場合Host gitservHost github.com、オミットしHostname remote.server.com、そしてリモートで追加しますgit remote add origin git@github.com:user_name/repo_name.git
miguelmorin

480

Git 2.3.0以降、シンプルなコマンドも用意されています(設定ファイルは必要ありません)。

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

3
私が得るcannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryそれが存在するものの444 Nov 16 18:12 /home/vagrant/.ssh/gitからls -l /home/vagrant/.ssh/git
テッド・

3
@ted:chmod 400 /home/vagrant/.ssh/git
Yash

8
素敵で簡単なソリューション。これを頻繁に行う必要がある場合は、エイリアスを作成することをお勧めします。
Lasse Meyer

5
を忘れないでくださいchmod 400 <path-to-private-key-file>。そうしないと、特別なエラーメッセージが表示されずにgitコマンドが失敗する場合があります...
Eonil

5
(SSHエージェントからのキーではなく)で-o IdentitiesOnly=yes指定されたキー-iが使用されることを確認するために、この回答も含めるとよいでしょう。
ロビンスト

423

他の人の提案~/.ssh/configは非常に複雑です。次のように簡単にすることができます。

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
IdentitiesOnlyオプションも必要です。
Flimm

4
@EnzeChiでは、リモートを操作して複数のgithubアカウントを作成できます git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git。次に、構成は次のようになりますHost personal HostName github.com ... Host corporate HostName github.com
エモリー

@EnzeChi私は2つの異なるsshキーを使用するために同様のことをします-1つはフェッチ用、もう1つはプッシュ用です。フェッチにはパスフレーズがありません。プッシュは行います。
エモリー

144

my_git_ssh_wrapperの内容:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

次に、次のようにしてキーを使用できます。

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

4
同じドメインに複数のアカウントがあり、他のソリューションではうまく処理できない場合の非常に優れたソリューション
Beka

1
素晴らしい解決策。> GIT_SSH = my_git_ssh_wrapperでこれを簡略化することもできます。git clone git@github.com:TheUser / TheProject.git
Shiva

2
このソリューションは、ホームディレクトリのないアカウントからgitを使用したい場合にも対応します。
piotrekkr 2014年

素晴らしい。:あなたはあまりにもプライベートサーバにこの方法を使用することができますGIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
トン

1
これは、cygwin環境で私のために働いた唯一の方法です
ChatterOne

113

gitのでは2.10+:(Q3 2016年9月にリリースが、2016 2D)、あなたが設定する可能性が持っている設定のためGIT_SSH_COMMANDに説明したように(だけでなく、環境変数をローベルジャックウィルさんの回答

参照してください3c8ede3コミットにより(2016年6月26日)のグエンタイ・ゴックDuyと(pclouds
(合併によりJunio C浜野- gitster-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

コマンドを1つだけ設定することもできます。

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

これは、設定よりも簡単であるGIT_SSH_COMMANDとして、Windows上で、これは、環境変数を指摘により、マーチャーシュ・クティ-Kreszács、だろう

set "GIT_SSH_COMMAND=ssh -i private_key_file"

@Flimmのリリース日:calendar.google.com/calendar/…–
VonC

リリースされました。
Flimm 2016年

4
動作します。人々はこれを最良の答えと考えるべきです。いったん発行されたら、事前に/ tmpにコピーしたバージョンで.git / configファイルを比較することは有益です。新しいエントリが作成されました:sshCommand = ...それの価値があるために、私は 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile"を使用しました。
WeakPointer 2018年

1
@Spankyインラインコマンドにgit -c core.sshCommand="ssh -i private_key_file" clone host:repo.git続けて構成セットを実行できますgit config core.sshCommand 'ssh -i private_key_file'
dav_i

1
これは間違いなく最良の答えです!
Wagner Patriota

111

回答とコメントをまとめるには、異なるキーファイルを使用するようにgitを設定し、その後それを忘れるのに最適な方法です。これは、Windowsで機能する同じホスト(たとえば、個人のGitHubアカウントと仕事用のアカウント)の異なるユーザーもサポートします。同様に、複数のID を編集~/.ssh/config(またはc:\Users\<your user>\.ssh\config)して指定します。

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ます。


3
あなたが言ったすべてがすでに上記の答えで、そして私の目でさらにはっきりとカバーされているので、私はあなたに反対票を投じました。たとえば、Userをe dandvとworkuserにそれぞれ正確に定義するのはなぜですか?
hroptatyr 2015年

2
あなたは4年前の質問に新しい情報なしで答え、あなたの答えは「最良の方法」であると主張しています。さらに、あなたは自分の答えを削除するように他のユーザーに反対票を投じ、手間をかけました。
rudimeier 2015年

@hroptatyr:私の例を使用dandvworkuserて、「例:個人のGitHubアカウントと仕事用のアカウント」をサポートしました。dandv私のGitHubユーザー名です。
Dan Dascalescu 2015年

12
ホストエイリアスについて説明しているからといって、@ thamsterよりも良い答えだと思います。
David Moles

2
私はこの答えが好きです。しかし、私にとってこれはIdentitiesOnly yes、ssh構成ファイルに追加した場合にのみ機能します。
winni2k 2017

75

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

リポジトリごとに構成できます。

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

1
何をし-F /dev/nullますか?私が見る限り、これはconfigFileを~/.ssh/configデフォルトから変更しますが、なぜそれが望ましいのですか?サンドボックスコマンドを確実にするには?
ドミニク

3
linuxcommand.org/man_pages/ssh1.htmlは設定ファイルを指定しないため、gitがsshを実行しても、設定ファイルは渡されません(実際には、サンドボックスモードの一種であり、ユーザー設定のデフォルトオプションを無視するだけです)。 -Fについての詳細
David

1
探していたもの。ありがとう!
lostcitizen

Kuber環境で作業するためのAAAAA +ソリューション。ありがとう!
コブラ対忍者

1
こんにちはこれをサブモジュールに伝播する方法を知っていますか?
アルカプラババス

38

問題は、同じホスト(たとえば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. 次に、特定のリポジトリのリモートオリジンを変更して、定義したフレンドリ名を使用するようにする必要があります。

    コマンドプロンプト内のローカルリポジトリフォルダーに移動し、現在のリモートの起点を表示します。

    >git remote -v
    origin  git@github.com:myuser/myrepo.git (fetch)
    origin  git@github.com:myuser/myrepo.git (push)

    次に、原点を次のように変更します。

    >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)

    これで、正しいキーで自動的にプッシュ、フェッチ...できるようになります。


1
これは私の心の中で最も「正しい」答えです。ここでは、接続とキーをssh構成ファイルに編成します。これは、ベストプラクティスであり、長期的にサポート可能です。
jamescampbell

他のソリューションは回避策のように見えますが、これはツールがサポートする優れた機能を使用しています。
Craig.C

素晴らしい、まさに私が探していたもの、ありがとう!!
magikMaker

37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

または

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

これは私のために働いた。
mohammed_ayaz

36

次のように、そのホストまたは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)

1
これは便利ですが、そのホスト名とのすべてのやり取りにリポジトリキーを使用します。同じサーバー上に別のキーを必要とする他のリポジトリがある場合は、ラッパーを使用し、GIT_SSHで使用するようにgitに指示することをお勧めします。
Joe Block

11
それは必ずしも本当ではありません。私はGithubに複数のキーを使用しています。1つは仕事用で、もう1つは個人アカウント用です。「ホスト」のドメイン名を入力する必要はありません。任意の種類のエイリアスを付けることができます。たとえば、ホスト名としてgh-homeとgh-workを使用します。たとえば、git clone git@gh-work:repo/project.git 〜/ .ssh / configでクローンを作成するときは、HostNameにgithub.comを使用する2つのセクションがあります。IdentityFileとHostが異なるだけです
blockloop

@ brettof86この戦略はほとんどの部分で機能しますが、チェックアウトしているリポジトリがgithubでホストされているgemに依存している場合はどうしますか?Gemfile内のgithubリポジトリへの参照には「エイリアス」は含まれませんが、プロジェクトの他の開発者のために物事を壊したくない場合を除きます...
ktec

@ brettof86また、2つの異なるgithubアカウント(work、home)を持っていますが、サンプルを機能させることができません。2つあるサンプルを投稿できますか?
Climbs_lika_Spyder

ここに私の中に何があるかだ@Climbs_lika_Spyder ~/.ssh/config pastebin.com/8rYn7yCi
blockloop

32

私はGIT_SSH環境変数を使いました。これは、上記のJoe Blockのラッパーに似た私のラッパーですが、任意の量の引数を処理します。

ファイル〜/ gitwrap.sh

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

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

export GIT_SSH=~/gitwrap.sh

私はこれを.bashrcに設定しました。しかし、openshiftインスタンスにログインすると、それが呼び出されていないようです。何か不足していますか?
Jigar Shah 2013

私はエラーで失敗します。スクリプトイベントは見つかりませんが、何が起こっているのかわかりません...エラー:/tmp/gitwrap.shを実行できません:そのようなファイルまたはディレクトリはありません
ap1234

「そのようなファイルまたはディレクトリはありません」というエラーが発生した場合はgitwrap.sh、たとえばのフルパスを入力します/home/ubuntu/gitwrap.sh
Tahir Akhtar '27 / 10/27

-o StrictHostKeyChecking=nosshコマンドに追加したいかもしれません
dan-man

12

ここで他の解決策がどれも機能せず、複数のssh-keyを作成したが、次のような単純なことはまだできない場合

git pull

次に、2つのsshキーファイルがあるとします。

id_rsa
id_rsa_other_key

次にgitリポジトリ内で、次のことを試してください。

# Run these commands INSIDE your git directory
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 "mona.lisa@email.com"

詳細については、https://gist.github.com/jexchan/2351996を参照してください


を受け取ったらCould not open a connection to your authentication agent.、を試して$ eval `ssh-agent -s`、もう一度試してください。
cgnorthcutt

1
道に迷った人のために、ssh-addコマンドトリックは私のために働いた。sshが認証するときに試行されるIDのリストにIDキーを追加します。これは私にはうまくいきました!
ベンカートライト

どのディレクトリで実行することが重要だと思いますssh-addか?
tripleee

@BenCartwrightグローバル設定ではなくローカル設定を変更するため。このアプローチは.git、gitプログラムではなくリポジトリ全体を変更します。を使用--globalして、グローバルユーザー名と電子メールを設定できます。
cgnorthcutt

11

通常のリクエスト(git pull origin master)でgithubに接続する必要がある場合、ホストをのよう*に設定する~/.ssh/configと、他のホスト(たとえば、「github」または「gb」)が機能しませんでした。

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

その場合、「Host *」の行全体を省略することもできます。
ライオネッロ2014年

1
リモートURLと一致しなかったため、おそらく機能していませんでした。使いたいHost my-host-alias場合は設定が必要ですremote.origin.url=git@my-host-alias:[username]/[repo].git
David Moles

11

これらのソリューションの多くは魅力的に見えました。ただし、次のリンクにある一般的なgit-wrapping-scriptアプローチが最も役立つことがわかりました。

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

重要gitなのは、次のようなコマンドがないことです。

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Alvinのソリューションは、このギャップを埋める明確に定義されたbashラッパースクリプトを使用することです。

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/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 pullgit clone。これらはすべてcron、制限付きシェルのナビゲートに問題があったジョブスクリプトで正常に機能します。また、R内からこのスクリプトを呼び出して、まったく同じcron実行問題を解決することもできました(例:system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")

RはRubyと同じではありませんが、Rがそれを実行できる場合は... O :-)


1
素晴らしいようです!これをテストして返信します。
BlueBird 2015年

3
別に構文から、どのようにこれはより優れているGIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.gitあたりとしてロバート・ジャック・ウィルの答えは
David Moles

6

特定のidentifyfileで署名したいパスにディレクトリがある場合、ControlPathegを設定することにより、.ssh / configファイルを介して特定のidentifyファイルを使用するように指定できます:

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

次にssh、指定された作業パスでgitコマンドを実行するときに、指定されたIDファイルを使用します。


あなたもプロパティを設定することができ、後に判明ControlMaster autoし、ControlPersist yesパスワードを毎回再入力する必要はありませんのでこと、。この記事で
クリストバル

3

以下のように〜/ .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に追加します(cat〜/ .ssh / id_rsa_pub [or simillar name])

そして、以下のようにgit clone

git clone ssh://blahblah@blah.com/userid/test.git

3

多くの良い答えがありますが、それらのいくつかは事前の管理知識を前提としています。

私はそれが明示的にすることを強調することが重要だと思いますが、ウェブURLをクローニングすることによって、あなたのプロジェクトを開始した場合 - https://github.com/<user-name>/<project-name>.git
その後、あなたがする必要があることを確認するurl の下[remote "origin"]での.git/config SSH URLに変更されました(以下のコードブロックを参照してください)。

それに加えて、sshCommmand以下のようにを追加してください:

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

詳しくはこちらをご覧ください


1
どうもありがとう、gitがsshキーを使用していない理由を理解するために多くの時間を費やしました。githubがクローンボタンのデフォルトとしてhttps urlを与える理由がわかりません。
チャクラダルラジュ

2

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 git@git.test.com:test/test.git'、ドライブDにある秘密鍵。コンピューターのフォルダーテスト。リポジトリのクローンを作成する場合も、あなたは変更することができgit remote add origingit clone

これをGit Bashに入力すると、パスフレーズが要求されます。

openssh秘密キーとパテ秘密キーは異なることに注意してください。

puttygenでキーを作成した場合は、秘密キーをopensshに変換する必要があります。


1

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

man gitコマンドシェルでgitマニュアルを参照してください。


1

私が使用してzshおりssh-agent、ラップトップの他の目的(つまりリモートサーバーへのアクセス)のために、異なるキーがzshシェルに自動的に読み込まれます。@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-agentを生成する
  • エージェントに読み取り専用キーを追加する
  • ディレクトリをgitリポジトリに変更します
  • もし cddirのリポが成功したは、リモートリポジトリからプルします。
  • 生成されたssh-agentを強制終了します。(私は多くのエージェントが長引くことを望みません。)


1

WindowsでGIT_SSH_COMMAND環境変数を使用する代わりに、次のようにします。

set GIT_SSH_COMMAND="ssh -i private_key_file"

使用する:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

見積もりは次のようにする必要があります

set "variable=value" 

一部のbackgorund:https ://stackoverflow.com/a/34402887/10671021


0

SSHポート番号が22(デフォルト)でない場合は、追加します Port xxします~/.ssh/config

私の場合(シノロジー)、

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

次に、configのホストタイトルを使用してクローンを作成します。( "my_synology"。@chopstikの "*"を避けるため)

git clone my_synology:path/to/repo.git

0

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

  • 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 git@bitbucket.org:dave_andersen/exchange.git

ノート

ssh_wrapperスクリプトのデフォルトのSSH_KEYを、ほとんどの場合に使用するものに変更します。そうすれば、ほとんどの場合KEY変数を使用する必要がなくなります。

「ねえ!エイリアス、スクリプト、およびキーのディレクトリで多くのことが起こっている」と思うかもしれませんが、私にとっては慣例です。ほぼすべてのワークステーション(およびそのためのサーバー)は同様に構成されています。

ここでの目標は、定期的に実行するコマンドを簡略化することです。

Bashスクリプトやエイリアスなどの私の慣習により、一貫した環境が作成され、物事をシンプルに保つことができます。

KISSと名前は重要です。

その他の設計のヒントについては、私の本からGoの第4章SOLID設計を確認してください。

お役に立てば幸いです。-レックス



0

この方法の問題は、少なくともWindowsでbash.exeを実行している場合、毎回新しいプロセスが作成され、休止状態が続くことです。

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

同期リポジトリをスケジュールどおりに使用する場合は、最後に「&& ssh-agent -k」を追加する必要があります。

何かのようなもの:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -kは、完了時にプロセスを強制終了します。



-1

これは、この問題の解決策を見つけるときに見つけた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'

出来上がり!いつでも好きなときにキーを切り替えるショートカットがあります!

これがうまくいくことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.