Какой принцип лежит в основе подсистем 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
Подсистема для всех пользователей.