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

3889
0xC0000022L

В 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... 

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

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

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

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

3

1 ответ на вопрос

4
grawity

First, note that command= does not invoke a SSH subsystem. It merely runs the command as if it were given on the SSH client's command line; e.g.

ssh yourhost "svnserve -t --tunnel-user=alice" ssh yourhost "git upload-pack /pub/git/myproject.git" ssh yourhost "ls -la" 

The above examples should make it clearer that communication with svnserve or git or ls happens over the same stdio (stdin/stdout/stderr) as any other SSH interaction. For SVN and Git, the ssh client merely serves as a tool to invoke commands remotely.


"Real" subsystems, as configured using the Subsystem option in sshd_config, aren't that much different. The only major difference is that they can be invoked by a static, well-known name, instead of relying on the remote login shell (bash, zsh, &c) to find the correct executable. For example, the SFTP server can be /usr/lib/ssh/sftp-server in one machine, MULTINET_COMMON_ROOT:[MULTINET]SFTP-SERVER2.EXE in another, built into sshd in third (Subsystem sftp internal-sftp), but in all cases clients can still find it using the name sftp.

At least in OpenSSH, subsystems can be written just like normal programs that communicate with the client via stdin/stdout/stderr. It seems that passing arbitrary command-line arguments is not allowed, however, so you cannot just configure a single svnserve subsystem for all users.

Хороший ответ. Благодарю. Я знаю, что подсистемы разные, но они похожи на метод `command =`, поэтому я считаю, что метод связи такой же. 0xC0000022L 11 лет назад 0

Похожие вопросы