3

假设在带有 Git 存储库的服务器上的 ~/.ssh/authorized_keys 中有大量 ssh 公钥列表,一般格式为“user@mail.com”

我想为 pre-receive 钩子编写 bash 脚本,它检查哪个 SSH 密钥用于推送提交,然后在收到之前对提交执行某些操作。所以剧本的大纲是..

#!/bin/sh
#
<Check key which was used from authorized_keys for the commit>
<Print email corresponding to the SSH key to a file as a log>
<Do some other stuff here>

但是由于服务器存储了公钥,而私钥用于推送提交,是否可以检查使用了哪个密钥?如果有怎么办?

抱歉,如果我遗漏了一些明显的东西,只需要一些指导即可开始。

任何帮助表示赞赏,谢谢。

4

2 回答 2

2

您可以编辑~/.ssh/authorized_keys文件以包含与每个键关联的环境变量或自定义命令。

假设您的authorized_keys文件中有以下公钥:

ssh-rsa AAAA.... usera@hosta
ssh-rsa AAAA.... usera@hostb
ssh-rsa AAAA.... userb@hostc

并且您希望能够获取与每个相关联的用户电子邮件。您可以编辑authorized_keys改为阅读:

environment="EMAIL=usera@example.com" ssh-rsa AAAA.... usera@hosta
environment="EMAIL=usera@example.com" ssh-rsa AAAA.... usera@hostb
environment="EMAIL=userb@example.com" ssh-rsa AAAA.... userb@hostc

现在在您的脚本中,您可以访问该EMAIL变量:

#!/bin/sh

sendmail "$EMAIL" <<EOF
To: $EMAIL
From: admin@example.com

This is a test message
EOF

请注意,如果您信任您的用户,则应使用此机制以方便,如果您希望不被破坏,则不应使用安全性。如果您希望这是安全的,以便用户无法篡改它,您需要使用强制命令功能,其中所有访问都通过一个仅允许运行特定 Git 命令的包装器命令。您可以为此编写自己的包装器,但如果您打算沿着这条路线走,只使用gitolite可能是最好的解决方案。如果您确实想自己实现它,gitolite 有一个页面解释它是如何工作的。

于 2015-12-17T06:02:32.647 回答
0

问题是gitolite只能使用 ssh 密钥,因为它使用ssh “强制命令”功能,该功能允许您注册(在~/.ssh/authorized-keys)脚本(强制命令),无论您最初指定哪个命令,该脚本都会运行。

没有它,正如“我可以找出哪个 ssh 密钥用于访问帐户吗? ”中所述,您将需要解析 sshd 日志,或以~/.ssh/authorized-keys某些方式修改(例如添加环境变量)。

于 2015-12-17T05:18:08.983 回答