linux - 回答 golang 中的密码 shell 提示

标签 linux git go

我正在寻找一种方法来回答 golang 中的 shell 密码提示。

喜欢:

bussiere@kus:~/Workspace/rteest$ ./passwordtest.sh
Password : 

我想在启动 shell 命令/脚本后使用我的 token 在 golang 中自动输入密码...

如果一切正常(在 golang 中),我已经制作了一些脚本,可以使用 mfa 获得一次性 token 。所以我需要在 linux 密码提示符下输入临时 token 。

我知道有 expect 命令,但我想编译我的程序以嵌入它并具有最小的依赖性。

感谢和问候

编辑@nevermore 我试过这个(但它不起作用):https://play.golang.org/p/Ffm3q5h636

package main

import (
    "os/exec"
    "fmt"
    "log"
    "io"
)

func main() {
    cmdb := "git"
    args := "clone https://bb@gitlab.com/bb/fzgs.git"
cmd := exec.Command(cmdb, args)
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatal(err)
}

go func() {
defer stdin.Close()
io.WriteString(stdin, "QSRDFGHJfZERTYU")
}()

out, err := cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}

fmt.Printf("%s\n", out)

}

它给了我这个:

2017/05/12 20:42:36 exit status 1
exit status 1

编辑之二:

    cmdb := "git"
    args := "https://bb@gitlab.com/bb/fzgs.git"
cmd := exec.Command(cmdb, "clone", args)

它要求输入密码:

'https://bb@gitlab.com 的密码':

最佳答案

问题是你试图在 Git 询问你之前发送密码 这样做。

而 Git 询问密码的方式取决于 credential助手已设置。如果没有设置凭证助手,或者没有返回密码,则要求用户输入。

解决方案 #1:在 URI 中包含密码

在大多数情况下(至少在 Github 和 Bitbucket 中)Git 服务器接受 通过 HTTPS URI 传递的凭据,例如https://user:password@domain.com/repo.git.

cmd := exec.Command("git", "clone", "https://bb:PASSWORD@gitlab.com/bb/fzgs.git")

env := os.Environ()
env = append(env, "GIT_ASKPASS=")
cmd.Env = env

var out bytes.Buffer
cmd.Stdout = &out

err := cmd.Run()

解决方案 #2:自定义凭据帮助程序

另一种方法是制作凭证帮助脚本,例如:

#!/bin/bash -
printf '%s\n' 'YOUR_PASSWORD'

并通过 GIT_ASKPASS 传递它:

cmd := exec.Command("git", "clone", "https://bb@gitlab.com/bb/fzgs.git")

env := os.Environ()
env = append(env, "GIT_ASKPASS=/path/to/fzgs-askpass.sh")
cmd.Env = env

var out bytes.Buffer
cmd.Stdout = &out

err := cmd.Run()

关于linux - 回答 golang 中的密码 shell 提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43943742/

相关文章:

go - 将结构体初始化为指针的目的是什么?

recursion - Go 中的组合和

python - 无法从/dev/input/event* 获取 Wacom 事件

linux - 虚拟地址空间与虚拟内存

git - 如何查看上次提交中更改了哪些文件

Github 网络图无法正确显示

git - 设置sbt发布到基于git分支的artifactory

websocket - 如何使用 golang websockets 解码多种消息类型?

C++ 在 Linux 和 Mac OS X 上将音频数据发送到扬声器输出

linux - 如何在 Linux 服务结构中启动多个进程?