如何在脚本中输入密码以进行git push操作而不使用SSH密钥?

7
我需要编写一个脚本,可以将标签从构建服务器推送到Git服务器,但不使用SSH密钥。
由于许多人都可以访问构建服务器,因此SSH密钥无法使用,否则任何人都可以推送到Git服务器而不需要指定自己的凭据。
该脚本将在Jenkins/Hudson上运行,它会在开始构建时提示用户输入用户名和密码,然后将它们作为环境变量传递给脚本。
问题是,我找不到强制Git程序接受密码的方法。
我尝试过:
echo %password% | git push

以及

git push < tempfilewithpassword.txt (not that writing the password to a temp file is a good idea anyway).

但是在这两种情况下,git仍会提示输入密码。
更新:我还尝试了一个Python脚本,重定向stdin和stdout,但没有成功,仍然会得到提示。
更新:此外,我还尝试了Windows版本的Expect,它既不在控制台中也不在Expect本身中获取提示(即Expect从未看到任何来自git的输出,最后只是超时)。
有什么建议吗?
注意:让我澄清一下,因为人们真的很在意使用SSH密钥。
要求:
  • 凭据应在构建开始时指定(Jenkins接受它们,并将它们传递给我的脚本)。
  • 凭证仅在此单个构建的持续时间内有效。
  • 凭据可以在一个构建到下一个构建之间更改。
据我所知,除非要求用户在启动脚本时上传其SSH密钥(这不方便),否则不能满足此要求。

1
我不明白为什么SSH密钥不是一个选项。你所说的“任何人都可以作为我的用户访问git存储库”是什么意思? - Kris
3
请注意,拥有服务器访问权限的人不仅可以使用您的用户身份访问git存储库,而且他们还将能够访问您的密码(因为您需要在共享服务器上存储它)。在多种方面上,使用密码实际上会使情况变得更糟。请留意。 - Piskvor left the building
1
@Piskvor:我理解他不会存储密码,而是让用户按需输入。 - Paŭlo Ebermann
如果我在构建服务器上存储SSH密钥(用于推送到GIT服务器的那个),那么任何人都可以访问该构建服务器,对其本地 repo 进行其他更改,并将它们推送到 GIT 服务器。当我说“我的用户”时,我是指如果我在 GIT 服务器上的帐户上设置了 SSH 密钥,但这实际上并不是非常相关的(为构建服务器设置一个不同的用户以访问 GIT 服务器并不能解决我的问题)。我想做的就是进行单次推送,而不留下任何凭据。 - Eggplant Jeff
4
除此之外,提供交互式输入给试图从终端读取内容的进程(比如这里的 ssh)通常的方法是使用 expect。不过我不知道它在 Windows 上是否可行。 - Paŭlo Ebermann
显示剩余3条评论
1个回答

1

如果您不希望任何人都能够访问您的git存储库,可以在构建服务器上创建一个单独的用户,只有您自己可以访问其主目录,并确保其主目录仅可读。当您想要从脚本中进行标记或其他推送到存储库时,将使用此用户。现在,您可以正常设置ssh密钥。

然而,我必须想知道,为什么必须是构建服务器启动推送/拉取呢?难道不能在包含您的存储库的机器上运行脚本来启动它吗?那么整个问题就不存在了,不是吗?


1
我希望构建服务器在进行构建时标记存储库(这就是为什么必须由构建服务器发起推送的原因)。如果我启动构建,则应使用我的凭据进行推送。如果我的同事启动它,则应使用他的凭据进行推送。这将排除任何SSH密钥设置,除非我们都有自己的SSH密钥设置在各自的构建系统上,这有点愚蠢。 - Eggplant Jeff
首先,您不需要单独的构建系统。主目录可以基本为空,构建系统可以位于所有开发人员都可以访问的目录中。为了防止同时进行构建,您可以在脚本中使用简单的基于文件的锁定机制(我不知道Hudson是否有任何可以为您执行此操作的功能)。其次,现在我更好地理解了您想要做什么,我可以建议使用ssh -A选项,它将您的ssh-agent连接转发到服务器上的用户,这意味着您可以在开发人员计算机上保留私钥。但服务器上仍然需要单独的用户。 - Robin Green
1
问题在于开发人员不会通过SSH登录构建服务器。Hudson/Jenkins(抱歉,该项目几个月前刚更名,我在使用新旧名称时不太一致)具有基于Web的界面。 - Eggplant Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接