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 셸에서 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/roaimapkill -9 -x $process_name
님의 대답과 내가 단 하나의 openvpn 연결만 열려 있다는 것을 알면 다음의 명령을 재사용할 수 있습니다.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