![OpenVPN 시작 스크립트가 명령을 실행하지 않습니다](https://linux55.com/image/134508/OpenVPN%20%EC%8B%9C%EC%9E%91%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
배경: 저는 감옥(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
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
위의 스크립트가 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).