Deshabilitar la sustitución de commands en shell

Tengo una caja ssh que ejecuta los services de Subversion y Mercurial. Al conectarse a este cuadro, un script verifica que el usuario sólo está ejecutando mercurial o svn relacionados con los commands:

#!/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 

El problema es, la verificación hg no es muy limpio o seguro. Si incluyo backticks en mi command ssh remoto, la línea "echo $ SSH_ORIGINAL_COMMAND" lo ejecutará felizmente. ¿Alguien tiene alguna sugerencia para limpiar esto un poco?

¡Gracias!

Sí. No utilice shell para eso. Escriba un progtwig en un idioma que le permita asegurarse de que los únicos binarys que va a ejecutar son de list blanca.

Mercurial viene con una herramienta para exactamente esto! Utilice la secuencia de commands contrib/hg-ssh que proporcionamos para restringir los commands. El file contiene este encabezado para explicar cómo usarlo:

Para usarse en ~/.ssh/authorized_keys con la opción de command , vea sshd (8):

 command="hg-ssh path/to/repo1 /path/to/repo2 ~/repo3 ~user/repo4" ssh-dss ... 

(probablemente junto con estas otras opciones útiles: no-port-forwarding no-X11-forwarding no-agent-forwarding )

Esto permite tirar / empujar sobre SSH de / a los repositorys dados como arguments. Si todos sus repositorys son subdirectorys de un directory común, puede permitir routes más cortas con:

 command="cd path/to/my/repositories && hg-ssh repo1 subdir/repo2" 

Puede utilizar la coincidencia de patrones de su shell normal, por ejemplo:

 command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"