web-dev-qa-db-ja.com

GIT_SSHエラーを使用したカスタムSSHを使用したGitクローン

カスタムSSHコマンドを使用してGitリポジトリのクローンを作成しようとしています。 GIT_SSH環境でSSHコマンドを設定します

export GIT_SSH="/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key"

しかし、前のコマンドの後に実行すると

git clone [email protected]:uname/test-git-repo.git、次の奇妙なエラーが表示されます

error: cannot run /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key
fatal: unable to fork

この問題の解決にご協力ください。

54
Paris

GIT_SSH環境変数でオプションを提供することはできません。 git manページから:

   GIT_SSH
       If this environment variable is set then git fetch and git Push will use this command instead of ssh when they need to connect
       to a remote system. The $GIT_SSH command will be given exactly two arguments: the username@Host (or just Host) from the URL
       and the Shell command to execute on that remote system.

       To pass options to the program that you want to list in GIT_SSH you will need to wrap the program and options into a Shell
       script, then set GIT_SSH to refer to the Shell script.

1つのオプションは、適切な構成で.ssh/configファイルにスタンザを追加することです。

Host bitbucket.org
  StrictHostKeyChecking no
  IdentityFile /home/me/my_private_key

もう1つのオプションは、GIT_SSHが目的の処理を行うシェルスクリプトを指すようにすることです。たとえば、/home/me/bin/bitbucket_sshに以下を入力します。

#!/bin/sh
exec /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key "$@"

そして、GIT_SSH/home/me/bin/bitbucket_sshに向けます。

可能であれば.ssh/configを使用することをお勧めします。これにより、リモートごとに宛先ごとのスクリプトを作成する必要がなくなるためです。

98
larsks

Git 2.3+(2015年第1四半期)以降、新しい環境変数GIT_SSH_COMMANDを使用して最初に試したことが機能することに注意してください。

commit 3994276 from Thomas Quinot(quinot を参照してください。

git_connectGIT_SSH_COMMANDでsshシェルコマンドを設定

追加のパラメーターを渡す必要がある場合は、GIT_SSHのラッパースクリプトをインストールすることは実用的ではありません。
GIT_SSH_COMMAND環境変数を使用して、コマンドライン引数を含む、実行するシェルコマンドを指定する代替方法を提供します。これは、GIT_SSHのように動作しますが、はシェルに渡されます

PuTTYのplink/tortoiseplinkを使用する場合にパラメーターを変更する特別な回路は、GIT_SSH;を使用する場合にのみアクティブになります。 GIT_SSH_COMMANDを使用する場合、基礎となるssh実装を呼び出す前に、必要なパラメーターを適応させるのは、ユーザーに意図的に任されています。

GIT_SSH_COMMAND

これらの環境変数のいずれかが設定されている場合、「git fetch」および「git Push」は、リモートシステムに接続する必要がある場合、「ssh」ではなく指定されたコマンドを使用します。
コマンドには、正確に2つまたは4つの引数が与えられます。

  • uRLからの 'username@Host'(または単に 'Host')と、リモートシステムで実行するシェルコマンド。オプションで '-p'(文字通り)が前に付き、
  • デフォルトのportポート以外の何かを指定する場合、URLからの 'SSH'.

$GIT_SSH_COMMAND$GIT_SSHよりも優先され、追加の引数を含めることができるシェルによって解釈されます。
$GIT_SSHは、プログラムへの単なるパスである必要があります(追加の引数が必要な場合は、ラッパーシェルスクリプトにすることができます)。

29
VonC

Ssh-agentを使用する

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone [email protected]:uname/test-git-repo.git'
6
TlmaK0

larskanswer および VonCanswer に基づいて、git_ssh.shスクリプトを作成できます。といった:

#!/bin/sh
# Workaround: GIT_SSH_COMMAND isn't supported by Git < 2.3
exec ${GIT_SSH_COMMAND:-ssh} "$@"

次に、次のようにgitコマンドを呼び出します。

export GIT_SSH_COMMAND="/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key"
export GIT_SSH=path/to/git_ssh.sh
git ...

これはどのように機能するかです:

Git v2.3 +では、$GIT_SSH_COMMAND$GIT_SSHよりも優先されますが、古いバージョンは$GIT_SSH_COMMANDをまったく尊重しません。

$GIT_SSHは、システム上のsshコマンドへのパスのみを保持できます。そのコマンドに追加のコマンドライン引数を渡すことはできません。したがって、どのようにして追加の引数をsshに渡すことができますか?

回避策は、sshコマンドとその追加の引数を含むスクリプトを作成することです。これは、まさにgit_ssh.shのすべてです。すでに$GIT_SSH_COMMAND/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_keyに設定しているため、exec"$@"は、Git自体によってgit_ssh.shに渡された引数を$GIT_SSH_COMMAND.に渡すためにあります

${...:-ssh}部分は、厳密には必要ではありませんが、$GIT_SSH_COMMANDsshコマンドにデフォルト設定するニースタッチです。したがって、GIT_SSH=git_ssh.shを設定しても通常のgit実行。

付加価値として、このスクリプトはGit v2.3 +によって完全に無視されます。この場合、$GIT_SSH_COMMANDが直接使用されます。

6
Chen Levy

次のように、Gitコマンドで使用する任意のキーファイルを指定できます。

$ PKEY=~/.ssh/keyfile.pem git clone [email protected]:me/repo.git

またはこれ:

$ git.sh -i ~/.ssh/keyfile.pem clone [email protected]:me/repo.git

私はここで同じ質問に答えました: https://stackoverflow.com/a/1559698

詳細についてはリンクを参照してください。

5
alvinabad