简体中文 ▾ 主题 ▾ 最新版本 ▾ git-shell 上次更新于 2.18.0

名称

git-shell - 用于 Git 专用 SSH 访问的受限登录 Shell

概要

chsh -s $(command -v git-shell) <user>
git clone <user>@localhost:/path/to/repo.git
ssh <user>@localhost

描述

这是一个用于 SSH 账户的登录 Shell,提供受限的 Git 访问。它只允许执行实现拉取/推送功能的服务器端 Git 命令,以及用户主目录中名为 git-shell-commands 的子目录中存在的自定义命令。

命令

git shell-c 选项后接受以下命令

git receive-pack <参数>
git upload-pack <参数>
git upload-archive <参数>

调用相应的服务器端命令以支持客户端的 git pushgit fetchgit archive --remote 请求。

cvs server

模拟 CVS 服务器。请参阅 git-cvsserver[1]

如果存在 ~/git-shell-commands 目录,git shell 还会通过从用户主目录运行 "git-shell-commands/<命令> <参数>" 来处理其他自定义命令。

交互式使用

默认情况下,上述命令只能使用 -c 选项执行;Shell 不是交互式的。

如果存在 ~/git-shell-commands 目录,git shell 也可以交互式运行(不带参数)。如果 git-shell-commands 目录中存在 help 命令,则会运行该命令,为用户提供允许操作的概述。然后会显示一个 "git> " 提示符,您可以在其中输入 git-shell-commands 目录中的任何命令,或者输入 exit 来关闭连接。

通常,此模式用作管理界面,允许用户列出他们有权访问的仓库,创建、删除或重命名仓库,或更改仓库描述和权限。

如果存在 no-interactive-login 命令,则会运行该命令并中止交互式 Shell。

示例

禁用交互式登录,显示问候语

$ chsh -s /usr/bin/git-shell
$ mkdir $HOME/git-shell-commands
$ cat >$HOME/git-shell-commands/no-interactive-login <<\EOF
#!/bin/sh
printf '%s\n' "Hi $USER! You've successfully authenticated, but I do not"
printf '%s\n' "provide interactive shell access."
exit 128
EOF
$ chmod +x $HOME/git-shell-commands/no-interactive-login

启用 git-cvsserver 访问(这通常需要上述 no-interactive-login 示例作为先决条件,因为创建 git-shell-commands 目录允许交互式登录)

$ cat >$HOME/git-shell-commands/cvs <<\EOF
if ! test $# = 1 && test "$1" = "server"
then
	echo >&2 "git-cvsserver only handles \"server\""
	exit 1
fi
exec git cvsserver server
EOF
$ chmod +x $HOME/git-shell-commands/cvs

另请参阅

ssh(1), git-daemon[1], contrib/git-shell-commands/README

GIT

Git[1] 套件的一部分