0x01 前言
GitHub的免费代码托管服务是不允许将代码设为私有的,当然付费的费用也不贵,但因为众所周知的原因,访问GitHub的网络速度太慢了。
为了能在家里也能方便地使用git管理代码,那就配置一个git服务吧。
0x02 准备
我们只需要在系统中安装git就好了,非常方便:
[root@web-t1 ~]# yum install git Loaded plugins: fastestmirror centos7-base | 2.9 kB 00:00:00 centos7-updates | 2.9 kB 00:00:00 centos7.3.1611-base | 2.9 kB 00:00:00 centos7.3.1611-updates | 2.9 kB 00:00:00 epel-home | 2.9 kB 00:00:00 Determining fastest mirrors Package git-1.8.3.1-6.el7_2.1.x86_64 already installed and latest version Nothing to do
0x03 用户
我使用SSH为git提供认证、加密,所以先添加相关的用户与用户组:
#添加用户组 [root@web-t1 ~]# groupadd gituser1 #添加用户 [root@web-t1 ~]# useradd gituser1 -g gituser1
登入到gituser1用户,并创建SSH密钥:
#用gituser1用户登陆 [root@web-t1 ~]# su gituser1 #返回用户根目录 [gituser1@web-t1 root]$ cd #创建SSH密钥对 [gituser1@web-t1 ~]$ ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. #回车即可 Enter file in which to save the key (/home/gituser1/.ssh/id_rsa): Created directory '/home/gituser1/.ssh'. #请务必输入密码 Enter passphrase (empty for no passphrase): #再次确认密码 Enter same passphrase again: Your identification has been saved in /home/gituser1/.ssh/id_rsa. Your public key has been saved in /home/gituser1/.ssh/id_rsa.pub. The key fingerprint is: 70:c8:d2:a7:a2:5c:a8:65:70:98:14:04:9b:96:5a:65 gituser1@web-t1 The key's randomart image is: +--[ RSA 4096]----+ |++. E | |.=.o o . | |*oo . = o | |o+ . . = | |. + o . S | | = o . | |. o | | | | | +-----------------+
然后将文件id_rsa.pub重命名为authorized_keys:
[gituser1@web-t1 ~]$ mv .ssh/id_rsa.pub .ssh/authorized_keys
将私钥保存在本地,以便稍后使用:
[gituser1@web-t1 ~]$ cat .ssh/id_rsa
返回到root用户,修改ssh配置文件:
#退出gituser1,返回到root用户 [gituser1@web-t1 ~]$ exit exit #打开SSH配置文件进行修改 [root@web-t1 ~]# vim /etc/ssh/sshd_config #将以下两行内容取消注释 RSAAuthentication yes PubkeyAuthentication yes #重启SSH服务 [root@web-t1 ~]# systemctl restart sshd
然后在另一台机子上测试用户与SSH的配置是否有效。将刚才的私钥保存到另一台机子上并修改权限:
#将私钥保存在文件中 [root@web-t2 ~]# vim web-test2.t.com.key #将私钥的权限设为400 [root@web-t2 ~]# chmod 400 web-test2.t.com.key
然后通过以下命令测试SSH是否有效:
#使用密钥登陆 [root@web-t2 ~]# ssh [email protected] -i web-test2.t.com.key The authenticity of host '10.1.1.111 (10.1.1.111)' can't be established. ECDSA key fingerprint is 26:d9:49:ad:dc:bb:da:88:9d:21:37:ba:ae:e7:c1:f0. #首次连接询问是否接受指纹,输入y即可 Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.1.1.111' (ECDSA) to the list of known hosts. #输入私钥密码 Enter passphrase for key 'web-test2.t.com.key': #登陆成功 Last login: Sun Mar 12 01:19:41 2017 [gituser1@web-t1 ~]$
确认一切正常后退出该账户,然后通过以下命令将私钥使用ssh-agent托管:
#退出gituser1用户 [gituser1@web-t1 ~]$ exit logout Connection to 10.1.1.111 closed. #添加私钥到ssh-agent [root@web-t2 ~]# ssh-add web-test2.t.com.key #输入私钥密码 Enter passphrase for web-test2.t.com.key: #添加成功 Identity added: web-test2.t.com.key (web-test2.t.com.key)
如果遇到以下错误,是因为ssh-agent服务还没启动,手动启动即可:
#尝试添加私钥到ssh-agent [root@web-t2 ~]# ssh-add web-test2.t.com.key #遇到错误,添加失败 Could not open a connection to your authentication agent. #手动启动ssh-agent [root@web-t2 ~]# eval `ssh-agent -s` Agent pid 1040
最后再次尝试登入gituser1用户,但这次不再需要手动指定私钥路径了:
[root@web-t2 ~]# ssh [email protected] Last login: Sun Mar 12 01:31:33 2017 from web-t2.t.com [gituser1@web-t1 ~]$
0x04 git
完成用户的配置,接下来配置git仓库。首先建立一个用于存储git仓库的目录:
[root@web-t1 ~]# mkdir /usr/local/git_home
创建一个空的git仓库:
[root@web-t1 ~]# git init --bare /usr/local/git_home/test_git_1.git Initialized empty Git repository in /usr/local/git_home/test_git_1.git/
修正权限:
[root@web-t1 ~]# chown -R gituser1:gituser1 /usr/local/git_home/test_git_1.git/
这样就完成了git服务器的配置。
0x05 使用
我们会到另一台机子上,通过以下命令即可clone git仓库:
[root@web-t2 ~]# git clone [email protected]:/usr/local/git_home/test_git_1.git Cloning into 'test_git_1.git'... warning: You appear to have cloned an empty repository.
因为这是刚创建的git仓库,所以里面没有文件,我们可以忽略上面的警告信息。我们来touch一个文件并push到master中:
#进入git仓库目录 [root@web-t2 ~]# cd test_git_1.git/ #touch一个文件 [root@web-t2 test_git_1.git]# touch 1.txt #添加所有文件到git中 [root@web-t2 test_git_1.git]# git add * #commit修改 [root@web-t2 test_git_1.git]# git commit -m "commit test 1" [master (root-commit) eb29488] commit test 1 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 1.txt #push变更到master分支 [root@web-t2 test_git_1.git]# git push origin master Counting objects: 3, done. Writing objects: 100% (3/3), 200 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To [email protected]:/usr/local/git_home/test_git_1.git * [new branch] master -> master
查看分支情况:
[root@web-t2 test_git_1.git1]# git branch -av * master eb29488 commit test 1 remotes/origin/master eb29488 commit test 1
0x06 结语
使用这种方法可以免去手动输入密码的步骤,因为使用了SSH密钥,还能提高安全性。还可以搭配自动化脚本来定时push,以便进行设备配置文件的定时备份。