#!/bin/bash
start(){
printf 'Real IP: %s\n' "$(curl -s ifconfig.co)"
set -- /etc/openvpn/ovpn_tcp/*.nordvpn.com.tcp.ovpn
shift $(( RANDOM % $# ))
screen -S vpn -dm openvpn "$1" # connect
sleep 5 # wait for connection
printf 'VPN IP: %s\n' "$(curl -s ifconfig.co)"
}
stop(){
screen -S vpn -X quit
pkill -f ovpn
}
status(){
printf 'Current IP: %s\n' "$(curl -s ifconfig.co)"
}
case "$1" in
start)
if screen -ls | grep -w vpn &> /dev/null; then
echo "VPN Already Connected";
status
else
start
fi
;;
stop)
stop
;;
*)
status
;;
esac
入力すると、前のbash
スクリプトは次の答えを提供しますvpn stop
。
vpn stop
アクティブな接続がある場合は、次をvpn
実行します。
[root@A ~]# vpn stop
Terminated
vpn stop
アクティブな接続がない場合は、vpn
次を実行します。
[root@A ~]# vpn stop
No screen session found.
Terminated
私が達成したいことは次のとおりです
vpn stop
アクティブな接続がある場合は、次をvpn
実行します。
[root@A ~]# vpn stop
VPN Connection Closed Successfully
vpn stop
アクティブな接続がない場合は、vpn
次を実行します。
[root@A ~]# vpn stop
There's No Active VPN Connection to stop it.
答え1
stopコマンドの終了信号を確認する必要があります。
stop(){
screen -S vpn -X quit >/dev/null 2>&1
if [ "$?" == 0 ]; then
echo "VPN Connection Closed Successfully"
else
echo "There's No Active VPN Connection to stop it."
fi
pids=( $(pgrep -f ovpn) )
for pid in "${pids[@]}"; do
if [[ $pid != $$ ]]; then
kill "$pid"
fi
done
}
Bashは、最後に実行されたコマンドの終了信号を$?
変数に保存します。標準によると、重要な終了信号はすべて0
成功と見なされ、そうでなければ失敗と見なされます。
編集:小さなタイプミスを作成してリダイレクタの順序を変更しました>&
。