Execução remota ssh restrita com argumentos

4

Eu preciso ativar a execução remota de um script de shell em um servidor, mas negar todos os outros acessos. O script é um toggle que aceita um único parâmetro (on / off / status). Isso chega perto de responder à minha pergunta, mas enquanto ele funciona para executar scripts remotamente, eu ainda não consigo passar argumentos. Existe uma maneira de fazer isso sem criar uma nova conta de shell para cada possível argumento?

Basicamente, quero poder executar no meu servidor remoto:

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

E isso corresponde a:

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

A resposta do Arcege no artigo vinculado poderia fazer isso, mas não funciona como um one-liner em um script de shell.

DETALHES DA SOLUÇÃO:

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

Adicionada a linha a seguir a ~remotecontrol/.ssh/authorized_keys para desativar o login remoto:

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

Adicionado o script de shell a seguir como ~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
    
por Mikkel 17.07.2014 / 23:19

1 resposta

3

Se você usa um shell personalizado sugerido pelo Arcege e 2bc , então esse shell receberá o comando que o usuário pretende executar como um argumento, porque o shell é chamado assim:

shellname -c the_original_command

Portanto, ignore o -c (que é seu $1 ) e encontre o comando em $2 . Por exemplo:

#!/bin/sh

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

Se você usar um comando forçado como sugerido por Coren , você encontrará o comando que o usuário pretendeu invoque na variável de ambiente $SSH_ORIGINAL_COMMAND . Você pode usar um script semelhante ao acima.

    
por 18.07.2014 / 00:05