git shell
名称
git-shell - 仅限 Git-SSH 访问的受限登录 shell
概要
chsh -s $(command -v git-shell) <user>git clone <user>@localhost:/path/to/repo.git ssh <user>@localhost
描述
这是 SSH 帐户的登录外壳,用于提供受限制的 Git 访问。它只允许执行实现拉/推功能的服务器端 Git 命令,以及git-shell-commands
在用户主目录中命名的子目录中存在的自定义命令。
命令
git shell
在-c
选项后接受以下命令:
git receive-pack <argument> git upload-pack <argument> git upload-archive <argument>
调用相应的服务器端命令,以支持客户端的git push
,git fetch
或git archive --remote
请求。
cvs server
模仿 CVS 服务器。参见 git-cvsserver [1]。
如果存在~/git-shell-commands
目录,则git shell
还将通过在用户的主目录中运行“ git-shell-commands/<command> <arguments>
”来处理其他自定义命令。
交互式使用
默认情况下,上述命令只能使用该-c
选项执行; 该 shell 不是交互式的。
如果~/git-shell-commands
目录存在,git shell
也可以交互式运行(不带参数)。如果目录中help
存在命令git-shell-commands
,则会向用户提供允许的操作概述。然后出现一个“git>”提示符,用户可以输入git-shell-commands
目录中的任何命令或exit
关闭连接。
通常,此模式用作管理界面,以允许用户列出他们有权访问的存储库,创建,删除或重命名存储库,或更改存储库描述和权限。
如果no-interactive-login
命令存在,则运行它并交互式 shell 被中止。
示例
To disable interactive logins, displaying a greeting instead:
$ 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 128EOF $ chmod +x $HOME/git-shell-commands/no-interactive-login
要启用 git-cvsserver 访问权限(通常应该有上述no-interactive-login
示例作为先决条件,因为创建 git-shell-commands 目录允许交互式登录):
$ cat >$HOME/git-shell-commands/cvs <<\EOFif ! test $# = 1 && test "$1" = "server"then echo >&2 "git-cvsserver only handles \"server\"" exit 1fi exec git cvsserver server EOF $ chmod +x $HOME/git-shell-commands/cvs