Qual é o princípio por trás dos subsistemas OpenSSH (ou command = option)?

3

No OpenSSH, é possível declarar um subsistema no arquivo de configuração ( /etc/ssh/sshd_config ) ou forçar a execução de um comando, como svnserve , incluindo isso na linha authorized_keys de uma chave específica como esta:

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

permitindo assim que o mesmo usuário do sistema seja reutilizado para diferentes "identidades" dentro do contexto do Subversion ( svnserve ).

Como eu iria escrever um serviço como svnserve , permitindo especificar o uso do túnel e como exatamente os dados são transmitidos nesses casos? Em particular, como a instância svnserve "sabe" por quais meios enviar os dados ou ler a entrada? Isso tudo acontece via stdout e stdin nesse caso e, se assim for, haverá uma maneira de distinguir stderr também?

Eu imagino que o subsistema e o command= estão usando o mesmo mecanismo, mas, por favor, corrija-me se estiver errado.

(Saí de no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty por brevidade, mas estou ciente deles e de seu uso para o cenário.)

    
por 0xC0000022L 16.05.2012 / 21:16

1 resposta

4

Primeiro, observe que command= não chama um subsistema SSH. Ele simplesmente executa o comando como se fosse dado na linha de comando do cliente SSH; por exemplo,

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

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

ssh yourhost "ls -la"

Os exemplos acima devem deixar mais claro que a comunicação com svnserve ou git ou ls acontece sobre o mesmo stdio (stdin / stdout / stderr) que qualquer outra interação SSH. Para SVN e Git, o cliente ssh serve apenas como uma ferramenta para invocar comandos remotamente.

Os subsistemas "reais", conforme configurados usando a opção Subsystem em sshd_config , não são muito diferentes. A única grande diferença é que eles podem ser invocados por um nome estático e conhecido, em vez de depender do shell de login remoto (bash, zsh, & c) para localizar o executável correto. Por exemplo, o servidor SFTP pode ser /usr/lib/ssh/sftp-server em uma máquina, MULTINET_COMMON_ROOT:[MULTINET]SFTP-SERVER2.EXE em outra, embutido em sshd na terceira ( Subsistema sftp interno-sftp ), mas em todos os casos os clientes ainda podem encontre-o usando o nome sftp .

Pelo menos no OpenSSH, subsistemas podem ser escritos como programas normais que se comunicam com o cliente via stdin / stdout / stderr. Parece que não é permitido passar argumentos de linha de comando arbitrários, portanto, não é possível configurar apenas um subsistema svnserve para todos os usuários.

    
por 16.05.2012 / 23:02