OliveTin is a web interface for running Linux shell commands.



project logo

OliveTin is a web interface for running Linux shell commands.

Discord Go Report Card

Some example use cases;

  1. Give controlled access to run shell commands to less technical folks who cannot be trusted with SSH. I use this so my family can podman restart plex without asking me, and without giving them shell access!
  2. Great for home automation tablets stuck on walls around your house - I use this to turn Hue lights on and off for example.
  3. Sometimes SSH access isn't possible to a server, or you are feeling too lazy to type a long command you run regularly! I use this to send Wake on Lan commands to servers around my house.

Join the community on Discord.

YouTube video demo (6 mins)

6 minute demo video


  • Responsive, touch-friendly UI - great for tablets and mobile
  • Super simple config in YAML - because if it's not YAML now-a-days, it's not "cloud native" :-)
  • Dark mode - for those of you that roll that way.
  • Accessible - passes all the accessibility checks in Firefox, and issues with accessibility are taken seriously.
  • Container - available for quickly testing and getting it up and running, great for the selfhosted community.
  • Integrate with anything - OliveTin just runs Linux shell commands, so theoretially you could integrate with a bunch of stuff just by using curl, ping, etc. However, writing your own shell scripts is a great way to extend OliveTin.
  • Lightweight on resources - uses only a few MB of RAM and barely any CPU. Written in Go, with a web interface written as a modern, responsive, Single Page App that uses the REST/gRPC API.
  • Good amount of unit tests and style checks - helps potential contributors be consistent, and helps with maintainability.


Desktop web browser;

Desktop screenshot

Desktop web browser (dark mode);

Desktop screenshot

Mobile screen size (responsive layout);

Mobile screenshot


All documentation can be found at http://olivetin.app . This includes installation and usage guide, etc.

Example config.yaml

Put this config.yaml in /etc/OliveTin/ if you're running a standard service, or mount it at /config if running in a container.

listenAddressWebUI: # Listen on all addresses available, port 1337
logLevel: "INFO"
- title: Restart Plex
  icon: smile
  shell: docker restart plex
  # This will send 1 ping 
- title: Ping Google.com
  shell: ping google.com -c 1
  # Restart lightdm on host "overseer"
- title: restart lightdm
  icon: poop
  shell: ssh [email protected] 'service lightdm restart'

