如何在Go中禁用git克隆的凭据提示?
我试图在Go中运行与git clone相当的如何在Go中禁用git克隆的凭据提示?,git,go,Git,Go,我试图在Go中运行与git clone相当的git,但如果系统提示输入stdin,我想退出命令(例如:如果远程存储库中没有设置ssh密钥,则进行身份验证)。有办法做到这一点吗?现在,它只需阻塞输入。更新:特殊的git解决方案 由于v2.3git支持环境设置git_TERMINAL_PROMPT=0,即不请求凭据但失败 func main() { cmd := exec.Command("git", "clone", "https://github.com/some/non-existin
git
,但如果系统提示输入stdin,我想退出命令(例如:如果远程存储库中没有设置ssh密钥,则进行身份验证)。有办法做到这一点吗?现在,它只需阻塞输入。更新:特殊的git解决方案
由于v2.3git支持环境设置git_TERMINAL_PROMPT=0
,即不请求凭据但失败
func main() {
cmd := exec.Command("git", "clone", "https://github.com/some/non-existing-repo")
os.Setenv("GIT_SSH_COMMAND", "ssh -oBatchMode=yes") //
cmd.Env = append(os.Environ(), "GIT_TERMINAL_PROMPT=1", "GIT_SSH_COMMAND='ssh -oBatchMode=yes'")
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
log.Println("Error: ", err)
}
}
SSH解决方案:
接受的答案仅适用于http克隆。如果您希望通过ssh实现这一点,那么以下方法将起作用:
//禁用stdin提示输入用户名/密码。如果未配置无密码ssh,我们希望失败
Setenv(“GIT\u SSH\u命令”,“SSH-oBatchMode=yes”)
cmd:=exec.Command(名称、参数…)
return cmd.CombinedOutput()
mangit
git\u SSH\u命令的条目
如果设置了这些环境变量中的任何一个,那么git fetch和git push将使用
当需要连接到远程系统时,指定命令而不是ssh。命令将
只给出两个或四个参数:username@host(或只是主机)从URL和
在远程系统上执行的shell命令,可以选择前面加-p(字面意思)和
当指定默认SSH端口以外的其他端口时,从URL中选择端口
$GIT_SSH_命令优先于$GIT_SSH,并由shell解释,它允许
要包括的其他参数$另一方面,GIT_SSH必须正好是
程序(如果需要其他参数,可以是包装器外壳脚本)
通常,通过personal.ssh/config文件更容易配置所需的选项。
有关更多详细信息,请参阅ssh文档
mangit
输入git\u终端\u提示符
如果此环境变量设置为0,git将不会在终端上提示(例如,当
请求HTTP身份验证)
一个使用git的本地golang解决方案怎么样。这意味着您的程序将不需要git,也不会有stdin和git二进制文件的问题。从中签出此示例。另外一个好处是,文档非常好,这是从项目的页面。它还支持ssh协议。下面是git与这个项目的对比
import (
"fmt"
"os"
"gopkg.in/src-d/go-git.v4"
. "gopkg.in/src-d/go-git.v4/_examples"
)
// Basic example of how to clone a repository using clone options.
func main() {
url := "https://github.com/some/non-existing-repo"
directory := "/foo/bar"
// Clone the given repository to the given directory
Info("git clone %s %s --recursive", url, directory)
r, err := git.PlainClone(directory, false, &git.CloneOptions{
URL: url,
RecurseSubmodules: git.DefaultSubmoduleRecursionDepth,
})
CheckIfError(err)
}
您是否尝试将
nil
传递给Stdin?还请用CommandContext和StdinPipe检查下面的示例。@EugeneLisitsky是的,通过nil没有任何作用。golang.org/pkg/os/exec/#Cmd.StdinPipe似乎关闭StdinPipe可以防止命令阻塞我仍然会收到密码提示。请将您的解决方案作为答案发布,而不是作为问题的编辑。这很有效,唯一的问题是Read()
即使没有提示输入,也会被调用,因此即使没有提示输入密码,它也会从技术上中止git clone op。我几乎写了这个答案,但我先仔细检查了文档。这确实行不通。我没能想出一个有效的解决方案,但我也没怎么努力。。。(如果它不工作,为什么会被标记为接受?)我选中了-是git
尝试读取stdin,即使它不需要。所以我们需要一种方法来区分这种情况。@MiloChristiansen我认为它确实有效,所以我给了它一个接受的答案answer@EugeneLisitsky您发布的特定评论仅对https克隆有效。然而,在帖子中也有关于ssh的有用评论。为了禁用stdin,可以在运行克隆之前设置os.Setenv(“GIT\u SSH\u命令”,“SSH-oBatchMode=yes”)
。你想更新你的答案,我会给你接受的答案吗?