Wololo 2

Auf dem Gerät, auf dem die Skripte ausgeführt werden sollen, legt man ein bis mehrere Wiedergabe-Skripte an:

#!/bin/sh
cvlc ~/Musik/Sounds/01Bruh.mp3 --play-and-exit

Auf dem Gerät, von dem aus die Skripte ausgeführt werden sollen, legt man ein bis mehrere Skripte an, die die zuvor erstellten Skripte aufrufen:

#!/bin/sh
sshpass -p "PASSWORD" ssh -o StrictHostKeyChecking=no user@host 'sh /path/to/cvlc-bruh.sh > /dev/null 2>%1 &'

Das wars, der Rest geschieht via Terminal.


Webinterface

Auf dem Gerät, auf dem die Skripte ausgeführt werden sollen, muss ein Webserver laufen; die folgende Datei dient als Beispiel für eine mögliche Konfiguration:

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="css/style.css">
  <link rel="icon" href="favicon.ico" type="image/x-icon">
  <link rel="apple-touch-icon" href="favicon.png">
  <title>¯\_(ツ)_/¯</title>
  <link rel="icon" href="https://wayne-intressierts.de/wp-content/uploads/2020/10/cropped-cropped-hal-157883_640.png" sizes="32x32" />
  <link rel="icon" href="https://wayne-intressierts.de/wp-content/uploads/2020/10/cropped-cropped-hal-157883_640.png" sizes="192x192" />
  <link rel="apple-touch-icon-precomposed" href="https://wayne-intressierts.de/wp-content/uploads/2020/10/cropped-cropped-hal-157883_640.png" />
<meta name="msapplication-TileImage" content="https://wayne-intressierts.de/wp-content/uploads/2020/10/cropped-cropped-hal-157883_640.png" />
</head>
<body>
  <div class="container">
    <h1>Soundboard</h1>
    
    <form method="get">
      <button type="submit" name="run" value="rbruh">Bruh</button>
      <button type="submit" name="run" value="rEmpörung">Empörung</button>
      <button type="submit" name="run" value="rfart">Furzgeräusch</button>
      <button type="submit" name="run" value="rHallo">Hallo IT</button>
      <button type="submit" name="run" value="rHello">Hello IT</button>
      <button type="submit" name="run" value="rOff-and-On">Off and On</button>
      <button type="submit" name="run" value="rAus-und-Ein">Aus- und Eingeschaltet</button>
      <button type="submit" name="run" value="rhuya">Huya!</button>
      <button type="submit" name="run" value="Intercom">Intercom</button>
    </form>
  </div>

<?php
if (isset($_GET['run'])) {
    switch ($_GET['run']) {
        case "rbruh":
            exec("/usr/local/bin/rbruh.sh");
            break;
        case "rEmpörung":
            exec("/usr/local/bin/rEmpörung.sh");
            break;
        case "rfart":
            exec("/usr/local/bin/rfart.sh");
            break;
        case "rHallo":
            exec("/usr/local/bin/rHallo.sh");
            break;
        case "rHello":
            exec("/usr/local/bin/rHello.sh");
            break;
        case "rOff-and-On":
            exec("/usr/local/bin/rOff-and-On.sh");
            break;
        case "rAus-und-Ein":
            exec("/usr/local/bin/rAus-und-Ein.sh");
            break;
        case "rhuya":
            exec("/usr/local/bin/rhuya.sh");
            break;
        case "Intercom":
            exec("/usr/local/bin/rIntercom.sh");
            break;
    }

    // Umleiten, damit beim Neuladen nicht nochmal ausgeführt wird
    header("Location: " . $_SERVER['PHP_SELF']);
    exit;
}
?>
</body>

Damit das etwas hübscher aussieht, ist hier noch eine style.css:

/* style.css */
body {
  background-color: #222;
  color: #eee;
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
}

.container {
  max-width: 500px;
  margin: 40px auto;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  padding: 20px;
}

h1 {
  font-size: 1.5em;
  margin-bottom: 0.5em;
}

label {
  display: block;
  margin-top: 1em;
  font-weight: bold;
}

input[type="text"] {
  width: 100%;
  padding: 8px;
  margin-top: 0.3em;
  margin-bottom: 1em;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 1em;
}

button {
  display: inline-block;
  padding: 10px 16px;
  font-size: 1em;
  color: #fff;
  background-color: #dd3333;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

button:hover {
  background-color: #d3d3d3;
}

pre.output {
  background: #eef2f7;
  padding: 15px;
  border-radius: 4px;
  white-space: pre-wrap;
  word-wrap: break-word;
  margin-top: 1em;
}

Rechteverteilung

(shell_)exec lässt sich als User problemlos ausführen, aber der User, in dessen Kontext der Webserver läuft, hat keine Rechte für den Zugriff auf den Audio-Output. Also braucht es pro Skript, das davon betroffen ist, einen Dienst unter

~/.config/systemd/user/rbruh.service

[Unit]
Description=Ab da Sound

[Service]
ExecStart=/usr/local/bin/rbruh.sh

Dann im PHP:

shell_exec('sudo -u [USERNAME] systemctl --user start rbruh.service');

In sudoers dafür:

www-data ALL=([USERNAME]) NOPASSWD: /usr/bin/systemctl --user start rbruh.service

Dämlicher Hack: PHP per „su -c“ tricksen (nicht zu empfehlen)

shell_exec('su - USER -c "/usr/local/bin/rbruh.sh"');

Problem: verlangt Passwort → funktioniert nicht ohne zusätzlichen sudoers‑Eintrag → dann kannst du auch gleich Variante 1 sauber machen.