章节 ▾ 第二版

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 用户和仓库的服务器的主机名。如果你在内部运行它,并且你设置了 DNS 使 gitserver 指向该服务器,那么你可以直接使用这些命令(假设 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 仓库,但无法登录到机器 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 登录时看到的提示信息。运行 git help shell 获取更多关于自定义 shell 的信息。

scroll-to-top