Existem três opções:
-
Defina o aplicativo (ou invólucro adequado para ele) como o shell da conta.
Desta forma, a conta não tem um shell. Quando o usuário passar o comando, ele será passado como argumento de linha de comando para o "shell" precedido pelo sinalizador
-c
. Faça o que quiser com isso. -
Use a autenticação de chave pública e defina o que cada usuário pode executar usando a opção
command
em.ssh/authorized_keys
.Isso permite executar diferentes comandos para diferentes chaves e permite revogar permissões de usuários individuais. No entanto, ele precisa que cada usuário envie sua chave pública (as chaves particulares nunca devem sair da máquina em que são geradas, portanto, os usuários devem gerar chaves e enviar as partes públicas para você).
O comando obtém o comando passado na linha de comando ssh na variável de ambiente
SSH_ORIGINAL_COMMAND
, para que você possa usá-lo se quiser.Nesse caso, a conta precisa de um shell válido, porque
ssh
a utiliza para executar o comando configurado. -
Será que realmente tem que ser ssh? Você menciona que não tem que ser autenticado, nesse caso, talvez iniciá-lo diretamente de
inetd
poderia fazer. Ou telnet se você precisar de terminal ao invés de apenas stdin / stdout. Note que a opção 1 também funcionará com o telnet.
Um script de wrapper é seguro se você tomar o devido cuidado ao escrevê-lo. Se não aceitar nenhuma entrada, deve estar OK. Se você quiser usar a entrada (argumentos de linha de comando em 1., SSH_ORIGINAL_COMMAND
envvar em 2.), você deve limpá-lo com cuidado e citá-lo corretamente.
É claro que dependendo de quanto você confia no próprio aplicativo, você ainda pode querer colocá-lo em chroot ou em namespace separado.