假设在带有Git存储库的服务器上~/.ssh/authorized_keys中有一个很大的ssh公钥列表,其通用格式为"user@mail.com"
我想为预接收挂钩编写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>
但是,由于服务器存储公钥,并且私钥用于推送提交,所以有可能检查使用了哪个密钥吗?如果是,怎么办?
很抱歉,如果我遗漏了一些显而易见的东西,只需要一些指导就可以开始了。
感谢您的帮助。
您可以编辑~/.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有一个页面来解释它是如何工作的。
问题是gitolite之所以能够使用ssh密钥,只是因为它使用了ssh"强制命令"功能,该功能允许您(在~/.ssh/authorized-keys
中)注册一个脚本(强制命令),无论您最初指定的是哪个命令,该脚本都将运行。
如果没有这一点,如"我能找出哪个ssh密钥用于访问帐户吗?"中所述,您将需要解析sshd日志,或者以某些方式修改~/.ssh/authorized-keys
(例如添加环境变量)。