【发布时间】:2018-03-22 14:19:36
【问题描述】:
问题:如何编辑 git 调用钩子的方式?
TL;DR - 我的托管平台的安全性很奇怪,我需要弄清楚如何编辑 git 如何调用 post-receive 挂钩。
我正在尝试通过 GIT 设置自动部署,但人们建议您这样做的主要方式是使用接收后脚本。如果我 cd 进入钩子并执行
$ sh post-receive
,它工作得很好,但如果我
$ ./post-receive
,虽然它有权限,但它会抱怨权限
$ chmod 777 post-receive
(您可以使用 $ ls -l 查看)。
这是我从支持人员那里得到的消息: “原因是出于安全原因,SSH 环境被挂载为不可执行的环境。这意味着您不能仅通过路径运行脚本。
例如,running: /www/repos/webprosjekt18.git/hooks/post-receive 将不起作用,它会给出权限错误。
正在运行:bash /www/repos/webprosjekt18.git/hooks/post-receive 可以正常工作(取决于该脚本的 ofc 功能,但它至少会运行该文件)。
我们认为 git 默认通过调用 /www/repos/webprosjekt18.git/hooks/post-receive 来运行钩子,这将失败。 "
远程脚本:
mkdir repos
cd repos
git init --bare
cat > hooks/post-receive <<END
#!/bin/sh
echo "executing post-receive hook"
END
chmod 777 hooks/post-receive
cd hooks
sh post-receive
【问题讨论】:
-
他们是怎么做到的?如果您从使用 ssh 登录获得的 shell 执行
bash会发生什么。仍然无法执行脚本? (这是否只影响脚本?)如果您执行PATH=$PATH:.将当前目录添加到PATH会怎样? -
你是什么意思他们是怎么做到的?如文中所述,该脚本可以通过在调用它时说明它是什么脚本语言来执行,但我猜 git 不会那样做。如果我 cd 进入钩子并在接收后执行 $ sh,它工作正常。也不知道你建议我在哪里做 PATH 的东西。
-
对不起。我认为他们必须使用一些奇怪的诡计来做到这一点。所以我想知道他们是否会给你一些特殊的外壳? 1)通过ssh登录后,尝试执行例如
/usr/bin/bash(或任何其他外壳,例如/bin/sh、tcsh等)。生成的 shell 会有相同的限制吗? 2)通过ssh登录后,尝试执行PATH=$PATH:.。如果你这样做,你应该能够通过script.sh而不是./script.sh在当前路径中执行脚本。这行得通吗? 3)which bash的输出是什么 4).bashrc/.bash_profile是在登录时执行的吗? -
顺便说一句,git 只是
execves 钩子脚本。我很确定有办法绕过您的托管平台的安全性。例如,二进制可执行文件是否有效?如果是,你可以例如使用像int main() { system("bash script.sh"); }这样的小型 C 程序作为钩子。