您的位置:首页 > 理论基础 > 计算机网络

Windows下git web hook免除密码输入的烦人事(SSH和HTTPS)

2015-11-14 01:53 495 查看
在一台Windows服务器A上用VirtualBox安装了Gitlab(域名git.domain.com),我在Windows工作站B上开发。之前搞了一次SSH方式做push和pull,没成功,我也懒得再整了,就用http输入用户名和密码吧,反正次数也不多。

最近在Windows服务器C上做网站,部署要先Push,再远程Pull,有点嫌烦了,打算用上Gitlab的Webhook功能。

先Google了一番,这方面内容挺多,就是给Gitlab一个网址,Gitlab收到Push等之后会Post一个Json数据给这个网址,做过网络后台的都知道怎么处理这个Post(我是用php),然后调用相应的Pull脚本命令,但真正做起来遇到一堆大坑,必须得记下来。

坑1. php中执行exec没有任何输出

我看了apache的disable_function中没有禁止exec,也给了cmd.exe相应的权限,可就是exec('git pull gitlab master', $out);没有输出,后来我先试了一下exec('dir', $out),可以从$out中得到输出。后来一通好找,在一篇文章中发现了方法:原来如果命令有错误,exec是得不到$out的,可以改成exec('git pull gitlab master 2>&1', $out),问题解决。发现页面一直在执行的原因是git
pull这里需要输入密码,导致exec在等待。于是打算用SSH来pull。

坑2. SSH死活连不到Gitlab的虚拟机

网上的Windows上配置SSH的教程看了个遍,可就是连不上,说ssh: Could not resolve hostname git.domain.com: no address associated with name

这个花了好长时间找问题,最终发现是因为虚拟机网卡用了NAT,因此如果用默认端口22的话,SSH其实是在尝试连接到Gitlab的虚拟机的宿主机(即服务器A)。于是在VirtualBox上做端口映射,将服务器A的2222端口映射到虚拟机的22端口。

坑3. 命令行中pull不需要密码,但exec还要密码

在试SSH不行绝望之际,想还是用HTTPS,让系统记住密码,于是找到修改git config的方法,在项目的.git/config的最后加上:

[credential]

  helper = store

然后在命令行中先pull一次,这次要输入用户名、密码,第二次就不需要了。

可是到了php中执行exec还是不行。想来想去,估计可能是Apache用的账号不是我登录的账户,于是在php中执行

echo shell_exec('echo %username% 2>&1').END;

echo shell_exec('echo %userprofile% 2>&1').END;

确认它是用的Internet账户运行的,难怪要输入密码,git只将密码记在了当前用户下。算了,接着搞SSH吧。

坑4. SSH连接一直要输入密码

开始我还输入密码试试,后来了解了SSH的原理之后知道不用试了,如果SSH配置正确是不需要输入密码的。后来发现需要在.ssh下建一个config文件,内容:

Host domain.com

  Hostname git.domain.com

  Port 2222

  RSAAuthentication yes

  IdentityFile C:/Users/Henry/.ssh/gitlab_rsa

  User henry

这样才能找到对应的端口和私钥。

终于SSH -T git@git.domain.com成功了。

坑5. SSH可以连上了,命令行中pull还要输入密码

这个坑一直没搞明白是怎么回事,以后想明白了再补上。重启服务器也不行。

最终,找到一个办法,除了在.git/config的最后加上[credential]  helper = store之外,还可以在%HOME%目录中新建一个_netrc文件,内容为:

machine git.domain.com

login henry

password 123456

这样也可以起到不用输入密码的效果。

我想刚才Apache是因为找不到henry账户下记住的用户名密码,于是在系统环境变量(注意不是用户环境变量)中新建了一个HOME,指向C:\USERS\HOME,这里没有用网上说的%USERPROFILE%,而是用一个公共目录,以便所有账户下都可以找到。

终于!!!在php中exec可以pull https://henry@git.domain.com/henry/project.git了。
同时,发现SSH又连不上了,说找不到C:\Users\Home\.ssh,哦,原因Windows下SSH是先找%HOME%,没有再找%USERPROFILE%,好办,把%USERPROFILE%下的.ssh目录复制到C:\Users\Home下,SSH可以连上了,意外于发现php中的exec也可以pull git@git.domain.com了!!!

只是还不能解释坑5。

小结:折磨一天,有几点要记住:

1. 先设置%HOME%系统环境变量,后面省事不少。Windows下SSH默认把.ssh建立在这里。

2. 用虚拟机装gitlab要注意端口映射,或者装两块网卡。

3. 端口映射之后要在.ssh下建config文件说明端口和私钥。

注意以上几点,Windows下Php执行git pull就可以了,享受一下webhook的便利吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息