【问题标题】:Git, clone with specific private key, sh.exe cannot find fileGit,使用特定私钥克隆,sh.exe找不到文件
【发布时间】:2016-04-27 12:39:13
【问题描述】:

我做了一些脚本:

#!/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:... 但是仍然失败。任何人都可以帮我指定另一个私钥来克隆 git repo 吗?为什么这个 sh.exe 看不到我的文件?我确定该文件存在。我使用 git 版本 2.6.4.windows.1。感谢您的帮助,对我的英语感到抱歉。

【问题讨论】:

  • 从未在 Windows 上尝试过 git。 bash 的正常调试是将 shebang 更改为 #!/bin/bash -x 并查看输出以验证所有内容是否按预期扩展。对于 sshKey-assignment,请查看 heredocs 以存储多行字符串,例如stackoverflow.com/questions/23929235/…

标签: git bash shell ssh mingw-w64


【解决方案1】:

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

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

当我尝试使用 GIT_SSH='path to scrip' 时,git 会使用 ConvertToWindowsPatch(GIT_SSH) 之类的东西。终于git找到了脚本,但是现在SSH找不到带key的文件了!

当我尝试 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 中写id_rsa 和known_host。然后我想要 git clone,但是 ssh 询问我有关密码的信息……但是这个密钥没有通过!!好的,冷静下来。当我尝试 ssh.exe -vvv 时,我看到 sshKey 没有标题,因为我在没有换行符的情况下编写了这个密钥!我有这个:

echo $sshKey > $sshKeyFile

但正确的是

echo "$sshKey" > $sshKeyFile

现在一切正常。我看到 2 WTF - 首先 ssh 在 MinGW 中看不到文件,第二个如果 ssh 在没有 -vvv 的情况下看不到密钥的标题,则看不到这个但询问通过(wtfwtfwtfwtfwtf ...)

这是使用 MinGW、git 和 Windows 使用特定 rsa 私钥在 bash 中操作 git repo(合并、推送等)的正确脚本。我用它在 Windows 上的 Jenkins 中自动进行 marge 和创建分支。

#!/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 

感谢您的帮助和评论!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2022-08-14
    • 2014-08-22
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多