2013-01-22 73 views
5

如何为git-shell创建自定义命令?根据documentation使用git-shell的自定义命令

当给出-c时,程序以非交互方式执行; 可以是git receive-pack,git upload-pack,git upload-archive,cvs服务器或COMMAND_DIR中的命令之一。当没有参数给出时,shell以 开始于交互模式;在这种情况下, COMMAND_DIR必须存在,并且其中的任何可执行文件可以调用 。

不过,我不知道我在正确理解这一点。我创建了一个名为gituser的用户,并将他/ usr/bin/git-shell作为一个shell。我创建了一个名为git-shell-commands的目录,并在其中放置了一个名为'testy'的脚本,但是我无法通过git-shell使其运行。

这里就是我可以从其他机器尝试:

$ ssh [email protected] testy 
fatal: unrecognized command 'testy' 

需要注意的是git的壳是否正常工作,并响应,它只是无法找到我的自定义命令。

这里是脚本:

:/home/gituser/git-shell-commands# ls -l -a 
total 12 
drwxr-xr-x 2 gituser gituser 4096 Jan 22 17:35 . 
drwxr-xr-x 4 gituser gituser 4096 Jan 22 13:57 .. 
-rwxr-xr-x 1 gituser gituser 26 Jan 22 13:58 testy 
:/home/gituser/git-shell-commands# ./testy 
hello! 
:/home/sodigit/git-shell-commands# cat testy 
echo "hello!" 

我在做什么错?如何使用git-shell运行自定义命令?

+0

你是如何启动git-shell的?你定义了'COMMAND_DIR'吗? –

+0

我没有定义它。我假设它是$ HOME/git-shell-commands,其中$ HOME是gituser的主目录(/ home/gituser)。我使用ssh来访问上面例子中的git-shell。 – mimrock

+0

该文档明确指出脚本需要放置在'COMMAND_DIR'中。如果你不知道它指向了哪个目录,你怎么能在其中放置文件? –

回答

5

事实证明,这个功能已经在git的1.7.4出台。我正在使用debian squeeze,其中包含旧版本的git,所以这就是为什么它不起作用。

如果遇到此问题,请检查您的git版本。

然而,由于git的1.7.10的,自定义命令仅在交互模式下工作,而不是用-c。我还没有尝试过最新的git,所以有可能这个问题与软件的版本无关。

+0

+1刚刚有完全相同的问题,你救了我几天的调试,谢谢。 – ehime

1

要允许预1.7.4自定义命令(在非交互模式1.7.10),您可以使用混帐壳shell脚本包装:

#!/bin/bash                  

cmdline=($1) 
cmd=$(basename "${cmdline[0]}") 

if [ -z "$cmd" ] ; then 
    exec git-shell 
elif [ -n "$cmd" -a -x ~/git-shell-commands/"$cmd" ] ; then 
    ~/git-shell-commands/"$cmd" "${cmdline[@]:1}" 
else 
    exec git-shell -c "$1" 
fi 

无论你通常会使用“git-shell”,改为引用此脚本,尽管省略了此脚本的任何“-c”参数。

作为与GIT壳,上述脚本要求整个命令行被作为第一个参数传递。如果您想通过命令行作为独立参数:

#!/bin/bash                  

cmd=$(basename $1) 

if [ -z "$cmd" ] ; then 
    exec git-shell 
elif [ -n "$cmd" -a -x ~/git-shell-commands/"$cmd" ] ; then 
    shift 
    ~/git-shell-commands/"$cmd" "[email protected]" 
else 
    exec git-shell -c "$*" 
fi 

例如,这可以让你调用受限shell在authorize_keys为:

command="sshsh $SSH_ORIGINAL_COMMAND" ... 

注意,无论是脚本创建交互模式在1.7.4之前(试图启动一个交互式会话会导致一个“致命的:你认为我是一个shell?”错误来自git-shell),但不应该干扰1.7.4中的交互模式,新。

免责声明:这还没有审查安全漏洞。使用风险自负。特别是,〜/ git-shell-commands中的每个命令都是潜在的安全漏洞(尽管git-shell 1.7也是如此)。4和更高版本,即使没有任何上述脚本)。