【问题标题】:How to input password to git push from script without using SSH keys?如何在不使用 SSH 密钥的情况下从脚本输入密码到 git push?
【发布时间】:2011-05-20 13:11:49
【问题描述】:

我需要编写一个脚本,该脚本可以在不使用 SSH 密钥的情况下将标签从构建服务器推送到 git 服务器。

更多人可以访问构建服务器而不是 git 服务器,因此 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 密钥的方法都不能满足这一点(除非我要求用户在启动脚本时上传他们的 SSH 密钥,这很不方便)。

【问题讨论】:

  • 忘了说,这是在windows上,所以它是一个.bat脚本。
  • 我不明白为什么不能选择 SSH 密钥。 “任何人都可以作为我的用户访问 git repo”是什么意思?
  • 请注意,有权访问服务器的人不仅可以作为您的用户访问 git 存储库,而且还可以访问您的密码(因为您需要将其存储在共享服务器上)。使用密码实际上会使情况更糟,以多种方式。
  • @Piskvor:我知道他不会存储密码,而是让用户按需输入。
  • 除此之外,向尝试从终端读取的进程提供交互式输入的常用方法(如此处的ssh)将是expect。不过,不知道这是否/如何在 Windows 上工作。

标签: git tags ssh hudson build-automation


【解决方案1】:

如果您不希望任何人对您的 git 存储库具有推送访问权限,请在构建服务器上创建一个单独的用户,除了您之外没有人可以访问该用户,并确保其主目录只能由您自己读取。当您想从脚本对存储库进行标记或其他推送时,将使用此用户。现在您可以正常设置 ssh 密钥了。

但是,我想知道,为什么它必须是构建服务器来启动推/拉?包含您的回购的机器上的脚本不能启动它吗?那么整个问题肯定没有实际意义吗?

【讨论】:

  • 我希望构建服务器在构建时标记存储库(这就是为什么它必须是启动推送的构建服务器)。如果我启动构建,它应该使用我的凭据推送。如果我的同事发起它,它应该与他一起推动。这排除了任何 ssh 密钥设置,除非我们都有单独的构建系统并在其上设置了我们自己的 SSH 密钥,这有点愚蠢。
  • 首先,您不需要单独的构建系统。主目录基本上可以是空的,构建系统可以位于所有开发人员都可以访问的目录中。为了防止同时构建,您可以在脚本中使用简单的基于文件的锁定机制(我不知道 Hudson 是否有任何功能可以为您做到这一点)。其次,既然我更了解您想要做什么,我可以建议 ssh -A 选项,它将您的 ssh-agent 连接转发给服务器上的用户,这意味着您可以在开发人员机器上保留私钥。仍然需要服务器上的单独用户
  • 这样的问题是开发人员不会通过 SSH 连接到构建服务器。 Hudson/Jenkins(抱歉,该项目几个月前才更名,我在使用新旧名称时不一致)有一个基于 Web 的界面。
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 2014-01-18
  • 2011-09-10
  • 2019-07-07
  • 2012-10-29
  • 2010-09-11
  • 2017-07-26
  • 1970-01-01
相关资源
最近更新 更多