通过 ssh 执行 git 拉取并绕过密码要求的脚本?
Script to perform a git pull via ssh and bypass passphrase requirements?
我正在尝试设置与 Bamboo 的持续集成。我想配置一个任务,ssh 进入我们的阶段服务器,cd 进入正确的目录并执行 git pull。
我已经能够设置 ssh 任务,但是执行 git 拉取很困难。
我采取的步骤:
配置了一个 ssh 任务以 cd 到项目目录和 运行 以下脚本:
#!/bin/bash
echo "pulling from master"
git pull origin master
脚本 运行s,但日志在尝试拉取后显示 Permission denied (publickey).
错误。
我将我的 remote-url 从 HTTPS 切换到 ssh 并创建了一个公钥。现在,当我尝试手动拉取时,它会要求输入密钥的密码。
已使用 ssh-agent
缓存会话的密码。
意识到此缓存仅在我关闭会话之前一直存在,因此我按照本文 (https://confluence.atlassian.com/display/BITBUCKET/Set+up+SSH+for+Git) 中的步骤在每个新会话中启动 ssh-agent。即我将此脚本添加到我的 .bashrc
:
SSH_ENV=$HOME/.ssh/environment
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add
}
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
并将其添加到 .ssh/config 文件中:
Host myStashInstance.org
IdentityFile ~/.ssh/id_rsa
- 文章说我应该被提示输入密码并且代理会启动,但那并没有发生。我仍然需要手动启动ssh-agent。
我想知道在开始新会话时启动 ssh-agent 的下一步是什么,以便我可以继续弄清楚如何完成此作业的配置。 (如果我完全走错了路,也可以接受其他途径的建议。)
总而言之,您运行遇到以下问题:
- 服务器 A 上的 Bamboo 代理 运行
- 服务器 B 是您的暂存服务器
- 作为在服务器 A 上构建 运行ning 的一部分,您想通过 SSH 连接到 B 并在那里执行
git pull
。
- Git 存储库的身份验证要求您输入密码或口令(即使使用
ssh-agent
)。
有几种方法可以解决这个问题:
选项 1:运行临时服务器上的 Bamboo 代理
为简化此环境,请在临时服务器上安装 Bamboo 代理。在 Bamboo 构建计划中输入 Git URL 和凭据,让 Bamboo 负责工作。
Bamboo 将提取 Git 存储库,然后您可以 运行 任何您想要的步骤并部署到您的登台服务器进程。
选项 2:部署到暂存服务器
不要在临时服务器上执行 Git 操作,而是在服务器 A 上执行。在 Bamboo 构建计划中输入 Git URL 和凭据,让 Bamboo 负责的工作。
一旦您的项目在服务器 A 上签出,运行 无论您想在那里执行什么构建步骤,然后打包 (zip/tar/jar/...) 构建结果并将它们复制到暂存服务器。也许您根本不需要在登台服务器上使用 Git。
选项 3:使用 .netrc 文件进行 Git 身份验证
这是最不安全的选项。将您的远程 URL 切换回 HTTPS,然后在登台服务器上创建一个 ~/.netrc
文件,并在其中为您的 Git 服务器添加一个条目,提供用户名和密码,如下所述:https://confluence.atlassian.com/display/STASH/Permanently+authenticating+with+Git+repositories#PermanentlyauthenticatingwithGitrepositories-Usingthe.netrcfile
示例:
machine mygitserver
login mario
password SECRET
注意,这需要您将密码以明文形式存储在 .netrc
文件中。仅当您可以承受此风险时才使用此方法。如果用于此帐户的密码发生更改,您也必须在此文件中进行更改。您可能想为此使用 technical/service 帐户 ,而不是真实的用户帐户。尽可能锁定此帐户。
这三个选项中的一个应该可以帮助您解决问题。
我正在尝试设置与 Bamboo 的持续集成。我想配置一个任务,ssh 进入我们的阶段服务器,cd 进入正确的目录并执行 git pull。
我已经能够设置 ssh 任务,但是执行 git 拉取很困难。
我采取的步骤:
配置了一个 ssh 任务以 cd 到项目目录和 运行 以下脚本:
#!/bin/bash echo "pulling from master" git pull origin master
脚本 运行s,但日志在尝试拉取后显示
Permission denied (publickey).
错误。我将我的 remote-url 从 HTTPS 切换到 ssh 并创建了一个公钥。现在,当我尝试手动拉取时,它会要求输入密钥的密码。
已使用
ssh-agent
缓存会话的密码。意识到此缓存仅在我关闭会话之前一直存在,因此我按照本文 (https://confluence.atlassian.com/display/BITBUCKET/Set+up+SSH+for+Git) 中的步骤在每个新会话中启动 ssh-agent。即我将此脚本添加到我的
.bashrc
:SSH_ENV=$HOME/.ssh/environment # start the ssh-agent function start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add } if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi
并将其添加到 .ssh/config 文件中:
Host myStashInstance.org
IdentityFile ~/.ssh/id_rsa
- 文章说我应该被提示输入密码并且代理会启动,但那并没有发生。我仍然需要手动启动ssh-agent。
我想知道在开始新会话时启动 ssh-agent 的下一步是什么,以便我可以继续弄清楚如何完成此作业的配置。 (如果我完全走错了路,也可以接受其他途径的建议。)
总而言之,您运行遇到以下问题:
- 服务器 A 上的 Bamboo 代理 运行
- 服务器 B 是您的暂存服务器
- 作为在服务器 A 上构建 运行ning 的一部分,您想通过 SSH 连接到 B 并在那里执行
git pull
。 - Git 存储库的身份验证要求您输入密码或口令(即使使用
ssh-agent
)。
有几种方法可以解决这个问题:
选项 1:运行临时服务器上的 Bamboo 代理
为简化此环境,请在临时服务器上安装 Bamboo 代理。在 Bamboo 构建计划中输入 Git URL 和凭据,让 Bamboo 负责工作。
Bamboo 将提取 Git 存储库,然后您可以 运行 任何您想要的步骤并部署到您的登台服务器进程。
选项 2:部署到暂存服务器
不要在临时服务器上执行 Git 操作,而是在服务器 A 上执行。在 Bamboo 构建计划中输入 Git URL 和凭据,让 Bamboo 负责的工作。
一旦您的项目在服务器 A 上签出,运行 无论您想在那里执行什么构建步骤,然后打包 (zip/tar/jar/...) 构建结果并将它们复制到暂存服务器。也许您根本不需要在登台服务器上使用 Git。
选项 3:使用 .netrc 文件进行 Git 身份验证
这是最不安全的选项。将您的远程 URL 切换回 HTTPS,然后在登台服务器上创建一个 ~/.netrc
文件,并在其中为您的 Git 服务器添加一个条目,提供用户名和密码,如下所述:https://confluence.atlassian.com/display/STASH/Permanently+authenticating+with+Git+repositories#PermanentlyauthenticatingwithGitrepositories-Usingthe.netrcfile
示例:
machine mygitserver
login mario
password SECRET
注意,这需要您将密码以明文形式存储在 .netrc
文件中。仅当您可以承受此风险时才使用此方法。如果用于此帐户的密码发生更改,您也必须在此文件中进行更改。您可能想为此使用 technical/service 帐户 ,而不是真实的用户帐户。尽可能锁定此帐户。
这三个选项中的一个应该可以帮助您解决问题。