Restreint l'exécution à distance de ssh avec des arguments

Je dois activer l'exécution à distance d'un script shell sur un server, mais refuser tous les autres access. Le script est un bascule qui accepte un seul paramètre (on / off / status). Cela vient près de répondre à ma question, mais alors qu'il fonctionne pour exécuter des scripts à distance, je ne peux toujours pas passer des arguments. Existe-t-il un moyen de le faire sans créer un nouveau count shell pour chaque argument possible?

Fondamentalement, je veux pouvoir courir sur mon server distant:

myclient$ ssh remotecontrol@myserver on myclient$ ssh remotecontrol@myserver off myclient$ ssh remotecontrol@myserver status 

Et cela correspond à:

 myserver$ ./myscript.sh on myserver$ ./myscript.sh off myserver$ ./myscript.sh status 

La réponse d'Arcege dans l'article lié pourrait le faire, mais elle ne fonctionne pas comme une ligne unique dans un script shell.


DÉTAILS DE LA SOLUTION:

 # useradd -Urms /home/remotecontrol/shell.sh remotecontrol 

Ajouté la ligne suivante à ~remotecontrol/.ssh/authorized_keys pour désactiver la connection à distance:

 no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa [...public key...] remoteuser@remotehost 

Ajout du script shell suivant en tant que ~remotecontrol/shell.sh :

 #!/usr/bin/env bash case "$2" in on) echo 'Command: on' ;; off) echo 'Command: off' ;; status) echo 'Command: status' ;; *) echo 'Invalid command' ;; esac 

Si vous utilisez un shell personnalisé comme suggéré par Arcege et 2bc , ce shell recevra la command que l'user a l'intention d'exécuter en tant qu'argument car le shell est appelé comme ceci:

 shellname -c the_original_command 

Alors ignorez le -c (que votre $1 ) et trouvez la command dans $2 . Par exemple:

 #!/bin/sh case "$2" in on) do something ;; off) do something else ;; *) echo "wrong command name!" >&2 exit 1 esac 

Si vous utilisez une command forcée comme suggéré par Coren, vous findez la command que l'user avait l'intention d'appeler dans la variable d'environnement $SSH_ORIGINAL_COMMAND . Vous pouvez utiliser un script similaire à celui ci-dessus.