OpenVPN Startskript führt einen Befehl nicht aus

OpenVPN Startskript führt einen Befehl nicht aus

Hintergrund: Ich konfiguriere Transmission (v2.93) und OpenVPN (v2.4.6) in einem Jail (einem FreeNAS 11.1-Plugin-Jail) und möchte --upOpenVPN ein Skript hinzufügen, das Transmission auffordert, seinen Abhörport zu ändern (mithilfe transmission-remoteeines Programms).

Mein openvpn.confenthält (unter anderem) Folgendes:

verb 4
script-security 2
up /usr/local/etc/openvpn/set_port.sh
up-restart ;only to make the up script be executed on restarts
           ;but disabling this changes nothing

und das set_port.shSkript enthält (ein minimales Skript, das das Verhalten dennoch reproduziert):

#!/usr/local/bin/bash
/usr/local/bin/transmission-remote --auth rpc_user:rpc_pass -p 6666 2>&1 > output.txt
echo 'the script itself runs: '$(pwd) $(whoami) > status.txt

Das Skript hat alle Berechtigungen (777) und die Binärdatei ( transmission-remote) hat alle Berechtigungen. Mir ist bewusst, dass der Pfad zur Binärdatei eigentlich ein Softlink ist, also habe ich ihn durch den tatsächlichen Pfad ( /usr/pbi/transmission-amd64/.sbin/transmission-remote) ersetzt, aber das Verhalten, das ich beobachte, ist dasselbe.

Problem: wenn ich OpenVPN ( ) starte service openvpn start,das Skript selbstwird ausgeführt, aber der eigentliche Befehl schlägt auf mysteriöse Weise fehl: Der Port wird nicht zugewiesen (überprüft durch DurchsehenTransmission Remote-Benutzeroberflächeund der Befehl erzeugt eine leere Ausgabe.
Der Inhalt der Debugdateien ist wie folgt:
output.txtist leer (mit und ohnestderrUmleitung)
status.txtsagt wie erwartet: the script itself runs: /usr/local/etc/openvpn root.

Wenn ich dieses Skript jedoch manuell ausführe ( ./set_port.sh), wird der Befehl erfolgreich abgeschlossen: output.txtwird angezeigt localhost:9091/transmission/rpc/ responded: "success"und der Port wird geändert.

Was vermisse ich?

ÄhnlichZudiese Frage, außer dass ich keine „Zugriff verweigert“-Meldungen bekomme – es scheint, als würde der Befehl nicht einmal ausgeführt (wenn ich echo $(<that command>) > file.txt, bekomme ich eine leere Datei).
Dieses hierist auch in gewisser Weise verwandt, aber der OP fragt danach --client-connectund löst das Problem letztendlich, indem er die vollständigen Pfade zu den Programmen angibt, die er ausführen möchte – dies hat in meinem Fall nicht geholfen (aber wenn ich es tue echo $(ls /usr/local/bin) > log.txt, ist die Liste der Binärdateien korrekt).

Aktualisierengemäß der Anfrage von @roaima. Ich habe es set_port.shwie folgt geändert:

#!/usr/local/bin/bash
exec >debug.txt 2>&1
set -x
echo script is running
/usr/pbi/transmission-amd64/.sbin/transmission-remote  --auth rpc_user:rpc_pass -p 6666 2>&1 > output.txt

dann gespült und wiederholt. Die debug.txtDatei enthielt diese Zeilen:

+ echo script is running
script is running
+ /usr/pbi/transmission-amd64/.sbin/transmission-remote --auth rpc_user:rpc_pass -p 12345
/usr/local/etc/openvpn/test.sh: line 5:  6795 Segmentation fault      /usr/pbi/transmission-amd64/.sbin/transmission-remote --auth rpc_user:rpc_pass -p 12345 2>&1 > output.txt

Antwort1

Blick auf die Linie

/usr/local/etc/openvpn/test.sh: line 5:  6795 Segmentation fault      /usr/pbi/transmission-amd64/.sbin/transmission-remote --auth rpc_user:rpc_pass -p 12345 2>&1 > output.txt

Es sieht so aus, als ob Ihre ausführbaren Dateien nicht übereinstimmende Bibliotheken haben. Bitte überprüfen Sie noch einmal, wie Sie Ihr Chroot erstellt haben. (Ich habe FreeBSD jahrelang nicht verwendet, daher kann ich Ihnen leider keine Hinweise dazu geben.)

Antwort2

Ich habe keine Ahnung von der Bibliotheksfehlanpassung, die hier auftritt, insbesondere, dass alles in einem FreeNAS-Plugin-Jail passiert und ich nicht weiß, wie es konfiguriert ist. Ich habe es jedoch geschafft, das Problem zu umgehen, um das Ziel zu erreichen, OpenVPN Transmission beim Route-Up konfigurieren zu lassen.
Notiz: Die folgende Antwort löst das Problem des Segmentierungsfehlers NICHT, daher werde ich sie nicht als akzeptiert markieren.

Die Lösung basiert auf der folgenden Beobachtung: transmission-remoteBei Aufruf durch OpenVPN trat ein Segmentierungsfehler auf, bei Aufruf durch OpenVPN lief es jedoch einwandfrei cron:

  1. Lass es openvpn.confwie es ist.

  2. Speichern Sie in set_port.shstatt des Aufrufs transmission-remotedie Portnummer in einer Datei, beispielsweise so: echo $port > $path/port-id(von hier an gehe ich davon aus, dass die Variable pathzu dem Ordner führt, in dem wir die Skripte usw. speichern.)

  3. Erstellen Sie ein neues Skript, nennen wir es actually_set.sh, mit Folgendem:

#!/usr/local/bin/bash
if [ -f $path/port-id ]; then
  port=$(cat $path/port-id)
  rm $path/port-id
  transmission-remote -n 'rpc_user:rpc_pass' -p $port
fi
  1. Stellen Sie es so ein cron, dass das obige Skript jede Minute aufgerufen wird. Ich habe Folgendes in meine Crontab eingegeben:
    * * * * * /usr/local/etc/openvpn/ports/tp_setter.sh

Antwort3

Wenn Sie Ihren verbLevel auf 3-4 setzen, sollten Sie wahrscheinlich Warnungen über nicht ausgeführte Skripte sehen. Standardmäßig ruft OpenVPN 2.2+ nur bestimmte integrierte Funktionen auf. Sie müssen dies lockern mitscript-security:

--script-security level

Diese Anweisung bietet Kontrolle auf Richtlinienebene über die Nutzung externer Programme und Skripte durch OpenVPN. Niedrigere Werte sind restriktiver, höhere Werte sind freizügiger.

Einstellungen für den Pegel:

0– Strikt kein Aufrufen externer Programme.
1– (Standard) Nur integrierte ausführbare Dateien wie ifconfig, ip, route oder netsh aufrufen.
2– Aufrufen integrierter ausführbarer Dateien und benutzerdefinierter Skripte zulassen.
3– Übergabe von Passwörtern an Skripte über Umgebungsvariablen zulassen (potenziell unsicher).

Sie müssen sicherstellen, dass Sie script-security2 oder 3 eingestellt haben (2, wenn Sie keine Passwörter an das Skript senden müssen, andernfalls 3).

verwandte Informationen