阻止交互式SSH会话,同时允许某些命令

如何才能通过SSH运行某些命令并阻止交互式会话?

rsync.net和bakop.com一样。

即,这将工作:

ssh <user@host> mkdir test scp <file> <user@host>:test/ 

而这不会:

 ssh <user@host> 

您可以使用authorized_keys中的command=指令和传递给远程系统的SSH_ORIGINAL_COMMANDvariables来将密钥限制为特定命令。

在authorized_keys文件中更改包含相关密钥的行

 ssh-rsa AAAAB3NzaC1yc... 

 command="/path/to/myscript" ssh-rsa AAAAB3NzaC1yc... 

然后像例如创buildmyscript文件

 #!/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 "$@" 

所以现在如果你运行ssh [email protected] ls /etc你会得到远程/etc目录的列表。 您可能会想要使用case语句来testing提供的参数以满足您的实现要求。

而不是从头编写自己的shell,你可能想要扩展它:

https://github.com/scponly/scponly/wiki

它提供了一个你可以设置为一个只支持SCP的用户(即usermod或者直接在/etc/passwd )的shell。 你会想扩展到你select的一些select的二进制文件,其中没有一个应该是一个交互式的shell(例如/bin/bash/bin/sh )。 更仔细的是,他们不能上传一个(例如一个busybox二进制文件)并设置可执行位,以便它们可以放在自己的shell中。

为该用户使用不同的shell – 如果您有特定的要求,则可能必须自行编写,但您需要非常小心! 许多炮弹已经提供了受限制的手术,但是对你来说可能不够有限。

Scp可以制作目录 – 那么你还需要什么来让用户通过交互式的ssh来完成呢?