太长了;博士
该命令git fetch origin [branch-name]
在脚本中调用时不起作用,但在从 shell 调用时起作用。
脚本和终端在另一个盒子上运行得很好。该盒子位于公司代理后面。
我认为与 shell 相比,脚本中的环境存在一些差异。
问题
如何让该命令在脚本中运行?
详细信息
背景故事
在将存储库迁移到 GitHub 之前,两个系统上的所有功能均正常运行。两个系统上的源都进行了相应的更新。开发系统立即开始运行,而暂存系统则无法运行。
脚本
这就是脚本部分的外观,它在实际启动之前检查所有存储库是否已到达,因此在此停止:
check_git_connection_mapbender() {
cd ${installation_folder}mapbender
git fetch origin ${git_mapbender_repositoryBranch} &>/dev/null
if [ $? -ne 0 ]; then
echo "Fetching Mapbender repository failed!"
echo "Abording update..."
exit 1
fi
set_git_filemode_config
}
这两echo
行被回显并且脚本退出。变量都设置好了。
我尝试过的
比较贝壳
由于我怀疑环境变量存在问题,因此我尝试git fetch origin [branch-name]
直接从终端调用失败的命令。当从 shell 调用时,该命令在所有情况下都有效:
me@box:/path/to/repo$ git fetch origin [branch-name]
me@box:/path/to/repo$ sudo git fetch origin [branch-name]
me@box:$ sudo -i cd /path/to/repo && git fetch origin [branch-name]
me@box:$ sudo su -
->root@box: cd /path/to/repo && git fetch origin [branch-name]
似乎不起作用的是以下方法:
me@box:$ sudo -i
->root@box: cd /path/to/repo && git fetch origin [branch-name]
<--这确实会像脚本中那样抛出错误
git配置
起初,我确保两个系统上的有效 git 配置是相同的。
从那时起,我尝试在暂存系统上添加某些选项来解决问题,但没有成功。
我尝试设置:
url.http://.insteadof=https://
http.https://github.com.sslverify=false
http.proxy
https.proxy
http.sslCert
因为它没有帮助我再次将其删除。
调试连接
我添加export GIT_TRACE_CURL=true
到脚本中,所以它看起来像这样:
check_git_connection_mapbender() {
cd ${installation_folder}mapbender
# DEBUG
export GIT_TRACE_CURL=true
source /etc/environment
echo $http_proxy
echo $https_proxy
# END DEBUG
echo $git_mapbender_repositoryBranch
git fetch origin ${git_mapbender_repositoryBranch} # &>/dev/null
if [ $? -ne 0 ]; then
echo "Fetching Mapbender repository failed!"
echo "Abording update..."
exit 1
fi
set_git_filemode_config
}
...输出是
[correct http_proxy environment variable]
[correct https_proxy environment variable]
[correct branch name]
16:52:17.600248 http.c:599 == Info: Couldn't find host github.com in the .netrc file; using defaults
16:52:17.603973 http.c:599 == Info: Trying 140.82.121.4...
16:52:17.604035 http.c:599 == Info: TCP_NODELAY set
16:52:17.605297 http.c:599 == Info: connect to 140.82.121.4 port 443 failed: Verbindungsaufbau abgelehnt
16:52:17.605372 http.c:599 == Info: Failed to connect to github.com port 443: Verbindungsaufbau abgelehnt
16:52:17.605386 http.c:599 == Info: Closing connection 0
fatal: unable to access 'https://github.com/LVGL-SL/mapbender-sl.git/': Failed to connect to github.com port 443: Verbindungsaufbau abgelehnt
Fetching Mapbender repository failed!
Abording update...
代理配置
我被告知,系统应该遵守与子网相同的防火墙规则集。
答案1
该盒子位于公司代理后面。
在 .netrc 文件中找不到主机 github.com;使用默认值
连接到 140.82.121.4 端口 443 失败:Verbindungsaufbau abgelehnt
该脚本使用 sudo 运行并失败,但命令 git fetch origin [branch-name] 将在终端中运行
猜测:您的公司代理需要凭据,这些凭据存储在您的用户帐户下的某个位置(可能在文件中).netrc
。
如果您以普通用户身份运行 git 命令,它将访问这些凭据。
如果您以 root 身份运行该脚本,它将在 root 的主目录中查找凭据,但找不到它们,因此会失败。
sudo
您可以通过从终端运行 git 命令来进行验证;如果是以上原因,也会失败。
要解决您的问题,您需要解释为什么要以 root 身份运行脚本,该脚本需要普通用户的凭据才能访问 github(这听起来像是应该首先解决的基本设计问题)。根据解释,您可以为代理提供 root 凭据(不明智),在脚本中模拟特定用户来执行 git 命令,或者,这是最好的变体,修复任何需要 root 访问权限的内容,这样就不需要 root访问,并且可以作为普通用户运行。