章节 ▾ 第二版

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 <用户名> -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