3

В OpenSSH можно объявить подсистему в файле конфигурации (/etc/ssh/sshd_config) или заставить команду, такую как svnserve выполнить, включив ее в строку authorized_keys для определенного ключа, например так:

command="svnserve -t --tunnel-user=alice" ssh-dss AAAA...
command="svnserve -t --tunnel-user=bob" ssh-dss AAAA...

тем самым позволяя одному и тому же системному пользователю повторно использоваться для разных "идентификаторов" в контексте Subversion (svnserve).

Как мне написать такой сервис, как svnserve , позволяющий указать использование туннеля и как именно данные передаются в этих случаях? В частности, как экземпляр svnserve "знает", каким образом выводить данные или читать ввод? Все ли это происходит через stdout и stdin в таком случае, и если так, будет ли способ отличить stderr ?

Я полагаю, что подсистема и command= используют один и тот же механизм, но, пожалуйста, исправьте меня, если я ошибаюсь.

(Я оставил no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty для краткости, но я знаю о них и об их использовании в сценарии.)

1 ответ1

4

Во-первых, обратите внимание, что command= не вызывает подсистему SSH. Он просто запускает команду, как если бы она была задана в командной строке клиента SSH; например

ssh yourhost "svnserve -t --tunnel-user=alice"

ssh yourhost "git upload-pack /pub/git/myproject.git"

ssh yourhost "ls -la"

Приведенные выше примеры должны прояснить, что связь с svnserve git или ls происходит через тот же stdio (stdin/stdout/stderr), что и при любом другом взаимодействии SSH. Для SVN и Git ssh клиент просто служит инструментом для удаленного вызова команд.


"Реальные" подсистемы, настроенные с использованием параметра Subsystem в sshd_config , не сильно отличаются. Единственное существенное отличие состоит в том, что они могут вызываться статическим, хорошо известным именем вместо того, чтобы полагаться на удаленную оболочку входа в систему (bash, zsh, & c), чтобы найти правильный исполняемый файл. Например, SFTP-сервер может быть /usr/lib/ssh/sftp-server на одном компьютере, MULTINET_COMMON_ROOT:[MULTINET]SFTP-SERVER2.EXE в другом, встроенный в sshd в третий (Подсистема sftp internal-sftp), но во всех случаях клиенты все равно могут найти его, используя имя sftp .

По крайней мере, в OpenSSH подсистемы могут быть написаны как обычные программы, которые общаются с клиентом через stdin/stdout/stderr. Однако кажется, что передача произвольных аргументов командной строки недопустима, поэтому вы не можете просто настроить одну подсистему svnserve для всех пользователей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .