• OliveTin能在网页上安全运行shell命令(上)


    昨天下午突然接到居委会的通知,晚上 7 点全员筛查。看意思这两天应该还会再有一次


    网友 figo 问:有没有什么软件或者docker能够一键关机和一键重启Linux主机?而不用打开命令行去执行命令。,老苏第一时间就想起了在计划列表中躺了很久的 OliveTin,之所以迟迟不动是因为没想好用来做什么。等真正开始折腾的时候才发现,OliveTin 比想象中遇到的问题多,居然跑官方的示例都能遇到坑,可能是因为采用了 docker 方式在 群晖 上运行的缘故,这反而激发了老苏的兴趣。

    什么是 OliveTin ?

    OliveTin 可让您从 Web 界面安全且简单地访问预定义的 shell 命令。

    在这里插入图片描述

    准备

    首先要准备 config.yaml 文件,最简单的当然是复制官方的示例文档,可以复制粘贴,也可以另存为。https://raw.githubusercontent.com/OliveTin/OliveTin/main/config.yaml

    Action

    一个标准的 action (我们可以理解为按钮)包含👇几个部分:

    • title:标题,这是必填的,用来标识 action
    • shell:脚本,也是必填的,用来执行具体的任务;
    • icon:图标,这个是非必须的,但是有的话看起来会比较舒服,除了图片外,还支持 https://unicode-table.com/en/emoji/emoji
    • arguments:参数,这个是非必须的,可以用来实现一些变量,让 shell 具有一定的灵活性;
    • timeout:超时,这个也是非必须的;

    所以综合来看,一个按钮只要 titleshell 就可以了,举个最简单的完整的 config.yaml 例子

    # 侦听端口
    listenAddressSingleHTTPFrontend: 0.0.0.0:1337 
    
    # 日志级别:INFO (default), WARN 和 DEBUG
    logLevel: "INFO"
    
    # 显示新版本
    showNewVersions: true
    
    # Actions (buttons) to show up on the WebUI:
    actions:  
    # 从最简单的开始
    - title: 运行echo
      icon: "📝"
      shell: echo "我是老苏."
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    你也可以用这个作为 config.yaml,让容器先运行起来再来修改、完善和丰富功能。

    安装

    在群晖上以 Docker 方式安装。

    在注册表中搜索 olivetin ,选择第一个 jamesread/olivetin,版本选择 latest

    容器名称

    因为后面还要通过命令行进入容器,建议将容器名称改为 olivetin,当然这不是必须的,你也可以直接改命令行里的容器名称

    在这里插入图片描述

    docker 文件夹中,创建一个新文件夹 olivetin

    文件夹装载路径说明
    docker/olivetin/config存放设置

    建议勾选 只读

    端口

    本地端口不冲突就行,不确定的话可以用命令查一下

    # 查看端口占用
    netstat -tunlp | grep 端口号
    
    • 1
    • 2
    本地端口容器端口
    13371337

    在这里插入图片描述

    命令行安装

    如果你熟悉命令行,可能用 docker cli 更快捷

    # 新建文件夹 kavita 和 子目录
    mkdir -p /volume2/docker/olivetin
    
    # 进入 kavita 目录
    cd /volume2/docker/olivetin
    
    # 上传 config.yaml 文件到当前目录下
    
    # 运行容器
    docker run -d \
       --restart unless-stopped \
       --name olivetin \
       -p 1337:1337 \
       -v $(pwd):/config:ro \
       jamesread/olivetin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    也可以用 docker-compose 安装,下面是官方提供的 docker-compose.yml,注意修改路径

    version: "3.8"
    
    services:
      olivetin:
        container_name: olivetin
        image: jamesread/olivetin
        volumes:
          - ./:/config # replace host path or volume as needed
        ports:
          - "1337:1337"
        restart: unless-stopped
    
    networks:
      web:
      section:
        external: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然后执行下面的命令,因为采用了相对路径,在 portainer 中执行也是可以的

    # 新建文件夹 kavita 和 子目录
    mkdir -p /volume2/docker/olivetin
    
    # 进入 kavita 目录
    cd /volume2/docker/olivetin
    
    # 将 docker-compose.yml 和 config.yaml 放入当前目录
    
    # 一键启动
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行

    在浏览器中输入 http://群晖IP:1337 就能看到主界面

    这是官方 config.yaml 的界面

    如果你用了老苏的最小化示例,则只有一个按钮,我们点击 运行echo 按钮

    会显示 [Success]

    详细的信息可以在右上角的 Logs 中查看

    在这里插入图片描述

    遗留问题

    问题1:权限

    官方有个 ping 的示例,考虑到国内不能访问 google,所以老苏把目标地址改为了 baidu

    actions:
        # This sends 1 ping to baidu.com.
      - title: ping baidu.com
        shell: ping baidu.com -c 4
        icon: ping
        timeout: 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    默认情况下,你会遇到 ping: usage error: Destination address required

    而如果你将 shell 改为 sudo ping baidu.com -c 1 时,会需要你输入 password for olivetin,所以唯一的办法是 docker cli 下执行容器增加 --user=root 或者 --privileged

    # 用 root 运行容器
    docker run -d \
       --restart unless-stopped \
       --name olivetin \
       --user=root \
       -p 1337:1337 \
       -v $(pwd):/config:ro \
       jamesread/olivetin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    问题2:ssh密码

    官方也提供了 ssh 的示例,老苏做了调整

    ssh 登录主机的身份可以是用 root 或者其他任何有权限的账号,这里只是为了演示,一般不建议直接用 root

    actions:
    - title: 登录到 ds3617xs ping 百度
      shell: ssh root@192.168.0.197 'ping baidu.com -c 4'
      icon: "📌"
      timeout: 50
    
    • 1
    • 2
    • 3
    • 4
    • 5

    执行 ssh 并不需要 root 权限, 但因为不能在命令行直接输入密码,所以会导致超时

    或者 Exit code 255

    官方提供的思路是用 SSH 密钥设置无密码登录,但老苏觉得这种方式不够灵活。

    老苏想到了一种又比较灵活,但是又相对安全的解决办法,敬请期待~

    周五,不见不散!

    参考文档

    OliveTin/OliveTin: OliveTin gives safe and simple access to predefined shell commands from a web interface.
    地址:https://github.com/OliveTin/OliveTin

    OliveTin - give safe and simple access to predefined shell commands from a web interface
    地址:https://www.olivetin.app/

    OliveTin documentation
    地址:https://docs.olivetin.app/

    List of common exit codes for GNU/Linux
    地址:https://slg.ddnss.de/list-of-common-exit-codes-for-gnu-linux/

  • 相关阅读:
    Dubbo 动态调用 group
    DolphinScheduler V3.1.8 海豚调度器【概述、安装、功能介绍、项目运用、邮箱预警设置】轻松拿捏!
    盘点52个Python各行各业管理系统源码Python爱好者不容错过
    TypeScripe笔记:any、unknown、never、void、null 和 undefined 及其比较
    TransReID | 首次将transformer应用于行人重识别
    PTA题目集(Java语言)
    如何给PDF文件设置打印限制?
    【图像处理笔记】SIFT算法原理与源码分析
    1023 组个最小数
    《Webpack 5 基础配置》- 禁止在出现编译错误或警告时,覆盖浏览器全屏显示
  • 原文地址:https://blog.csdn.net/wbsu2004/article/details/125632874