OliveTin能在网页上安全运行shell命令(下)
上篇发出后,网友
figo留言提到了他的实现方法,和老苏不谋而合👍
老苏给自己提了几点要求,希望能实现:
- 不需要使用
root来运行容器,这样的话图形界面安装的OliveTin也能正常使用; - 不需要映射
/var/run/docker.sock也能控制容器(因为即使映射了还是需要有root权限); - 能使用不同的身份来执行不同的命令;
解决思路
老苏打算从容器内 ssh 登录到宿主机,然后在宿主机上执行命令,这可以控制登录宿主机的用户权限,不需要用 root 或者提升权限来运行容器,也不需要映射 /var/run/docker.sock,看起来似乎所有的问题都解决了,但其实还有一个问题,就是 ssh 命令行存在交互操作,需要输入密码,接下来要做的事:
- 先解决
ssh命令行输入密码; - 然后从容器内
ssh到群晖宿主机,再执行命令,包括ping等等,这样就可以完成任何可以在命令行完成的任务;
说干就干,老苏在网上经过一番搜索找到了 sshpass,可以实现非交互的 ssh 密码验证,需要进入容器里安装
因为需要
root权限才能安装软件,所以不能从终端机或者portainer进容器,需要用SSH客户端登录到群晖,然后直接用下面的命令行即可
1 | # 以 root 身份进入容器 |

安装完成后,可以输入 sshpass 来检查是否安装成功

输入 exit 退出容器后,再次以普通身份进入容器,先执行一次 ssh 命令,就是前面 shell 中设定的 ssh root@192.168.0.197 'ping baidu.com -c 4',
1 | # 普通身份进入容器 |
目的是记住凭证,使之不再出现交互界面
这一步很重要,不然后面执行命令会超时或者返回
exit code代码而不是success如果是
ssh登录其他主机,第一次也需要做一次记住凭证的操作

一个标准的 sshpass 命令是下面这样
示例中用了
root只是为了演示方便,你需要根据不同的任务选择登录主机的ssh用户,即便是非要root才能执行的命令,也可以尝试用sudo来提升权限
1 | sshpass -p [password] ssh -p [port] root@192.168.X.X `[command line]` |
如果你用的标准端口 22,可以不用指定,所以给原来的 shell 前面加上了 sshpass -p [passwd],变成了下面的样子
从实际看,网页上执行的时间比较长,比较容易超时,所以把
timeout做了延长
1 | - title: 登录到 ds3617xs ping 百度 |
现在执行终于成功了,证实了老苏的解决思路是对的

接下来可以做你任何你想要的操作了
- 下面是老苏的完整的示例,记得保存为
UTF-8编码格式,不然中文会乱码- 你可以在示例的基础上做任意的修改,完成你需要的功能
1 | # 侦听端口 |
运行效果

可能遇到的问题
因为都是通过 SSH 执行命令,有可能会遇到 ssh 相关的问题,比如:
1 | kex_exchange_identification: read: Connection reset by peer |
很可能是因为登录太频繁被群晖锁定了

可以考虑将 IP 添加到 允许名单

小结
OliveTin 没有身份验证,虽然 OliveTin 可以不需要以 root 身份运行,但是,以 root 身份运行非常方便,因为许多用户需要运行需要 root 权限的操作和作业。
出于安全性考虑,建议:
1、以非特权用户身份运行 OliveTin;
2、ssh 尽量不要用 root账号;
3、使用 sudo 规则来控制它可以做什么和不能做什么;
但这要求我们对 Linux 操作系统有一定的了解,无论如何请不要在公共服务器上使用它,局域网也不能说无所谓,只是起码不会有故意的破坏行为。
参考文档
List of common exit codes for GNU/Linux
地址:https://slg.ddnss.de/list-of-common-exit-codes-for-gnu-linux/【随笔】ssh登录时如何直接在参数中加入登录密码 - linxiong - 博客园
地址:https://www.cnblogs.com/linxiong945/p/4226211.htmlHow To Install sshpass on CentOS 8 | Installati.one
地址:https://installati.one/centos/8/sshpass/ssh登陆概率性失败,报错:kex_exchange_identification_86网络的技术博客_51CTO博客
地址:https://blog.51cto.com/86net/2452445OliveTin - Documentation
地址:https://docs.rockylinux.org/guides/automation/olivetin/server - bash: docker: command not found - Ask Ubuntu
地址:https://askubuntu.com/questions/1215020/bash-docker-command-not-found