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

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

배경: 저는 감옥(FreeNAS 11.1 플러그인 감옥)에서 Transmission(v2.93)과 OpenVPN(v2.4.6)을 구성하고 있으며, 프로그램을 --up사용하여 Transmission의 청취 포트를 변경하도록 요청하는 스크립트를 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,스크립트 자체실행되었지만 실제 명령이 이상하게 실패했습니다. 포트가 할당되지 않았습니다(다음을 보고 확인).원격 그래픽 사용자 인터페이스 전송그리고 이 명령은 빈 출력을 생성합니다.
디버그 파일의 내용은 다음과 같습니다:
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이 전송을 구성하도록 하는 목표를 달성하기 위해 이 문제를 해결했습니다.
노트: 다음 답변은 분할 오류 문제를 해결하지 않으므로 허용된 것으로 표시하지 않겠습니다.

transmission-remote이 솔루션은 OpenVPN에서 호출하면 세그폴트가 발생하지만 대신 호출하면 완벽하게 실행된다는 관찰을 기반으로 합니다 .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).

관련 정보