OpenVPN 시작 스크립트가 명령을 실행하지 않습니다

OpenVPN 시작 스크립트가 명령을 실행하지 않습니다

배경: 저는 감옥(FreeNAS 11.1 플러그인 감옥)에서 Transmission(v2.93)과 OpenVPN(v2.4.6)을 구성하고 있으며 --upTransmission의 청취 포트를 변경하도록 요청하는 OpenVPN에 스크립트를 추가하고 싶습니다( 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,스크립트 자체실행되었지만 실제 명령이 이상하게도 실패했습니다. 포트가 할당되지 않았습니다(다음을 통해 확인).전송 원격 GUI명령은 빈 출력을 생성합니다.
디버그 파일의 내용은 다음과 같습니다:
output.txt비어 있음(포함 및 제외)표준 오류리디렉션)
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빈 파일이 표시됩니다).
이 하나또한 어느 정도 관련이 있지만 OP는 --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

나는 여기서 일어나고 있는 라이브러리 불일치에 대해 전혀 모릅니다. 특히 이 모든 것이 FreeNAS "플러그인 감옥"에서 발생하며 어떻게 구성되어 있는지 모릅니다. 그러나 저는 OpenVPN이 경로 확장 시 전송을 구성하도록 하는 목표를 달성하기 위해 이 문제를 해결했습니다.
메모: 다음 답변은 분할 오류 문제를 해결하지 못하므로 승인된 것으로 표시하지 않겠습니다.

이 솔루션은 다음 관찰을 기반으로 합니다. OpenVPN에서 호출하면 세그폴트가 발생하지만 대신 호출 transmission-remote하면 완벽하게 실행됩니다 .cron

  1. openvpn.conf그대로 두십시오 .

  2. 에서는 set_port.sh을 호출하는 대신 transmission-remote포트 번호를 파일에 저장합니다. 예를 들어 다음과 같습니다. (여기부터는 변수가 스크립트를 저장하는 폴더 등으로 연결된다고 echo $port > $path/port-id가정합니다 .)path

  3. 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
  1. cron위 스크립트를 1분마다 호출하도록 설정합니다 . 내 crontab에 다음을 넣었습니다.
    * * * * * /usr/local/etc/openvpn/ports/tp_setter.sh

답변3

레벨을 3-4로 설정하면 verb스크립트가 실행되지 않는다는 경고가 표시될 것입니다. 기본적으로 OpenVPN 2.2+는 특정 내장 기능만 호출합니다. 다음을 사용하여 긴장을 풀어야 합니다.script-security:

--script-security level

이 지시문은 OpenVPN의 외부 프로그램 및 스크립트 사용에 대한 정책 수준 제어를 제공합니다. 낮은 수준 값은 더 제한적이고, 높은 값은 더 허용적입니다.

레벨 설정:

0-- 외부 프로그램을 호출하는 것은 엄격히 금지됩니다.
1-- (기본값) ifconfig, ip, Route 또는 netsh와 같은 내장 실행 파일만 호출합니다.
2-- 내장 실행 파일 및 사용자 정의 스크립트 호출을 허용합니다.
3-- 암호가 환경 변수를 통해 스크립트에 전달되도록 허용합니다(잠재적으로 안전하지 않음).

2 또는 3으로 설정 했는지 확인해야 합니다 script-security(스크립트에 비밀번호를 보낼 필요가 없으면 2, 그렇지 않으면 3).

관련 정보