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.