
Фон: Я настраиваю Transmission (v2.93) и OpenVPN (v2.4.6) в jail (плагин-джейл FreeNAS 11.1) и хочу добавить скрипт --up
в OpenVPN, который будет запрашивать у Transmission смену порта прослушивания (с помощью transmission-remote
программы).
Мой openvpn.conf
содержит следующее (среди прочего):
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
и set_port.sh
скрипт содержит (минимальный скрипт, который все еще воспроизводит поведение):
#!/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
Скрипт имеет все разрешения (777), а двоичный файл ( transmission-remote
) имеет все разрешения. Я знаю, что путь к двоичному файлу на самом деле является мягкой ссылкой, поэтому я заменил его на фактический путь ( /usr/pbi/transmission-amd64/.sbin/transmission-remote
), но поведение, которое я наблюдаю, то же самое.
Проблема: когда я запускаю OpenVPN ( service openvpn start
),сам сценарийвыполняется, но сама команда по непонятной причине завершается ошибкой: порт не назначается (проверено путем просмотраГрафический интерфейс удаленного управления трансмиссиейи команда генерирует пустой вывод.
Содержимое отладочных файлов следующее:
output.txt
пусто (с и безstderrперенаправление)
status.txt
говорит, как и ожидалось: the script itself runs: /usr/local/etc/openvpn root
.
Однако, когда я запускаю этот скрипт вручную ( ./set_port.sh
), указанная команда завершается успешно: и порт будет изменен output.txt
.localhost:9091/transmission/rpc/ responded: "success"
Что я упускаю?
Похожийкэтот вопрос, за исключением того, что я не получаю никаких сообщений об отказе в доступе - похоже, что команда даже не выполняется (если я echo $(<that command>) > file.txt
, я получаю пустой файл).
Вот этоттоже в некоторой степени связано, но автор вопроса спрашивает об этом --client-connect
и в конечном итоге решает проблему, прописывая полные пути к программам, которые он хочет запустить - в моем случае это не помогло (но если я правильно понял echo $(ls /usr/local/bin) > log.txt
, список двоичных файлов правильный).
Обновлятьпо просьбе @roaima. Я изменил set_port.sh
на следующее:
#!/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
затем прополоскал и повторил. debug.txt
Файл содержал следующие строки:
+ 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
решение1
Глядя на линию
/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
Похоже, что ваши исполняемые файлы имеют несоответствующие библиотеки. Пожалуйста, проверьте еще раз, как вы построили свой chroot. (Я не использовал FreeBSD много лет, поэтому не могу дать вам указания, как это сделать, извините.)
решение2
Я понятия не имею о несоответствии библиотек, которое здесь происходит, особенно учитывая, что все это происходит в "plugin jail" FreeNAS, и я не знаю, как это настраивается. Однако мне удалось обойти эту проблему, чтобы добиться цели заставить OpenVPN настроить Transmission при route-up.
Примечание: следующий ответ НЕ решает проблему ошибки сегментации, поэтому я не собираюсь отмечать его как принятый.
Решение основано на следующем наблюдении: хотя transmission-remote
при вызове OpenVPN возникала ошибка сегментации, при вызове его вместо этого он работал отлично cron
:
Оставить
openvpn.conf
как есть.В
set_port.sh
, вместо вызоваtransmission-remote
, сохраните номер порта в файле - например, так:echo $port > $path/port-id
(далее я буду предполагать, что переменнаяpath
указывает на папку, где мы храним скрипты и т. д.)Создайте новый скрипт, назовем его
actually_set.sh
, со следующим содержимым:
#!/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
- Настроить
cron
вызов вышеуказанного скрипта каждую минуту. Я поместил следующее в свой crontab:
* * * * * /usr/local/etc/openvpn/ports/tp_setter.sh
решение3
Если вы установите verb
уровень 3-4, вы, вероятно, увидите предупреждения о том, что скрипты не выполняются. По умолчанию OpenVPN 2.2+ вызывает только определенные встроенные функции. Вам нужно ослабить это с помощьюscript-security
:
--script-security level
Эта директива предлагает контроль на уровне политики над использованием внешних программ и скриптов OpenVPN. Значения на более низком уровне более ограничительны, значения на более высоком уровне более разрешительны.
Настройки для уровня:
0
-- Строго запрещено вызывать внешние программы.
1
-- (По умолчанию) Вызвать только встроенные исполняемые файлы, такие как ifconfig, ip, route или netsh.
2
-- Разрешить вызов встроенных исполняемых файлов и пользовательских скриптов.
3
-- Разрешить передачу паролей в скрипты через переменные среды (потенциально небезопасно).
Вам необходимо убедиться, что вы установили script-security
значение 2 или 3 (2, если вам не нужно отправлять пароли в скрипт, 3 в противном случае).