bash 스크립트를 사용하여 openvpn 연결을 시작하고 터널이 설정되면 서버에 대한 SSH 터미널 연결을 시작하고 SSH 연결이 닫히면 openvpn 연결도 닫습니다.
먼저 제안된 솔루션을 구현해 보았습니다.https://stackoverflow.com/questions/21001220/bash-sequence-wait-for-output-then-start-next-program쉘 스크립트로
#!/bin/bash
exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
Fish Shell에서 sh ssh-vpn.sh로 이 스크립트를 실행합니다.
스크립트로서 구문 오류가 발생합니다 line 2: syntax error near unexpected token '<'
. 스크립트 외부에서는 이 오류가 발생하지 않습니다.
또한 이러한 명령을 스크립트로 사용하지 않으면 파일 설명자 3이 이미 존재하기 때문에 가끔 오류 메시지가 나타나는 것 같습니다.
스크립트에서 구문 오류를 방지하는 방법은 무엇입니까?
나중에 openvpn 연결을 자동으로 닫도록 스크립트를 확장하려면 어떻게 해야 합니까?
스크립트 끝에서 파일 설명자가 닫히도록 하려면 어떻게 해야 합니까?
하나의 질문에 너무 많은 질문이었다면 사과드립니다. 이것은 오랜만의 스크립팅 질문인 것 같고 아직 여기서 배울 것이 많습니다.
답변1
문제는 코드가 bash
셸용으로 작성되었지만 sh
이를 실행하기 위해 명시적으로 사용한다는 것입니다. 점점 더 많은 플랫폼에서 이 콘텐츠는 동일하지 않습니다.
대신 sh ssh-vpn.sh
두 가지 더 나은 옵션이 있습니다
스크립트를 실행 가능하게 만들고 이
#!
줄에서 사용할 셸을 정의 하게 합니다.# just once chmod a+rx ssh-vpn.sh # thereafter ./ssh-vpn.sh
올바른 셸을 사용하여 스크립트를 실행하세요.
bash ssh-vpn.sh
답변2
구현하다https://unix.stackexchange.com/users/100397/roaima대답과 openvpn 연결이 하나만 열려 있다는 것을 알면 pkill -9 -x $process_name
다음의 명령을 재사용할 수 있습니다.bash 스크립트로 생성된 프로세스를 종료하는 가장 좋은 방법은 무엇입니까?- 이 코드로 이동합니다.
#!/bin/bash
exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
ssh server
sudo pkill -9 -x openvpn
그래서 요약하면
위의 코드를 사용하여 ssh-vpn.sh 스크립트를 생성합니다(
printf
현재 진행 상황에 대한 일부 정보 추가)#!/bin/bash printf "Script to initialise openvpn connection to XYZ and open ssh channel into XYZ Server.\n" printf "Starting openvpn to YXZ...\n\n" exec 3< <(sudo openvpn --config /etc/openvpn/server.ovpn) sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 & printf "VPN now initialised.\nstarting ssh connection to XYZ...\n" ssh server printf "\nKilling openvpn connection...\n" sudo pkill -9 -x openvpn # end of script
껍질에
# just once chmod a+rx ssh-vpn.sh
쉘에서 명령 실행
# thereafter ./ssh-vpn.sh