我想创建一个只能做一件事的用户:通过 ssh 指定一个驻留在一个特定文件夹中的脚本(以及该脚本的命令行参数)(出于这个问题的目的,让我们称之为它/local/remote_only_scripts/foo
)并执行该脚本并返回它的输出。
为了清楚起见,我不希望用户能够做一些事情的例子:
- 本地登录帐户。登录应用程序是
/bin/login
.它不是/local/remote_only_scripts/foo
文件夹中的脚本,因此不应由用户调用。 - 远程登录帐户。再次登录(是 ssh 调用的吗?)不是相关文件夹中的脚本。
- 列出目录的内容。 ls 位于
/bin/ls
.它不是适当目录中的脚本。 - 编辑该目录中的文件。 emacs、vi、gedit 大多数其他编辑器不是该目录中的脚本。
- 查看该目录中文件的内容。
- 执行该目录下他无权执行的文件。
请注意,这些是例子还有许多其他操作我不希望用户能够执行。在考虑某个操作时,请询问“这是由 中的脚本完成的吗/local/remote_only_scripts/foo
?”如果答案是否定的,则用户不应该能够这样做。如果答案是肯定的,那么用户应该能够做到这一点。
PS:让我澄清一下“添加用户”的含义。我的意思并不是将用户添加到某些 ssh 子系统。相反,我的意思是向计算机系统添加用户。例如,我有一个运行 debian stable 的系统,通过它的地址调用它,www.hg.bar.com。我想添加一个用户(通过 kuser、users-admin 或 useradd 或某种类似的方式)称他为 hg_guest。 hg_guest 无法本地登录或执行上述列表中的任何操作。 hg_guest 所能做的就是“远程”执行脚本。我说他应该可以通过ssh来做到这一点,但是现在想想,也许允许他使用ssh可能会让他在本地登录,所以可能需要一些其他机制。
答案1
有一个命令authorized_keys 文件中的选项。这个选项似乎完全符合你的要求。
请注意,它不是 chroot 或受限 shell。它只允许通过 ssh 执行这些命令。以你的例子来说,它将是:
ssh somehost /local/remote_only_scripts/foo
对于这个authorized_keys文件:
command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key...
如果您不希望用户能够本地登录,有很多方法。您可以:
- 只需将其外壳设置为/bin/假(也许你需要/bin/真因为 ssh 需要有效登录)
- 锁定其密码,请参阅
passwd -l
编辑:添加了更多限制选项并阐明了如何删除本地访问权限。
答案2
尝试将此作为用户的登录 shell:
#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
if [ ! -x "$basedir/$prog" ]; then
echo "Invalid program: $prog"
else
case "$prog $args" in
*\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
echo "Invalid character in command";;
*)
eval "$prog $args"
echo;; # force a trailing newline after the program
esac
fi
done
您可能还希望将其authorized_keys
明确地包含在文件中,如 Coren 的回答所示;但替换 '.../foo;与这里的程序。这将阻止来自 SSH 的命令,例如sftp
、scp
和ssh hostname command
。
答案3
万一他们只需要访问一个脚本,这对我来说非常有效。添加用户并将其默认 shell 更改为脚本的路径。当他们通过 ssh 连接时,它将执行脚本并关闭会话。
server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest
server1:/ # grep hg_guest /etc/passwd
hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh