Sim. Não use shell para isso. Escreva um programa em um idioma que permita que você se certifique de que os únicos binários que serão executados sejam listados em branco.
Eu tenho uma caixa ssh que executa os serviços Subversion e Mercurial. Na conexão a esta caixa, um script verifica se o usuário está apenas executando comandos relacionados ao mercurial ou ao svn:
#!/bin/bash
#
# Verify that the requested command is an svnserve call.
#
# Note that sshd stores the command requested by the client in
# the variable "SSH_ORIGINAL_COMMAND".
echo $SSH_ORIGINAL_COMMAND | grep -E '^hg -R'
ISHG=$?
if [[ $SSH_ORIGINAL_COMMAND = "svnserve -t" || $ISHG -eq 0 ]]
then
exec $SSH_ORIGINAL_COMMAND
else
echo "You are only allowed svn access to this server."
fi
O problema é que a verificação hg não é muito limpa ou segura. Se eu incluir backticks no meu comando ssh remoto, a linha "echo $ SSH_ORIGINAL_COMMAND" ficará feliz em executá-lo. Alguém tem alguma sugestão para limpar isso um pouquinho?
Obrigado!
O Mercurial vem com uma ferramenta exatamente para isso! Use o script contrib/hg-ssh
que fornecemos para restringir os comandos. O arquivo contém este cabeçalho para explicar como usá-lo:
To be used in
~/.ssh/authorized_keys
with thecommand
option, see sshd(8):command="hg-ssh path/to/repo1 /path/to/repo2 ~/repo3 ~user/repo4" ssh-dss ...
(probably together with these other useful options:
no-port-forwarding
,no-X11-forwarding
,no-agent-forwarding
)This allows pull/push over SSH from/to the repositories given as arguments. If all your repositories are subdirectories of a common directory, you can allow shorter paths with:
command="cd path/to/my/repositories && hg-ssh repo1 subdir/repo2"
You can use pattern matching of your normal shell, e.g.:
command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"