章节 ▾ 第二版

4.4 Git on the Server - Setting Up the Server

设置服务器

我们来介绍一下如何在服务器端设置 SSH 访问。在此示例中,您将使用 authorized_keys 方法来验证您的用户。我们还假设您正在运行像 Ubuntu 这样的标准 Linux 发行版。

注意

这里描述的大部分内容都可以通过使用 ssh-copy-id 命令来自动化,而不是手动复制和安装公钥。

首先,您需要创建一个 git 用户账户和一个用于该用户的 .ssh 目录。

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

接下来,您需要将一些开发者的 SSH 公钥添加到 git 用户的 authorized_keys 文件中。假设您有一些受信任的公钥,并将它们保存在临时文件中。同样,公钥看起来是这样的

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

只需将它们追加到 git 用户 .ssh 目录中的 authorized_keys 文件即可。

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

现在,您可以运行 git init --bare 命令为他们设置一个空的存储库,该命令在没有工作目录的情况下初始化存储库。

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

然后,John、Josie 或 Jessica 可以通过将其添加为远程并推送一个分支来将他们项目的第一个版本推送到该存储库。请注意,每次您想添加一个项目时,都必须有人登录到机器并创建一个裸仓库。我们假设您设置了 git 用户和存储库的服务器主机名为 gitserver。如果您是内部运行,并且为 gitserver 设置了 DNS 指向该服务器,那么您可以基本按照命令进行操作(假设 myproject 是一个包含文件的现有项目)。

# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

此时,其他人可以轻松地将其克隆下来并推送更改。

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'Fix for README file'
$ git push origin master

通过这种方法,您可以快速为少数几名开发人员搭建一个读/写 Git 服务器。

您应该注意到,目前所有这些用户也可以登录到服务器并以 git 用户的身份获得 shell 访问权限。如果您想限制这一点,您必须在 /etc/passwd 文件中将 shell 更改为其他内容。

您可以使用 Git 附带的名为 git-shell 的受限 shell 工具轻松地将 git 用户账户限制为仅 Git 相关活动。如果您将此设置为 git 用户账户的登录 shell,那么该账户将无法正常访问您的服务器 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  # and add the path to git-shell from last command

现在您可以使用 chsh <username> -s <shell> 命令编辑用户的 shell。

$ sudo chsh git -s $(which git-shell)

现在,git 用户仍然可以使用 SSH 连接来推送和拉取 Git 存储库,但无法获得 shell 访问权限。如果您尝试这样做,您将看到类似以下的登录拒绝信息。

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

此时,用户仍然可以使用 SSH 端口转发来访问 git 服务器可以访问的任何主机。如果您想阻止这种情况,您可以编辑 authorized_keys 文件,并在您想限制的每个密钥前加上以下选项。

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

结果应该是这样的。

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

现在 Git 网络命令仍然可以正常工作,但用户将无法获得 shell 访问权限。如输出所示,您还可以在 git 用户的家目录中设置一个目录,对 git-shell 命令进行一些自定义。例如,您可以限制服务器接受的 Git 命令,或者自定义用户在尝试 SSH 登录时看到的消息。有关自定义 shell 的更多信息,请运行 git help shell