너무 길어요.
이 명령은 git fetch origin [branch-name]
스크립트 내에서 호출할 때는 효과가 없지만 셸에서 호출할 때는 작동합니다.
스크립트와 터미널은 다른 상자에서 잘 실행됩니다. 상자는 기업 대리인 뒤에 있습니다.
쉘과 스크립트의 환경에는 약간의 차이가 있다고 생각합니다.
질문
이 명령을 스크립트에서 실행하려면 어떻게 해야 합니까?
세부
배경 이야기
저장소를 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]
실패한 명령을 터미널에서 직접 호출해 보았습니다. 셸에서 호출하면 이 명령은 모든 경우에 작동합니다.
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 구성이 동일한지 확인했습니다.
그 이후로 나는 성공하지 못한 채 문제를 해결하기 위해 스테이징 시스템에 몇 가지 옵션을 추가해 보았습니다.
나는 다음을 설정하려고 한다:
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 명령을 실행하면 이러한 자격 증명에 액세스할 수 있습니다.
스크립트를 루트로 실행하면 루트의 홈 디렉터리에서 자격 증명을 찾지만 찾지 못하므로 실패하게 됩니다.
sudo
터미널에서 git 명령을 실행하여 이를 확인할 수 있습니다. 위의 경우에도 실패합니다.
문제를 해결하려면 github에 액세스하기 위해 일반 사용자의 자격 증명이 필요한 스크립트를 루트로 실행하는 이유를 설명해야 합니다(이는 먼저 해결해야 할 기본 설계 문제처럼 들립니다). 설명에 따르면 에이전트에 루트 자격 증명을 제공하거나(현명하지 않음), 스크립트에서 특정 사용자를 가장하여 git 명령을 실행하거나, 이것이 가장 좋은 변형입니다. 루트 액세스가 필요하지 않도록 루트 액세스가 필요한 모든 항목을 수정할 수 있습니다. 일반 사용자로 실행할 수 있습니다.