章节 ▾ 第二版

4.4 服务器上的 Git - 设置服务器

设置服务器

让我们来一步步设置服务器端的 SSH 访问。在这个例子中,你将使用 authorized_keys 方法来验证你的用户。我们还假设你运行的是标准的 Linux 发行版,如 Ubuntu。

注意

这里描述的很多内容都可以通过使用 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

现在,你可以通过运行带 --bare 选项的 git init 为他们设置一个空的仓库,这将在没有工作目录的情况下初始化仓库

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

然后,John、Josie 或 Jessica 可以通过将其添加为远程并推送一个分支来将他们项目的第一版本推送到该仓库。请注意,每次你想添加一个项目时,都必须有人登录到机器上并创建一个裸仓库。让我们使用 gitserver 作为你设置 git 用户和仓库的服务器的主机名。如果你在内部运行它,并且你为 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 访问。要使用此功能,请为该帐户的登录 shell 指定 git-shell 而不是 bashcsh。为此,你必须首先将 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 仓库,但无法登录到机器。如果你尝试,你会看到类似这样的登录拒绝

$ 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 登录时看到的提示信息。运行 git help shell 以获取有关自定义 shell 的更多信息。