サーバーでシェルスクリプトのリモート実行を有効にする必要がありますが、他のすべてのアクセスは拒否する必要があります。スクリプトは、単一のパラメータ(オン/オフ/ステータス)を許可するスイッチです。これ私の質問にほとんど答えましたが、スクリプトをリモートで実行できますが、まだパラメータを渡すことはできません。可能なすべてのパラメータに対して新しいシェルアカウントを作成せずにこれを行う方法はありますか?
デフォルトでは、リモートサーバーで実行できるようにしたいです。
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からの応答はこれを行いますが、シェルスクリプトでは1行のコードでは機能しません。
ソリューションの詳細:
# 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
。上記のようなスクリプトを使用できます。