检查authorized_keys以查看用于推送提交的密钥

时间:2015-12-16 23:31:57

标签: git bash ssh git-bash authorized-keys

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

我想为预接收挂钩编写bash脚本,它检查用于推送提交的SSH密钥,然后在收到之前对提交执行某些操作。所以脚本的轮廓将是......

divide_pay()

但是由于服务器存储公钥,私钥用于推送提交,是否可以检查使用了哪个密钥?如果是这样的话?

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

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分: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 has a page explaining how it works

答案 1 :(得分:0)

问题是 gitolite 只能使用ssh密钥,因为它使用ssh "forced command" feature允许您注册(~/.ssh/authorized-keys)a脚本(the forced command)无论您最初指定哪个命令都将运行。

如果没有这个,如“Can I find out which ssh key was used to access an account?”中所述,您需要parse the sshd logs,或者以某种方式修改~/.ssh/authorized-keys(例如添加environment variables)。