
Fundo: Estou configurando o Transmission (v2.93) e o OpenVPN (v2.4.6) em uma prisão (uma prisão do plugin FreeNAS 11.1) e quero adicionar um --up
script ao OpenVPN que solicitará que o Transmission altere sua porta de escuta (usando transmission-remote
o programa).
My openvpn.conf
contém o seguinte (entre outros):
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
e o set_port.sh
script contém (um script mínimo que ainda reproduz o comportamento):
#!/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
O script possui todas as permissões (777) e o binário ( transmission-remote
) possui todas as permissões. Estou ciente de que o caminho para o binário é na verdade um link virtual, então substituí-o pelo caminho real ( /usr/pbi/transmission-amd64/.sbin/transmission-remote
), mas o comportamento que observo é o mesmo.
Problema: quando inicio o OpenVPN ( service openvpn start
),o roteiro em sié executado, mas o comando real falha misteriosamente: a porta não está sendo atribuída (verificada examinandoGUI remota de transmissãoe o comando gera uma saída vazia.
O conteúdo dos arquivos de depuração é o seguinte:
output.txt
está vazio (com e semstderrredirecionamento)
status.txt
diz como esperado: the script itself runs: /usr/local/etc/openvpn root
.
Porém, quando executo este script manualmente ( ./set_port.sh
), o referido comando é concluído com sucesso: output.txt
dirá localhost:9091/transmission/rpc/ responded: "success"
e a porta será alterada.
o que estou perdendo?
Semelhanteparaessa questão, exceto que não estou recebendo nenhuma mensagem de "permissão negada" - parece que o comando nem foi executado (se eu echo $(<that command>) > file.txt
receber um arquivo vazio).
Estetambém está um pouco relacionado, mas o OP está perguntando --client-connect
e eventualmente resolve o problema escrevendo caminhos completos para os programas que deseja executar - isso não ajudou no meu caso (mas se eu estiver echo $(ls /usr/local/bin) > log.txt
, a lista de binários está correta).
Atualizara pedido de @roaima. Eu mudei set_port.sh
para o seguinte:
#!/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
depois enxaguado e repetido. O debug.txt
arquivo continha estas linhas:
+ 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
Responder1
Olhando para a linha
/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
Parece que seus executáveis possuem bibliotecas incompatíveis. Verifique novamente como você construiu seu chroot. (Eu não uso o FreeBSD há anos e anos, então não posso lhe dar dicas sobre como fazer isso, desculpe.)
Responder2
Não tenho ideia da incompatibilidade de biblioteca que está acontecendo aqui, principalmente que tudo acontece em uma "prisão de plugins" do FreeNAS e não sei como ela está configurada. No entanto, consegui contornar o problema para atingir o objetivo de fazer com que o OpenVPN configure a transmissão na rota.
Observação: a resposta a seguir NÃO resolve o problema de falha de segmentação, portanto não vou marcá-la como aceita.
A solução é baseada na seguinte observação: embora transmission-remote
tenha falhado se for chamado pelo OpenVPN, ele funcionou perfeitamente se cron
chamado:
Deixe
openvpn.conf
como está.Em
set_port.sh
, em vez de chamartransmission-remote
, armazene o número da porta em um arquivo - por exemplo, assim:echo $port > $path/port-id
(daqui em diante assumirei que a variávelpath
leva à pasta onde armazenamos os scripts, etc.)Faça um novo script, vamos chamá-lo de
actually_set.sh
, com o seguinte:
#!/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
- Defina
cron
para chamar o script acima a cada minuto. Coloquei o seguinte no meu crontab:
* * * * * /usr/local/etc/openvpn/ports/tp_setter.sh
Responder3
Se você definir seu verb
nível como 3-4, provavelmente verá avisos sobre scripts que não estão sendo executados. Por padrão, o OpenVPN 2.2+ chama apenas alguns recursos integrados. Você precisa relaxar isso usandoscript-security
:
--script-security level
Esta diretiva oferece controle em nível de política sobre o uso de programas e scripts externos pelo OpenVPN. Valores de nível mais baixo são mais restritivos, valores mais altos são mais permissivos.
Configurações de nível:
0
-- Estritamente nenhuma chamada de programas externos.
1
-- (Padrão) Chame apenas executáveis integrados, como ifconfig, ip, route ou netsh.
2
-- Permite a chamada de executáveis integrados e scripts definidos pelo usuário.
3
-- Permitir que senhas sejam passadas para scripts por meio de variáveis ambientais (potencialmente inseguras).
Você precisa ter certeza de ter script-security
definido como 2 ou 3 (2 se não precisar enviar senhas para o script, 3 caso contrário).