매개변수를 사용하여 SSH 원격 실행을 제한하세요.

매개변수를 사용하여 SSH 원격 실행을 제한하세요.

서버에서 쉘 스크립트의 원격 실행을 활성화해야 하지만 다른 모든 액세스는 거부해야 합니다. 스크립트는 단일 매개변수(켜기/끄기/상태)를 허용하는 스위치입니다.이것내 질문에 거의 답변했지만 스크립트를 원격으로 실행할 수는 있지만 여전히 매개변수를 전달할 수는 없습니다. 가능한 모든 매개변수에 대해 새 쉘 계정을 생성하지 않고 이를 수행할 수 있는 방법이 있습니까?

기본적으로 원격 서버에서 실행할 수 있기를 원합니다.

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

그리고 다음에 해당합니다:

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

링크된 기사에 있는 Arcege의 응답은 이를 수행하지만 쉘 스크립트에서 한 줄의 코드로 작동하지 않습니다.


솔루션 세부정보:

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

~remotecontrol/.ssh/authorized_keys원격 로그인을 비활성화 하려면 다음 줄을 추가하십시오 .

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

다음 쉘 스크립트를 추가했습니다 ~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

답변1

사용자 정의 쉘을 사용하는 경우Alce의 제안에 따라 그리고 기원전 2년, 쉘은 다음과 같이 호출되기 때문에 사용자가 실행하려는 명령을 인수로 수신합니다.

shellname -c the_original_command

따라서 -c(당신의 것 $1)을 무시하고 에서 명령을 찾으십시오 $2. 예를 들어:

#!/bin/sh

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

강제 명령을 사용하는 경우Colen의 제안을 바탕으로그러면 환경 변수에서 사용자가 호출하려는 명령을 찾을 수 있습니다 $SSH_ORIGINAL_COMMAND. 위와 비슷한 스크립트를 사용할 수 있습니다.

관련 정보