A full example config can be found at in this repository - config.yaml.

  • [BUG] Error getting initial buttons

    [BUG] Error getting initial buttons

    Describe the bug Error getting initial buttons is displayed when opening the web ui. TypeError: NetworkError when attempting to fetch resource.

    To Reproduce Build with docker-compose

    version: "2.1"
        image: jamesread/olivetin
        container_name: olivetin
        restart: unless-stopped
          - PUID=1000
          - PGID=1000
          - TZ=America/
          - /olivetin:/config
          - "traefik.enable=true"
          - "traefik.http.routers.olivetin.rule=Host(`olivetin.example.com`)"
          - "traefik.http.routers.olivetin.entrypoints=websecure"
          - "traefik.http.routers.olivetin.tls=true"
          # Uncomment to fetch Let's Encrypt certificates.
          # Make sure you set up DNS records and they point to your IP.
          - "traefik.http.routers.olivetin.tls.certresolver=letsencrypt"
          name: traefik_default

    Expected behavior Page should launch with 1 button as per the config.yaml

    Screenshots image

    type: bug type: support 
    opened by Seversonic 21
  • ARM binaries not working on older Pi Zero W

    ARM binaries not working on older Pi Zero W

    Trying to run the current OliveTin_2021-11-19_linux_armv7.deb on an older Pi Zero W with Debian Stretch doesn't work and just returns an "Illegal instruction" message. The last releases which worked where the older armv6 packages.

    So I went ahead and built from source which does produce a working binary. What I do miss is a make target or something to turn this into a .deb package, though?

    Also, manually copying the new OliveTin binary over an old installation lets me start the server, but then returns a "TypeError: json.actions is undefined" on the web UI. This runs with an existing config.yaml, but I don't see any breaking changes there which would explain that message.

    type: bug type: support progress: need-feedback progress: next-release progress: code-done 
    opened by arminus 13
  • `dnf install` should be run as supeuser inside container

    `dnf install` should be run as supeuser inside container

    Describe the bug When trying to install docker inside olivetin it is not possible due to lack of superuser permissions.

    To Reproduce

    1. Install olivetin using dockerfile
    2. Perform additional steps for docker. (Tweaked the dockerfile instead)
    3. run docker exec -it olivetin dnf install -y docker Error: This command has to be run with superuser privileges (under the root user on most systems). or
    4. run docker exec -it olivetin sudo dnf install -y docker [sudo] password for olivetin:

    Expected behavior Should install docker

    Additional context

    version: "2.1"
        container_name: olivetin
        image: jamesread/olivetin 
          - /srv/dev-disk-by-uuid-d2287285-5827-439a-bc32-7c8ad314eacf/Config/OliveTin:/config:ro
          - /var/run/docker.sock:/var/run/docker.sock
          - "1337:1337"
        restart: unless-stopped

    Running inside Portainer 2.6.1 on Openmediavault 5.6.7-1

    $ uname -a
    Linux rockpi 5.10.35-rockchip64 #21.05.1 SMP PREEMPT Fri May 7 13:53:11 UTC 2021 aarch64 GNU/Linux

    Suggestion: If you don't want to run the container as root, what about adding something like olivetin ALL=(ALL) /usr/bin/dnf in /etc/sudoers?

    type: support 
    opened by inknos 11
  • Disable the

    Disable the "Actions" and "Logs" buttons

    Is your feature request related to a problem? Please describe. For non tech. people to provide as few buttons as possible.

    Describe the solution you'd like It would be nice to disable the "Actions" and "Logs" buttons on the top of the page to make it as clean as possible. In config.yaml something like navigation: disable.

    Additional context I equipped my parents in law with a raspberry running kodi. Every now and then kodi hangs and the only option for them on their own is to power cycle the pi. The more elegant solution would be to just restart the service, for which I haven't found an elegant solution for non technical people until I stumbled upon OliveTin. This will be a website-link on their phones open the site with only one button "Restart Kodi".

    type: feature-request progress: code-done 
    opened by efelon 9
  • Arm64 / armv7 docker image?

    Arm64 / armv7 docker image?

    Hi, your project looks really promising and would be very useful for lots of people running SBCs as servers. However at the moment there is no docker image for these platforms. If you could create one that would be awesome!

    type: feature-request progress: code-done 
    opened by kjboa 8
  • Task arguments

    Task arguments

    It would be nice to trigger a task with a arguments, such a light brightness, custom timeouts, or similar.

    Describe the solution you'd like Available to be set on a per action basis, the ability to specify a couple of arguments.

    There are considerable security implications of doing this though - you're basically giving free SSH access to a server if the arguments are abused.

    Additional context Originally requested by Luca Heitmann here; https://youtu.be/Ej6NM9rmZtk

    Current status

    • [x] Get the UI to send these values back to the server when starting the action
    • [x] Find/Replace variable names (ie, actually use them) on exec
    • [x] Fix behavior for undefined variables, unused variables, etc
    • [x] A type system for variables, with several safe/unsafe helpers (ie string_identifier, string_raw_unsafe)
    • [x] Code audit for style, cyclo, fmt, etc.
    • [ ] Test the hell out of it


    Feedback is most welcome, even if it's just a :+1: on this comment to indicate you're interested in the feature.

    type: feature-request progress: need-feedback progress: code-done needs: integration-test 
    opened by jamesread 7
  • --config flag

    --config flag

    As per the documentation on how to set up multiple instances, I'd like to suggest the addition of a feature that could make the process even simpler: a flag (tentatively called config, but the name is irrelevant) that allows to specify the location of the config.yaml when this is not in the default directory.

    For example, in order to create a second OliveTin instance, all I'd have to do would be to place a second config.yaml in /home/myuser/OliveTin2, and then call the executable located in /usr/local/bin/OliveTin with this service file:

    ExecStart=/usr/local/bin/OliveTin --config /home/myuser/OliveTin2/config.yaml

    This differs from the method in the documentation in that it doesn't need to use a different copy of the executable for each instance, as it can use one executable for all instances; including the one installed in the default location by the .deb/.rpm installer.

    It'd also allow to give the config.yaml any name, which would make possible to have multiple configuration files in the same directory (for example, I could have /home/myuser/OliveTin_configs with files called config2.yaml, config3.yaml, etc.).

    And even though it's possible to do something similar simply by specifying a WorkingDirectory in the service file, this is a more cross-OS method. For example, if I was using Windows, I could make a shortcut that called the executable this way:

    C:\Program Files\OliveTin\OliveTin.exe --config C:\Users\MyUser\OliveTin2\config.yaml

    Or it could be used for distros that don't use systemd, or if for some reason I can't or don't want to use a service file; for example, if I'm running it on a machine where I don't have root permissions (the latter could be paired with a webUIDirectory option in the config.yaml that similarly allows to choose a different location for the web files, but that's independent from this suggestion).

    type: feature-request progress: next-release 
    opened by ManuelFte 6
  • Apple touch icon support

    Apple touch icon support

    Is your feature request related to a problem? Please describe.

    Apple devices rely on a separate metadata description for "touch icons".


    Originally requested by ScrumpyJack on discord.

    type: feature-request progress: code-done 
    opened by jamesread 6
  • Standard naming convention for releases

    Standard naming convention for releases

    Is your feature request related to a problem? Please describe. Don't include version name in releases. Tag based release identifiers make it easy to curl latest package in a script

    Describe the solution you'd like Rather than release named OliveTin_2022-04-07_linux_amd64.deb, it should be OliveTin_linux_amd64.deb

    Additional context Follow a standard naming convention for release names since tags serve as release number. For practical representation, refer to Adguard Home's release page

    type: feature-request 
    opened by Hudater 5
  • Document HTTP API for use with 3rd party apps

    Document HTTP API for use with 3rd party apps

    Cool app. Excited to see where it goes.

    My request is to document the API so other users can easily integrate with 3rd party apps, For example, I'm using it in combination with HTTP Request Shortcuts so I can place OliveTin actions right on my homescreen.

    Current API seems simple enough. Actions can be triggered by POSTing to http://<HOST>/api/StartAction with the following request

    {"actionName":"Start transmission-daemon","arguments":[]}
    type: documentation type: feature-request 
    opened by mill1000 5
  • user interaction with the script

    user interaction with the script

    Interaction with the bash script All is good with 'fire and forget' actions with no parameter. There are other very interesting scenarios which require some form of interaction. Can we use OliveTin in those cases?

    My OliveTin is OliveTin_2021-07-19_linux_amd64.deb, running in ubuntu 20.04 My script is of the type 'sudo bashcommand', how do I send the user's password? The action complete without errors but the log show nothing. Can I find docs for this type of script?

    More generally, how do I allow a script to accept user input and continue processing? I have scripts which require input from user in the middle of processing: can I interact with the script in some way?

    Thank you for your help

    type: support 
    opened by fpirri 5
  • OliveTin phones home to developers with PII without consent

    OliveTin phones home to developers with PII without consent


    The "update check" is enabled by default. This misleadingly named surveillance feature will phone home to the developers of the software at http://update-check.olivetin.app:


    It's not just checking for updates. It sends to the server personally identifying information (PII), something called an "installation ID", which persists between launches:


    This network-based surveillance is not disclosed to the user and happens without first obtaining consent from the user. The user's PII is transmitted automatically.

    type: question 
    opened by sneak 6
  • Feature request: run scripts at startup

    Feature request: run scripts at startup

    Is your feature request related to a problem? Please describe. OliveTin doesn't always include the executables I'd like to run.

    Describe the solution you'd like I'd really like the ability to automatically run scripts when OliveTin is started, sort of like how the LinuxServer containers have implemented. This would allow me to install executables within the container each time it's rebuilt.

    I used this with another Docker image I used up until recently - I needed some additional stuff installed, so I wrote a small script to install the extras each time the container was rebuilt.

    Describe alternatives you've considered For now, I can do this manually, or script it myself when building the container.

    Additional context #89 made me think of this - instead of having to include docker compose in the image, it'd be really great if I could just install it myself, automatically, each time the container is built. This would keep the image small and free of additional security issues, depending on what users might want to have installed.


    opened by flammable 3
  • Add `docker compose` to docker images by default

    Add `docker compose` to docker images by default

    I really appreciate that docker is pre-installed in the images. It would be even better, if the docker compose plugin was installed as well.

    This would allow simple compose based services to be restarted etc.. i.e. shell: docker compose up -d

    Based on the official docker docs this works:

    mkdir -p /usr/local/lib/docker/cli-plugins
    curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \
     -o /usr/local/lib/docker/cli-plugins/docker-compose
    chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

    This could be added to the RUN "install"command in the Dockerfiles.

    type: feature-request progress: need-feedback 
    opened by Crydsch 5
  • Switch from

    Switch from "-" in version to standard "." in version.

    This issue will track it.

    • [ ] Check Arch
    • [ ] Check the download script
    • [ ] Check docs pages
    • [ ] Check name of folder in tar.gz and zip
    • [ ] Check release notes template
    type: documentation 
    opened by jamesread 0
  • Superfluous log messages

    Superfluous log messages

    Describe the bug Todo:

    Jwt warnings User from context

    To Reproduce Steps to reproduce the behavior:

    1. Go to '...'
    2. Click on '....'
    3. Scroll down to '....'
    4. See error

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Additional context Add any other context about the problem here.

    opened by jamesread 1
  • Status command

    Status command

    Hi, awesome project, btw.

    Would be great to have status/health check command that would be running with configurable interval.

    For example if you have command

    systemctl restart service

    it would be beneficial to display status inside olive tin. Using old good:

    systemctl status service

    p.s. I prefer to write PRs and not issues. But I’m not skilled in Go, so it is what it is

    opened by slavaGanzin 3
OliveTin is a simple web interface for running Linux shell commands.
Gsshrun - Running commands via ssh on the server/hosting (if ssh support) specified in the connection file

Gsshrun - Running commands via ssh on the server/hosting (if ssh support) specified in the connection file

Məhəmməd 2 Sep 8, 2022
Automatically spawn a reverse shell fully interactive for Linux or Windows victim

Girsh (Golang Interactive Reverse SHell) Who didn't get bored of manually typing the few lines to upgrade a reverse shell to a full interactive revers

null 286 Dec 14, 2022
fbstatus graphically shows the gokrazy system status on the Linux frame buffer, which is typically available via HDMI when running on a Raspberry Pi or a PC.

gokrazy framebuffer status (fbstatus) fbstatus graphically shows the gokrazy system status on the Linux frame buffer, which is typically available via

null 14 Aug 4, 2022
A LoRaWAN nodes' and network simulator that works with a real LoRaWAN environment (such as Chirpstack) and equipped with a web interface for real-time interaction.

LWN Simulator A LoRaWAN nodes' simulator to simulate a LoRaWAN Network. Table of Contents General Info Requirements Installation General Info LWN Simu

ARSLab 33 Nov 20, 2022
A pure Unix shell script implementing ACME client protocol

An ACME Shell script: acme.sh An ACME protocol client written purely in Shell (Unix shell) language. Full ACME protocol implementation. Support ACME v

