【问题标题】:Custom commands with git-shell使用 git-shell 自定义命令
【发布时间】:2013-01-05 19:49:00
【问题描述】:

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

当给定-c时,程序以非交互方式执行; 可以是 git receive-pack、git upload-pack、git 之一 upload-archive、cvs 服务器或 COMMAND_DIR 中的命令。外壳是 当没有给出参数时以交互模式启动;在这种情况下, 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-shell 的?你定义COMMAND_DIR了吗?
  • 我没有定义它。我假设它是 $HOME/git-shell-commands,其中 $HOME 是 gituser 的主目录 (/home/gituser)。我使用 ssh 访问 git-shell,就像上面的例子一样。
  • 文档中明确指出脚本需要放在COMMAND_DIR 中。如果你不知道它指向哪个目录,你怎么能在里面放文件呢?
  • 好吧,文档还指出“COMMAND_DIR 是路径“$HOME/git-shell-commands”。我假设 $HOME 是用户的主目录。但是,我可能错了。如何检查这个 COMMAND_DIR 在哪里?

标签: linux git shell ssh


【解决方案1】:

事实证明,该功能已在 git 1.7.4 中引入。我正在使用 debian 挤压,它包含旧版本的 git,所以这就是它不起作用的原因。

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

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

【讨论】:

  • +1 刚遇到完全相同的问题,您节省了我几天的调试时间,谢谢。
【解决方案2】:

要允许 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 之前的版本创建交互模式(尝试启动交互会话将导致“致命:你认为我是什么?一个 shell?”来自 git-shell 的错误),但是不应干扰 1.7.4 及更高版本中的交互模式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2014-11-29
    • 2016-12-10
    相关资源
    最近更新 更多