如何仅允许通过 SSH 运行某些命令并阻止交互式会话?
rsync.net 和 bakop.com 都可以做到这一点。
即这会起作用:
ssh <user@host> mkdir test
scp <file> <user@host>:test/
而这不会:
ssh <user@host>
答案1
您可以利用使用command=
authorized_keys中的指令和SSH_ORIGINAL_COMMAND
传递给远程系统的变量将密钥限制为特定命令的功能。
在 authorized_keys 文件中,将包含相关密钥的行从
ssh-rsa AAAAB3NzaC1yc...
到
command="/path/to/myscript" ssh-rsa AAAAB3NzaC1yc...
然后创建 myscript 文件,例如
#!/bin/bash
if [ ! -n "$SSH_ORIGINAL_COMMAND" ]
then
echo "No command supplied"
exit 1
fi
set $SSH_ORIGINAL_COMMAND
case "$1" in
ls)
;;
md5)
;;
*)
echo "invalid command"
exit 1
;;
esac
exec "$@"
所以现在如果你运行,你将得到一个远程目录的列表。你可能想要使用 case 语句来测试提供的参数是否满足你的实现要求。ssh [email protected] ls /etc
/etc
答案2
您可能不想从头编写自己的 shell,而是想要扩展它:
https://github.com/scponly/scponly/wiki
它提供了一个您可以设置为用户的 shell(即usermod
或直接在 中/etc/passwd
),它仅支持 SCP。您需要将其扩展到您选择的几个选定二进制文件,其中不应有交互式 shell(例如/bin/bash
,/bin/sh
)。更谨慎的是,他们不应该能够上传一个(例如 busybox 二进制文件)并设置可执行位,以便他们可以放入自己的 shell。
答案3
为该用户使用不同的 shell - 如果有特殊要求,您可能需要自己编写 shell,但需要非常小心!许多 shell 已经提供了受限操作,但它们可能对您来说还不够严格。
尽管 Scp 可以创建目录 - 那么您还需要允许用户通过交互式 ssh 做什么?