Какой принцип лежит в основе подсистем OpenSSH (или опция command=)?

В 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 ответ

Решение

Во-первых, обратите внимание, что 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 Подсистема для всех пользователей.

Другие вопросы по тегам