Вы можете написать сценарий оболочки на пульте дистанционного управления и добавить команду = "/ path / to / wrapper" к строкам авторизованных ключей.
command="/usr/local/bin/gitaccess" ssh-rsa ...
В этой оболочке вы должны проверить SSH_ORIGINAL_COMMAND.Git выдает следующие команды:
git receive-pack '/path/provided' # when pushing
git upload-pack '/path/provided' # when pulling
Если SSH_ORIGINAL_COMMAND не пуст и начинается с одной из них, вы проверяете путь, создаете хранилище, если необходимо, устанавливаете в нем любую необходимую конфигурацию и выполняете команду.
Если SSH_ORIGINAL_COMMAND пуст и вы хотите предоставить пользователям доступ к оболочке, вы вызываете оболочку.
Если SSH_ORIGINAL_COMMAND не пуст, но не запускается командой git, если вы хотитечтобы предоставить пользователям доступ к оболочке, вы просто выполните предоставленную команду.
Вот немного кода на Ruby для демонстрации.Обратите внимание, что я не тестировал его, и есть возможности для улучшения (например, мы не должны жестко кодировать /bin/bash).
#!/usr/bin/env ruby
orig_command = ENV['SSH_ORIGINAL_COMMAND']
if orig_command.nil?
# If you want to preserve shell access
exec '/bin/bash' # not tested, I hope it's interactive if executed this way
end
cmd_parts = orig_command.match /([a-z-]+) '([a-z0-9.\/]+)'/
if cmd_parts.nil?
# If you want to preserve shell access
exec '/bin/bash', '-c', orig_command
end
command = cmd_parts[1]
path = '/var/repositories/'+cmd_parts[2] # not secured (could contain '..')
if command == 'git-receive-pack' || command == 'git-upload-pack'
if not File.directory?(path)
`git init --bare #{path}` # not secured, I didn't escape path
# Do any configuration here
end
exec 'git-shell', '-c', "#{command} '#{path}'"
end
# If you want to preserve shell access
exec '/bin/bash', '-c', orig_command
Вы также можете передать аргумент этому сценарию в авторизованных ключах для идентификации пользователей.и выберите, должны ли они иметь доступ к оболочке.Я также делаю это для контроля доступа для каждого хранилища.Если вы хотите перенести этот аргумент в ловушки git, просто создайте переменную окружения.