繁体   English   中英

使用git-shell的自定义命令

[英]Custom commands with git-shell

如何为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 gituser@server.com testy
fatal: unrecognized command 'testy'

请注意,git-shell正在运行,并且响应,它无法找到我的自定义命令。

以下是脚本:

:/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运行自定义命令?

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

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

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

要允许1.7.4之前的自定义命令(以及1.7.10的非交互模式),可以使用git-shell的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-shell一样,上面的脚本要求将整个命令行作为第一个参数传递。 如果您宁愿将命令行作为单独的参数传递:

#!/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" "$@"
else
    exec git-shell -c "$*"
fi

例如,这允许您在authorize_keys中调用受限制的shell,如下所示:

command="sshsh $SSH_ORIGINAL_COMMAND" ...

请注意,两个脚本都没有为1.7.4之前的版本创建交互模式(尝试启动交互式会话将导致“致命:你认为我是什么?来自git-shell的shell?”错误),但不应该干扰1.7.4和更新版本中的交互模式。

免责声明:此问题尚未经过安全漏洞审查。 使用风险由您自己承担。 特别是,〜/ git-shell-commands中的每个命令都是一个潜在的安全漏洞(尽管git-shell 1.7.4及更高版本也是如此,即使没有上述任何脚本也是如此)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM