カスタム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
この問題の解決にご協力ください。
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
を使用することをお勧めします。これにより、リモートごとに宛先ごとのスクリプトを作成する必要がなくなるためです。
Git 2.3+(2015年第1四半期)以降、新しい環境変数GIT_SSH_COMMAND
を使用して最初に試したことが機能することに注意してください。
commit 3994276 from Thomas Quinot(quinot
) を参照してください。
git_connect
:GIT_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
は、プログラムへの単なるパスである必要があります(追加の引数が必要な場合は、ラッパーシェルスクリプトにすることができます)。
Ssh-agentを使用する
ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone [email protected]:uname/test-git-repo.git'
larsk の answer および VonC の answer に基づいて、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_COMMAND
をssh
コマンドにデフォルト設定するニースタッチです。したがって、GIT_SSH=git_ssh.sh
を設定しても通常のgit
実行。
付加価値として、このスクリプトはGit v2.3 +によって完全に無視されます。この場合、$GIT_SSH_COMMAND
が直接使用されます。
次のように、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
詳細についてはリンクを参照してください。