我需要在服务器上启用 shell 脚本的远程执行,但拒绝所有其他访问。该脚本是一个接受单个参数(开/关/状态)的开关。这接近回答我的问题,但是虽然它可以远程运行脚本,但我仍然无法传递参数。有没有一种方法可以做到这一点,而无需为每个可能的参数创建一个新的 shell 帐户?
基本上,我希望能够在我的远程服务器上运行:
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 在链接文章中的响应可以做到这一点,但它不能作为 shell 脚本中的单行代码。
解决方案详情:
# 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
添加了以下 shell 脚本~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
如果您使用自定义 shell根据阿尔切的建议 和2BC,那么该 shell 将接收用户打算作为参数执行的命令,因为 shell 是这样调用的:
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
如果您使用强制命令根据科伦的建议然后您将在环境变量中找到用户想要调用的命令$SSH_ORIGINAL_COMMAND
。您可以使用与上面类似的脚本。