
Hintergrund: Ich konfiguriere Transmission (v2.93) und OpenVPN (v2.4.6) in einem Jail (einem FreeNAS 11.1-Plugin-Jail) und möchte --up
OpenVPN ein Skript hinzufügen, das Transmission auffordert, seinen Abhörport zu ändern (mithilfe transmission-remote
eines Programms).
Mein openvpn.conf
enthä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.sh
Skript 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.txt
ist leer (mit und ohnestderrUmleitung)
status.txt
sagt 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.txt
wird 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-connect
und 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.sh
wie 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.txt
Datei 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-remote
Bei Aufruf durch OpenVPN trat ein Segmentierungsfehler auf, bei Aufruf durch OpenVPN lief es jedoch einwandfrei cron
:
Lass es
openvpn.conf
wie es ist.Speichern Sie in
set_port.sh
statt des Aufrufstransmission-remote
die Portnummer in einer Datei, beispielsweise so:echo $port > $path/port-id
(von hier an gehe ich davon aus, dass die Variablepath
zu dem Ordner führt, in dem wir die Skripte usw. speichern.)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
- 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 verb
Level 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-security
2 oder 3 eingestellt haben (2, wenn Sie keine Passwörter an das Skript senden müssen, andernfalls 3).