Git,用特定的私钥克隆,sh.exe找不到文件

时间:2016-01-21 10:14:12

标签: git bash shell ssh mingw-w64

我制作了一些剧本:

#!/bin/bash

#####
dest_branch="4.0.8_copy"
source="sprint24_copy"
#####

dest=$dest_branch
source=$source_branch
startDir=`pwd`
sshFile=$startDir"/git_ssh.ssh"
gitrepo="<some valid repo adress>"
git_key=$startDir"/key.ssh"

sshKey="-----BEGIN RSA PRIVATE KEY-----
MIIJJwIBAAKCAgEAs7Rfpca8s4.... and rest of key" 

echo $sshKey > $git_key 
echo "ssh -i "$git_key" \$@ "> $sshFile

export GIT_SSH=$sshFile
export GIT_TRACE=1

git clone git@$gitrepo -b $dest

我在Git Bash(C:\ Program Files \ Git \ bin \ sh.exe)中运行此脚本,此脚本因此输出错误而失败:

Cloning into 'neos'...
10:44:26.575804 run-command.c:343       trace: run_command: 'C:/Users/<some user>/Desktop/<some dir>/git_ssh.ssh' 'git@<some valid adress>' 'git-upload-pack '\''<some project>'\'''
error: cannot spawn C:/Users/<some user>/Desktop/<some dir>/git_ssh.ssh: No such file or directory
fatal: unable to fork

我尝试将命令pwd更改为静态路径,如C:/ .... c:/ ... / c / ... \ c ... c:... C:..但仍然发誓。 anybady可以帮助我特定另一个私钥克隆git repo ??为什么这个sh.exe看不到我的文件?我确定该文件存在。我使用git版本2.6.4.windows.1。谢谢你的帮助,对不起我的英语。

1 个答案:

答案 0 :(得分:1)

我试着理解问题。我有一些观察。

我使用git.exe。 git.exe使用Windows路径,但MinGW使用两者,而ssh仅使用linux:X

当我尝试使用GIT_SSH ='path to scrip'时,git会使用像ConvertToWindowsPatch(GIT_SSH)这样的东西。最后git找到了脚本,但现在SSH无法找到带密钥的文件!

当我尝试GIT_SSH ='ssh -vvv'进行调试时,我看到了

bash: ssh: command not found

首先我认为wtf ...但是我看到ssh是别名!所以我使用GIT_SSH ='ssh.exe -vvv',现在它可以工作了。不幸的是我无法解决我的问题,即ssh看不到带有密钥的文件,但我知道,如果我将文件写入C:\,那么在C中这个文件不存在!此文件位于C:\ Users \\ AppData \ Local \ VirtualStore中。我不知道如何在文件中保存我的ssh密钥,ssh可以看到它,但我有其他解决方法。

在我的主要功能之前,我备份.ssh文件夹。然后我在.ssh和known_host中写入id_rsa。然后我想要git clone,但是ssh问我关于密码...但是这个密钥没有通过!!好冷静下来。当我尝试ssh.exe -vvv时,我看到sshKey没有标题,因为我写这个键没有换行!我有这个:

echo $sshKey > $sshKeyFile

但是正确的是

echo "$sshKey" > $sshKeyFile

现在一切正常。我看到2个WTF - 第一个ssh看不到MinGW中的文件,第二个如果ssh看不到密钥头没有-vvv看不到这个但是问一下pass(wtfwtfwtfwtfwtf ...)

这是使用MinGW,git和Windows,使用特定的rsa私钥在bash中操作git repo(merge,push etc ...)的正确脚本。我用它来自动marge并在Windows上的Jenkins中创建分支。

#!/bin/bash

#####
dest_branch="4.0.8_copy"
source="sprint24_copy"
#####

dest=$dest_branch
source=$source_branch
sshDir="/c/Users/<user>/.ssh"
gitrepo="<repo>"
sshKeyFile=$sshDir"/id_rsa"
knownHostsFile=$sshDir"/known_hosts"

sshKey="-----BEGIN RSA PRIVATE KEY-----
MIIJKAIBAAKCAgEApH0bkaXa0z7811Sd1ZEG87adPPNWyaya47T3GrCjjnRvVyEk
N8jGjh/..."

knownHosts="<some host> ecdsa-sha2-nistp256 AAAAE2VjZ..."

if [ -a $sshDir ] ; then
  echo "backup .ssh"
  cp -r $sshDir $sshDir"_back" 

  echo "usuwanie starego .ssh"
  rm -r $sshDir

  echo "tworzenie nowego .ssh"
  mkdir $sshDir

  echo "zapis klucza rsa"
  echo "$sshKey" > $sshKeyFile

  echo "zapis znanyn hostów"
  echo $knownHosts > $knownHostsFile

  echo "wlaczenie debugu gita"
  export GIT_TRACE=2

  echo "wlaczenie debugu 

  echo "clone repo"
  git clone git@$gitrepo -b $dest
  #other git operations

  echo "usuwanie tymczasowego .ssh" 
  rm -r $sshDir

  echo "odtwrzanie z backupu .ssh"
  cp -r $sshDir"_back" $sshDir

  echo "usuwanie backupu"
  rm -r $sshDir"_back"
fi 

感谢您的帮助和评论!