您可以在远程上编写一个包装脚本,并在authorized_keys行之前添加command =“/path/to/wrapper”。
command="/usr/local/bin/gitaccess" ssh-rsa ...
在这个包装器中,您需要检查SSH_ORIGINAL_COMMAND。Git会发出以下命令:
git receive-pack '/path/provided'
git upload-pack '/path/provided'
如果 SSH_ORIGINAL_COMMAND 不为空并以其中之一开头,则检查路径,必要时创建存储库,在其中安装所需的任何配置,并执行命令。
如果 SSH_ORIGINAL_COMMAND 为空且您希望为用户提供 shell 访问权限,则调用 shell。
如果 SSH_ORIGINAL_COMMAND 不为空但不以 git 命令开头,如果您希望允许用户使用 shell,则只需执行提供的命令。
以下是一些 Ruby 代码示例。请注意,我没有测试它,有改进的余地(例如我们不应该硬编码 /bin/bash)。
#!/usr/bin/env ruby
orig_command = ENV['SSH_ORIGINAL_COMMAND']
if orig_command.nil?
exec '/bin/bash'
end
cmd_parts = orig_command.match /([a-z-]+) '([a-z0-9.\/]+)'/
if cmd_parts.nil?
exec '/bin/bash', '-c', orig_command
end
command = cmd_parts[1]
path = '/var/repositories/'+cmd_parts[2]
if command == 'git-receive-pack' || command == 'git-upload-pack'
if not File.directory?(path)
`git init --bare #{path}`
end
exec 'git-shell', '-c', "#{command} '#{path}'"
end
exec '/bin/bash', '-c', orig_command
您可以在authorized_keys中传递参数给此脚本,以识别用户并选择他们是否应该拥有shell访问权限。我也使用这种方法来控制每个存储库的访问权限。如果您想将此参数带到git钩子中,只需创建一个环境变量即可。
&&
跨越两行,为什么不使用bash -e
呢?此外,您还可以运行git init --bare /path/to/$2
。 - Eric