我正在寻找一种方法来回答 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/