这篇教程讲述如何创建最基本的Git服务器,最后会介绍如何限制通过Shell登录以确保安全。
之前租用了DigitalOcean的服务器搭建VPN,以便翻墙查找技术资料(最低标准每个月才5美元)。既然有自己的服务器了,而且有20GB的硬盘空间,何不把Github的私人仓库都移到自己的服务器,这样每个月又可以省下7美元,而且创建的私人仓库数量不受限制。
所以,动工吧!
创建SSH Key
$ ls ~/.ssh
id_rsa id_rsa.pub
已经存在id_rsa和id_rsa.pub文件,可以不用创建,继续使用原本的SSH Key。
当然,出于某种原因,你仍然想创建新的SSH Key,请先了解如何管理多个SSH private Key
在OS X系统或者Linux系统下,创建SSH Key只需要在终端里输入,将youremail替换成你的邮箱地址:
$ ssh-keygen -C "youremail"
按照终端的提示操作。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/example/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in example_rsa.
Your public key has been saved in example_rsa.pub.
The key fingerprint is:
ab:cd:ef:01:23:45:67:89:0a:bc:de:f0:12:34:56:78 youremail@XX.com <youremail@xx.com>
The key's randomart image is:
+--[ RSA 2048]----+
| o+-+ .. |
| E o |
| . ++.o.. |
| o o H . |
| . . = |
| . =o.o= |
| o . |
| . |
| = o . |
+-----------------+
终端输出类似以上内容时,SSH Key创建成功了。
如果你使用的是Windows系统,可以通过工具来创建SSH Key,比如 “PuTTY Gen”。
服务器添加Git用户并且安装Git工具
以root身份登录你的服务器。
添加新用户”git”(用户名可按个人喜好选择)
# useradd git
为Git用户设置密码
# passwd git
安装git工具
- CentOS/Fedora:
yum install git - Ubuntu/Debian:
apt-get install git
添加SSH Key到服务器
以Git用户的身份登陆服务器。从root身份切换到Git身份,用这条命令:
# su git
创建authorized_keys文件用于保存公钥。
$ mkdir ~/.ssh && touch ~/.ssh/authorized_keys
执行以上命令后,在/home/git/.ssh/目录下有authorized_keys文件。
现在将公钥文件(后缀为.pub的文件)的内容导入authorized_keys文件。
怎么导入?实际上,用文本编辑器打开公钥文件,拷贝里面的文本内容,复制到,authorized_keys文件内就可以。
你也可以在本地机器用以下命令完成上述操作:
$ cat .ssh/id_rsa.pub | ssh git@123.xx.xx.xx "cat >> ~/.ssh/authorized_keys"
请将123.xx.xx.xx替换成你的服务器IP;
查看authorized_keys文件内容
$ cat ~/.ssh/authorized_keys
初始化Git仓库
在服务器,进入想要保存git仓库的目录,执行(将‘my-project‘替换成你项目的名字):
$ git init --bare my-project.git
在当前目录下,可以看到一个新的目录 my-project.git ,这就是我们创建的空的Git仓库。
Good! 现在你的VPS已经有了Git仓库。
在本机使用Git服务
如果本机没有该项目,就将服务器中的项目克隆到本机:
$ git clone git@ip:my-project.git将
ip替换成你的服务器ip地址。如果本机已经有该项目,需要将本地的内容推送到服务器:
进入项目所在目录,修改远程地址
$ git remote set-url origin git@ip:my-project.git将
ip替换成你的服务器ip地址。推送本地内容到服务器
$ git push -u origin master首次推送分支,加上
-u参数,Git会将本地分支和远程分支关联起来,在以后的推送,都可以省略此参数。
附加
禁用shell登录
出于安全考虑,避免有人登录git用户修改其它目录的文件,我们不允许git用户登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
------
如何管理多个SSH private Key
允许电脑有多个不同的私钥,以连接不同的服务器。你需要编辑 ~/.ssh/config:
Host 10.10.10.1
IdentityFile ~/.ssh/linode_rsa
Host 200.20.20.2
IdentityFile ~/.ssh/id_rsa
如果连接10.10.10.1, 私钥~/.ssh/linode_rsa会被使用。
如果连接200.20.20.2, 私钥~/.ssh/id_rsa会被使用。