acme.sh 29.8k Jan 2, 2023
Golang Reverse Shell

goReverseShell First ever GO project aimed to learn GO basics. PoC of a GO reverse shell, not expected to be used in real conditions. Undetected by AV

null 4 Jul 21, 2022
Simple reverse shell to avoid Windows defender and kaspersky detection

Windows-ReverseShell Simple reverse shell to avoid Windows defender, kaspersky d

赵公子 14 Oct 19, 2022
A simple Chat software from within the Shell

directChat A simple Chat software from within the Shell Usage Build The client a

Lorenzo 1 Dec 24, 2021
Reverse Shell in Golang and PowerShell Fud (27/04/2022)

ShellPwnsh Spanish: Generador de Backdoor en Golang, usando Reverse Shell en PowerShell, con formato de variables en el codigo para Bypass de AMSI y c

Black$hell256 10 Nov 9, 2022
Go Library to Execute Commands Over SSH at Scale

vSSH Go library to handle tens of thousands SSH connections and execute the command(s) with higher-level API for building network device / server auto

Yahoo 882 Dec 9, 2022
🤘 The native golang ssh client to execute your commands over ssh connection. 🚀🚀

Golang SSH Client. Fast and easy golang ssh client module. Goph is a lightweight Go SSH client focusing on simplicity! Installation ❘ Features ❘ Usage

Mohamed El Bahja 1.2k Dec 24, 2022
red-tldr is a lightweight text search tool, which is used to help red team staff quickly find the commands and key points they want to execute, so it is more suitable for use by red team personnel with certain experience.

Red Team TL;DR English | 中文简体 What is Red Team TL;DR ? red-tldr is a lightweight text search tool, which is used to help red team staff quickly find t

倾旋 182 Jan 5, 2023
A golang library about socks5, supports all socks5 commands. That Provides server and client and easy to use. Compatible with socks4 and socks4a.

socks5 This is a Golang implementation of the Socks5 protocol library. To see in this SOCKS Protocol Version 5. This library is also compatible with S

chenhao zhang 40 Nov 22, 2022
Run commands on remote hosts, inspecting key indicators to manage infrastructure

inspector This is a very basic ssh helper tool to manage a smaller (few 100s up to a few 1000s) fleet of servers. The main point of inspector is to pr

null 17 Mar 3, 2022
parse-curl.js golang version. Parse curl commands, returning an object representing the request.

parse-curl.js golang version. Parse curl commands, returning an object representing the request.

StarBus 4 Nov 1, 2022
Helps you to send ssh commands to target machine in your local network from outside via gRPC

rpc-ssh In case, you don't want to make your ssh port accessible from outside local network. This repository helps you to send ssh commands to target

Berkay Akyazı 2 Nov 16, 2022
Lightweight rest api that allows users to run Powershell commands over HTTP.

Powershell Proxy Lightweight rest api that allows users to run Powershell commands over HTTP. Requests require a valid JWT and responses are returned

Thomas Sampson 4 Mar 18, 2022
iflandown runs commands after the wired LAN link is down for a given amount of time.

iflandown iflandown runs commands after the wired LAN link is down for a given amount of time. All/most linux devices should work. Tested on amd64, Ra

null 1 Mar 16, 2022
An util to bypass clash-premium tun for commands

without-clash An util to bypass clash-premium tun for commands Requirement Kernel Features: cgroup2 ebpf && cgroup2 sock attach point iproute2 Install

Kr328 15 Dec 19, 2022