我支持一个非常烦人的公司代理:
- 实际使用的代理地址由脚本确定
- 它需要身份验证
- 它使用 HTTPS替换网页的证书
在这种情况下如何成功克隆 github 存储库?
第一个问题与 git 无关——更多的是它是能够实际配置代理的必要步骤。
可以在控制面板 -> Internet 选项 -> 连接 -> LAN 设置中找到 Windows 计算机上的代理配置。
如果勾选“使用自动配置脚本”,首先需要下载指定文件并打开。我得到一个包含一个小脚本的文件。它看起来像这样:
function FindProxyForURL(url, host)
{
var myip = myIpAddress();
var hostip = dnsResolve(host);
if (isInNet(hostip,"192.168.0.0","255.255.0.0"))
return "DIRECT";
if (isInNet(hostip,"xyz.abc.0.0","255.255.0.0"))
return PROXY special-proxy:8080;
return "PROXY default-proxy:8080";
}
因此,就我而言,要使用的代理是default-proxy:8080
.
要真正让 git 使用代理,我必须使用git config --global http.proxy http://<domain>\<username>:<password>@default-proxy:8080
.
这样做的明显缺点是您的域密码将以纯文本形式存储在硬盘上。
其他设置不起作用,尽管不同的消息来源声称它们应该起作用。那些是:
https_proxy
或http_proxy
http://<domain>\<username>:<password>@default-proxy:8080
git config --global https.proxy http://<domain>\<username>:<password>@default-proxy:8080
http_proxy
为http://<domain>\<username>:<password>@default-proxy:8080
要解决第三个问题,最简单的方法是通过设置环境变量来忽略证书错误 - 代理返回的证书无论如何都不值得:
set GIT_SSL_NO_VERIFY=true
要不在 git 配置中存储普通密码,您可以使用本地代理,例如cntlm。
它允许存储密码哈希。要获取哈希,请使用以下命令:
cntlm.exe -H -d <domain> -u <username>
之后,系统将提示您输入密码。结果将是一个包含三个散列的列表,其中PassNTLMv2
最有可能是本场景中的相关散列。Password
将cntlm.ini 中的行替换为输出中的行,包括该PassNTLMv2
部分。
显然,您现在必须配置 git 以使用此本地代理。
如果您还想对 github 进行写访问,则必须能够通过代理获得对 github 的 ssh 访问权限。为此,您可以使用corkscrew
.
简而言之,这就是您执行此操作的方法:
首先解压缩corkscrew
然后创建一个文件,~/.ssh/proxy_auth
其中包含<proxy_username>:<proxy_password>
现在告诉 ssh 使用 corkscrewgithub.com
通过代理访问,方法是将以下内容添加到~/.ssh/config
:
host github.com
port 22
proxycommand corkscrew <proxy_ip_address> <proxy_port> %h %p ~/.ssh/myauth
现在测试 ssh 是否可以通过ssh -T git@github.com
. 如果这可行,git:/
协议也应该能够通过代理。
如果您不想每次尝试在公司代理服务器后面克隆某些东西时都设置代理,请尝试在您的主目录中查找“ .bashrc ”文件并进行设置。从下次开始,您将不必手动设置它。
如果您的代理服务器设置如下:
Server: myproxyserver
Port: 8080
Username: mydomain\myusername
Password: mypassword
在 .bashrc 文件中,设置以下内容:
set HTTP_PROXY="http://mydomain\\myusername:mypassword@myproxyserver:8080"
export HTTP_PROXY="http://mydomain\\myusername:mypassword@myproxyserver:8080"
set HTTPS_PROXY="http://mydomain\\myusername:mypassword@myproxyserver:8080"
export HTTPS_PROXY="http://mydomain\\myusername:mypassword@myproxyserver:8080"