章节目录
参考链接
1. 需求
- 可以通过外网对git服务器的仓库进行
clone
、pull
、push
等操作,就像github一样,但不想要部署gitlab这种大型管理工具,因为它太耗费服务器资源。
2. 安装git
centos 用下面这个命令
yum install git
其他的可能是 pkg install git
或 apt install git
3. 创建一个git
用户,来管理git服务
用户说明:
git
用户不能通过shell登录,只能通过shell访问git服务,不需要设置登录密码。git
用户目录下的/home/git/.ssh/authorized_keys
文件用于存放外部访问git仓库的ssh公钥
3.1 新增系统用户
# 新增一个用户
sudo adduser git
3.2 初始化.ssh目录
注意,需要通过
su git
切换用户,不然全程通过root用户来实现,需要额外通过chown
和chmod
命令来改变目录文件的所属用户和权限。
我实际的应用场景是通过xshell工具,将windows机子上的user/.ssh/id_rsa.pub
公钥内容复制到VMware虚拟机山的CentOS系统git用户目录的文件/home/git/.ssh/authorized_keys
# sudo权限用户无需密码切换为git用户
su git
# 跳转到git用户home目录
cd
# 初始化.ssh目录
mkdir .ssh && chmod 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
# 将ssh公钥拷贝到authorized_keys
vim .ssh/authorized_keys
# 以上步骤可以通过ssh-copy-id命令快速完成。
初始化git的bare仓库(没有工作区的裸仓库)
# 跳转到git用户home目录
cd
# 创建repo目录统一管理git仓库
mkdir repo
# 初始化git仓库
cd repo/
mkdir project.git
cd project.git
git init --bare
防止ssh用户通过普通shell登录到服务器,改用git-shell
若要使用 git-shell
,需要用它替换掉 bash
或 csh
,使其成为该用户的登录 shell
。 为进行上述操作,首先你必须确保 git-shell
的完整路径名已存在于 /etc/shells
文件中
cat /etc/shells # see if git-shell is already in there. If not...
which git-shell # make sure git-shell is installed on your system
sudo -e /etc/shells # 这条命令实际上用vim编辑器打开了文件,将上一条命令输出的路径复制到文件末行,保存退出即可
现在你可以使用 chsh <username> -s <shell>
命令修改任一系统用户的 shell:
sudo chsh git -s $(which git-shell)
这条命令实际上就是修改/etc/passwd
文件,可以通过vim编辑器手动修改
注意:
/usr/local/git/bin/git-shell
是作者实际的git安装目录下的,并没有安装在/bin
或/usr/bin
中,请读者自行检查实际git-shell
路径。
想知道为什么将bash改成git-shell,请参阅参考链接:官方git-shell文档
这样,用户 git
就只能利用 SSH 连接对 Git 仓库进行推送和拉取操作,而不能登录机器并取得普通 shell
。 如果试图登录,你会发现尝试被拒绝,像这样:
$ ssh git@192.168.136.132
Last login: Thu Apr 8 18:57:36 2021
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to 192.168.136.132 closed.
甚至sudo用户通过su git
也无法登录
[root@jiewli ~]# su git
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
如何新建仓库
直接通过sudo权限用户在git用户目录下初始化仓库即可
# 用户自行约定统一存放所有仓库的目录
cd /home/git/repo/
mkdir <new_repository.git>
cd <new_repository.git>
git init --bare
# 外部机子,例如pc机上尝试clone新仓库
$ git clone git@<git_server_hostname>:/home/git/repo/<new_repository.git>
Cloning into '<new_repository>'...
warning: You appear to have cloned an empty repository.
如何增加用户ssh公钥
直接通过sudo权限用户在/home/git/.ssh/authorized_keys
文件中编辑追加即可。