如何才能通过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来完成呢?