Forum Programmation.shell script lancement openvpn

Posté par  . Licence CC By‑SA.
Étiquettes :
0
23
juil.
2017

Bonjour à tous,

J'ai un serveur openvpn.
Actuellement pour m'y connecter depuis mon poste la commande

sudo openvpn --config client1.ovpn

J'aimerai me mettre un bouton sous X pour lancer et couper la connexion,
N'ayant pas trouvé un moyen de faire ca nativement sous ubuntu 14 (et sans réponse sur le forum) avec le fichier .ovpn, j'ai codé un petit script

#!/bin/sh
OPENVPNCONFFILE="~/client1.ovpn";
  if ifconfig | grep -iq tun; then
        sudo pkill -SIGTERM -f 'openvpn' 
        notify-send "Connexion VPN fermé"
  else
        sudo openvpn --config ~/client1.ovpn
        notify-send "Connexion VPN activé"
  fi

Mais je rencontre deux souci
- si je ne lance pas le script dans un terminal depuis le lanceur, il ne me demande pas le passe sudo et donc ne se connecte pas
- si je le lance dans un terminal, dès que je ferme le terminal, la connexion se coupe

Enfin la notification de commande
notify-send "Connexion VPN activé"
ne s'affiche qu'a la déconnexion

  • # éléments de réponse

    Posté par  . Évalué à 3.

    si je ne lance pas le script dans un terminal depuis le lanceur, il ne me demande pas le passe sudo et donc ne se connecte pas

    openvpn a besoin des droits d'admin pour créer son interface réseau et modifier la table de routage.
    La documentation d'OpenVPN explique comment passer par un utilisateur non privilégié : https://community.openvpn.net/openvpn/wiki/UnprivilegedUser

    si je le lance dans un terminal, dès que je ferme le terminal, la connexion se coupe

    ajoute --daemon à ta commande

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

    • [^] # Re: éléments de réponse

      Posté par  . Évalué à 1.

      Je te remercie, et vais regarder comment l'adapter car chez moi j'ai pas de fichier
      /etc/rc.d/init.d/openvpn-su

      ni de fichier openvpn-su ailleurs

      • [^] # Re: éléments de réponse

        Posté par  . Évalué à 1. Dernière modification le 23 juillet 2017 à 16:27.

        Il semble y avoir des scripts dans /etc/rcX.d/

        └─ # ▶ ls /etc/rc* | grep "openvpn"
        K01openvpn
        K01openvpn
        S04openvpn
        S04openvpn
        S04openvpn
        S04openvpn
        K01openvpn
        

        Quand tu auras trouvé la solution, n'hésite pas à le signaler (et comment) afin de donner la réponse a ceux qui tomberont sur ce topic :)

        PS: si tu fais un petit bouton qui est vert quand le VPN est ok et rouge quand il est pas OK avec possibilité de switcher en un clic, ça m'intéresse :D

        Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

        • [^] # Re: éléments de réponse

          Posté par  . Évalué à 1.

          Je te remercie, et vais regarder comment l'adapter car chez moi
          mais je vois pas le lien entre

          /etc/rc.d/init.d/openvpn-su

          └─ # ▶ ls /etc/rc* | grep "openvpn"
          K01openvpn
          K01openvpn
          S04openvpn
          S04openvpn
          S04openvpn
          S04openvpn
          K01openvpn

          J'ai essayé de suivre le tuto mais je suis blocker à User
          j'ai crée l'utilisateur
          mais

          gotcha@prbook:/usr/local/sbin$ sudo chown openvpn:openvpn /var/run/openvpn /var/log/openvpn /etc/openvpn -R
          chown: impossible d'accéder à «/var/run/openvpn»: Aucun fichier ou dossier de ce type
          gotcha@prbook:/usr/local/sbin$ sudo chown openvpn:openvpn /var/lib/openvpn
          chown: impossible d'accéder à «/var/lib/openvpn»: Aucun fichier ou dossier de ce type

          en revanche le --daemon m'aide bien

          J'ai un bouton au lanceur executer dans un terminal

          sudo bash ~/script/vpn.sh
          

          et un script

          #!/bin/sh
          OPENVPNCONFFILE="~/client1.ovpn";
            if ifconfig | grep -iq tun; then
              #Connexion Vpn active
          
                  pkill -SIGTERM -f 'openvpn' 
                  notify-send "Connexion VPN fermé"
            else
              #Connexion Vpn inactive
                      openvpn --daemon --config ~/client1.ovpn
                      notify-send "Connexion VPN activé"
            fi
          

          Au moins ca ouvre un fenetre me demande le passe sudo.
          puis la fenetre se ferme.

          Au premier click la connexion se lance
          au deuxième elle se ferme.
          Mais les notification ne fonctionne pas
          Du coup je sais pas si je suis sous vpn ou non
          obliger de passer par un ifconfig.

          Je tiendrais au courant de mes avancés

          • [^] # Re: éléments de réponse

            Posté par  . Évalué à 1. Dernière modification le 23 juillet 2017 à 17:09.

            Si tu veux continuer d'avoir la demande de mot de passe mais sans un shell qui s'ouvre, sur Ubuntu tu peux utiliser gksudo au lieu de sudo.
            A la place d'ouvrir un shell pour demander le mot de passe, il ouvrira une petite fenêtre de demande de mot de passe.

            Chez moi (xubuntu) ton script fonctionne même les notifications :

            #!/bin/sh
            OPENVPNCONFFILE="/etc/openvpn/client1.ovpn";
              if ifconfig | grep -iq tun; then
                #Connexion Vpn active
            
                    pkill -SIGTERM -f 'openvpn' 
                    notify-send "Connexion VPN fermé"
              else
                #Connexion Vpn inactive
                        openvpn --daemon --config $OPENVPNCONFFILE
                        notify-send "Connexion VPN activé"
              fi

            Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

  • # reinventer la poudre comme souvent

    Posté par  . Évalué à 3.

    comme d'hab depuis que tu viens ici, tu ne serais pas en train de reinventer la poudre, la roue ?

    si tu as un environnement graphique, tu as surement mis network-manager pour gerer les connexions reseaux,
    alors installes network-manager-openvpn pour que celui-ci puisse gerer la partie openvpn,
    puis configure le avec le certificat et les infos de ton VPN,

    et hop, depuis l'applet tu as alors un menu "openvpn -> connecter à MONVPN"
    quand ca se connecte, ca fait la popup comme quoi c'est connecté,
    quand ca se deconnecte ca te fait un popup comme quoi c'est deconnecté.

    sinon si tu tiens à le faire "à ta maniere"
    ajoute un test pour savoir s'il y a une session graphique (ou si tu es dans un terminal)
    et utilise gksudo tacommande en cas de session graphique, et sudo tacommande en cas de terminal sans graphique

    • [^] # Re: reinventer la poudre comme souvent

      Posté par  . Évalué à 1.

      Je tiens pas à réinventer la roue.

      J'ai d'abord chercher comment utiliser network-manager avec mon fichier ovpn (ce qu'il ne semble pas faire nativement.) J'ai poser la question sur le forum ubuntu pas de réponse.
      Donc j'ai fini par faire mon script

      Et j'ai trouver aujourd'hui comment splite le fichier ovpn en ca.crt, client1.crt, client1.key, ta.key

  • # script pour openvpn dual VPN + SSH

    Posté par  . Évalué à 1. Dernière modification le 25 juillet 2017 à 19:50.

    Je reposte ici histoire de ne pas recréer un enième thread (d'où me vient l'idée de ce code :D)

    Donc voici un bout de code dont je ne comprends pas bien le problème.
    Ce script est censé quitter openvpn et autossh s'ils sont lancé, ou les lancer s'ils sont quitté. Le script est conçu pour pouvoir changer de serveur VPN en fonction de si le serveur VPN1 est présent ou non sur le LAN. Il est aussi conçu pour ne pas fermer les autres éventuels tunnels SSH

    #!/bin/bash
    #  -> WTFPL - infos script : https://www.0rion.netlib.re/forum4/viewtopic.php?f=84&t=646
    # -> code by voxdemonix <-
    # -> V1.2 (2017/07/25) <-
    #su monUser -c 'autossh -M 0 -q -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -L 8080:127.0.0.1:80 proxy-ssh@torOrWanadress.onion -f'
    
    
    if [ ! "$SUDO_USER" ]; then
    echo "!!! i need root !!!"
    exit 0
    fi
    
        # NETWORK OPTIONS
    INTERFACE="tun"
    IpVpnLocale="192.168.1.69" # (VPN1) l'adresse IP locale de votre serveur hébergeant owncloud
    MacVpnLocal="69:69:69:69:69:69" #l'adresse mac du serveur hébergeant owncloud (tapez ifconfig dans un terminal sur votre server pour la voir)
    
        # VPN OPTIONS
    
    fichierOvpnLAN="/etc/openvpn/userVPN1.ovpn" # (VPN1) le nom de votre fichier de conf .ovnp en LAN
    fichierOvpnNotLAN="/etc/openvpn/userVPN2.ovpn" # (VPN2) le nom de votre fichier de conf .ovnp via SSH
    openVpn1Param="--route-nopull" # add options for openvpn connexion to server 1 (lan)
    openVpn2Param="--route-nopull" # add options for openvpn connexion to server 2 (ssh/tor/wan)
    LANG="fr"
    
        # SSH OPTIONS
    AdresseServerOnion="blablablablablabla.onion" # (VPN2)
    UserLocalForSshTunneling="daenerys" # l'user a utiliser sur votre ordinateur pour le montage du tunnel (celui qui a exporté sa clés)
    UserRemoteForSshTunneling="proxy-ssh" # l'user a utiliser côté server ( /!\ n'utilisez jamais root !)
    portEntree="1194" # le port sur le pc local, par défaut 1194
    portSortie="1194" # le port sur le serveur, par défaut 1194
    
    
    
    case $LANG in
            fr)             VpnDisabled="Connexion VPN fermé"
                            VpnConnecting="Connexion VPN en cours"
                            VpnEnabled="VPN Connecté !";;
            en | usa | *)   VpnDisabled="VPN Connexion Disabled"
                            VpnConnecting="VPN Connexion"
                            VpnEnabled="VPN Connected !";;
    esac
    
    
            # boucle qui permet d'attendre que le réseau soit connecté
    stop="0"
    while [ $stop -lt 1 ]
    do
    sleep 20       # temps d'attente entre chaque tentative
    
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
            stop=1
    fi
    done
    
    if ps -aux | grep "[o]penvpn"; then
        #Connexion VPN active
    
            if ps -aux | grep "[o]penvpn" | grep "$fichierOvpnLAN"; then
                    # LAN
                for pid in `ps -ef | grep "[o]penvpn" | grep "$fichierOvpnLAN" | awk '{print $2}'` ; do kill $pid ; done
                hostnameVPN=$(cat "$fichierOvpnLAN" | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                notify-send "$VpnDisabled ($hostnameVPN)"
                    # if you use SSH in LAN, uncomment following line
                    # si vous utilisez SSH en LAN, décommentez les lignes suivantes
                for pid in `ps -ef | grep "[a]utossh" | grep "$IpVpnLocale" | awk '{print $2}'` ; do kill $pid ; done
                notify-send "SSH Tunneling STOP ($IpVpnLocale)"
            fi
    
    
            if ps -aux | grep "[o]penvpn" | grep "$fichierOvpnNotLAN"; then
                    # WAN
                for pid in `ps -ef | grep "[o]penvpn" | grep "$fichierOvpnNotLAN" | awk '{print $2}'` ; do kill $pid ; done
                hostnameVPN=$(cat "$fichierOvpnNotLAN" | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                notify-send "$VpnDisabled ($hostnameVPN)"
                for pid in `ps -ef | grep "[a]utossh" | grep "$AdresseServerOnion" | awk '{print $2}'` ; do kill $pid ; done
                notify-send "SSH Tunneling STOP ($AdresseServerOnion)"
            fi
    else
    
            ping $IpVpnLocale -c 2 >> /dev/null 2>&1
            macRecover=$(arp -n | grep -i -o $MacVpnLocal)
    
            if [ "$macRecover" == "$MacVpnLocal" ]; then
            #        echo "local/LAN"
                    # si vous voulez aussi faire un tunnel ssh en LAN décommentez les deux lignes suivantes
            #   for pid in `ps -ef | grep "[a]utossh" | grep "$IpVpnLocale" | awk '{print $2}'` ; do kill $pid ; done
            #   su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$IpVpnLocale -f"
                openvpn --daemon $openVpn1Param --config $fichierOvpnLAN
    
                hostnameVPN=$(cat "$fichierOvpnLAN" | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                notify-send "$VpnConnecting ($hostnameVPN)"
            else
            #        echo "tor/wan"
                    # kill oprevious ssh tunneling
                for pid in `ps -ef | grep "[a]utossh" | grep "$AdresseServerOnion" | awk '{print $2}'` ; do kill $pid ; done
                    # creat new ssh tunneling
                su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$AdresseServerOnion -f"
                openvpn --daemon $openVpn2Param --config $fichierOvpnNotLAN
    
                hostnameVPN=$(cat "$fichierOvpnNotLAN" | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                notify-send "$VpnConnecting ($hostnameVPN)"
            fi
    
    
                    # boucle qui permet de verifier si le VPN se connecte bien
            stop=0
            while [ $stop -lt 10 ]
            do       # temps d'attente entre chaque tentative
                if ifconfig | grep -iq $INTERFACE; then
                        notify-send "$VpnEnabled ($hostnameVPN)"        
                        stop=10
                    exit
                fi
                    sleep 20
                   stop=$((stop+1))
            done
    
    fi

    Il y a une erreur quelque part avant la ligne "if [ "$macRecover" == "$MacVpnLocal" ];" car cette dernière fonctionne dans mes scripts actuels hors maintenant elle renvoie "./test.sh: 86: [: 69:69:69:69:69:69: unexpected operator" (l'adresse mac est censurée par mes soins, dans le script elle est bonne).
    Je soupçonne les deux if qui gèrent la coupure d'openvpn et d'autossh d'être à l'origine du soucis.

    PS: bash est vraiment horrible :D

    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

    • [^] # Re: script pour openvpn dual VPN + SSH

      Posté par  . Évalué à 3. Dernière modification le 25 juillet 2017 à 20:20.

      case $LANG in
              fr)             VpnDisabled="Connexion VPN fermé"
                              VpnConnecting="Connexion VPN en cours"
                              VpnEnabled="VPN Connecté !";;
              en | usa | *)   VpnDisabled="VPN Connexion Disabled"
                              VpnConnecting="VPN Connexion"
                              VpnEnabled="VPN Connected !";;
      esac
      

      Si tu te fais suer à faire un script bilingue évite de donner dans le franglais ;) "Connection" en anglais… avec un t. Et pour le français tu as fait une faute d’accord, à la première ligne, « connexion » est féminin.

      Ça fonctionne avec les espaces dans en | usa | *) ? Qui plus est c’est un peu bancal ton truc… en fait tu peux virer 'en|usa|' puisque de toute façon tu as le joker sur ce même case… Autrement dit : « A ou B ou n’importe quoi » c’est équivalent à « n’importe quoi ».

      En plus je ne pense pas que la variable $LANG prenne ce genre de valeur, ce serait plus du genre "fr_FR.utf8" ou "C", ou …

      Et il manque les ';;' !

      • [^] # Re: script pour openvpn dual VPN + SSH

        Posté par  . Évalué à 3.

        Et il manque les ';;' !

        J’ai rien dit :) Bizarre de les mettre là…

        • [^] # Re: script pour openvpn dual VPN + SSH

          Posté par  . Évalué à 1. Dernière modification le 25 juillet 2017 à 20:29.

          Ils sont l'équivalent de break; en PHP (si non je suis aussi tombé dans le piège, au début j'en avais mis partout dans le switch mdr)

          Merci pour la correction orthographique :)

          Pas d'idée pourquoi les deux lignes suivantes refusent de fonctionner ici alors qu'elles fonctionnent ailleurs? :)

          macRecover=$(arp -n | grep -i -o $MacVpnLocal)
          if [ "$macRecover" == "$MacVpnLocal" ]; then

          Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

          • [^] # Re: script pour openvpn dual VPN + SSH

            Posté par  . Évalué à 3.

            Le script suivant fonctionne chez moi :

            #!/usr/bin/env bash
            
            IpVpnLocale="192.168.0.20" 
            MacVpnLocal="90:2b:34:6d:94:27" 
            
            macRecover=$(arp -n | grep -i -o $MacVpnLocal)
            if [ "$macRecover" == "$MacVpnLocal" ]; then
            echo plop
            fi

            Par contre je ne comprends strictement rien à la logique du truc… Je vais p-e dire une connerie mais vu que tu utilises l’option -o de grep : soit ça match, et dans ce cas tu as effectivement "$macRecover" == "$MacVpnLocal", ou bien ça ne match pas, et $macRecover est vide…

            Tu peux faire un truc du genre :

            if arp -n | grep -i -q $MacVpnLocal; then
            
                echo $MacVpnLocal
            
            fi

            le echo n’aura lieu que si l’adresse est présente dans la sortie de arp -n… j’ai laissé le -i de grep mais il sert clairement à rien, non ?

            Je t’avoue que moi aussi je trouve ce script assez… bordélique… pas simple à suivre quoi. Les mêmes commandes sont répétées à 36 endroits… la variable "stop" est utilisée un coup comme chaîne un coup comme entier… Bref, bon courage, moi j’arrête là ;)

            Si jamais tu l’ignorais… sache que tu peux mettre set -x en début de script pour être en quelque sorte en mode "debug", ça te décomposera les commandes, parfois ça aide à comprendre ce qui cloche.

            • [^] # Re: script pour openvpn dual VPN + SSH

              Posté par  . Évalué à 1.

              Je pense avoir résolut le soucis. Mon nom de fichiers étaient .sh et il faut qu'il soit en .bash (c'est ça ou alors j'ai fais une modifs qui a réparé le bousin

              Par contre je ne comprends strictement rien à la logique du truc… Je vais p-e dire une connerie mais vu que tu utilises l’option -o de grep : soit ça match, et dans ce cas tu as effectivement "$macRecover" == "$MacVpnLocal", ou bien ça ne match pas, et $macRecover est vide…

              Le but est simplement de voir si une adresse mac est présente sur le réseau afin de savoir si on est en LAN. Se serait du PHP au lieu de Bash j'aurai mis un array et un foreach pour vérifier plusieurs Mac mais bon, bash ne semble pas gérer les array :P

              Je t’avoue que moi aussi je trouve ce script assez… bordélique…

              Il est en cours de refonte complète, l'esthétique c'est pour plus tard :D (il faut encore que j'ajoute des trucs pour pouvoir choisir d'activer ou non le SSH tunneling au choix).

              Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

              • [^] # Re: script pour openvpn dual VPN + SSH

                Posté par  . Évalué à 4.

                Je pense avoir résolut le soucis.

                Cool

                Mon nom de fichiers étaient .sh et il faut qu'il soit en .bash

                Bash ne change pas de comportement selon le nom du fichier qu’il exécute… Vraiment, ça ne change rien. Sauf si le script lui-même en tient compte bien sûr…

                Se serait du PHP au lieu de Bash j'aurai mis un array et un foreach pour vérifier plusieurs Mac mais bon, bash ne semble pas gérer les array :P

                Bash gère très bien les tableaux, http://www.ixany.org/docs/Shell_Les_tableaux_en_bash.html

                l'esthétique c'est pour plus tard :D

                Ce n’est pas une question esthétique. Il s’agit surtout de produire un code maintenable et qu’on peut faire évoluer. Là c’est un petit script (mais que tu vas faire grossir si j’ai bien compris…) donc ça va encore… mais tu verras ensuite, quand tu te retrouveras à ne plus comprendre ton propre code (sans énormément d’effort) en revenant dessus un ou deux ans après ;)

                Enfin bon… tu apprendras tout ça au fur et à mesure, à force d’en écrire… tu commences à te débrouiller.

                • [^] # Re: script pour openvpn dual VPN + SSH

                  Posté par  . Évalué à 1. Dernière modification le 26 juillet 2017 à 18:13.

                  cela vous convient-il mister? :P

                  #!/bin/bash
                  #  -> WTFPL - infos script : https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=646&p=1460#p1460
                  # -> code by voxdemonix <-
                  # -> V1.6 (2017/07/26) <-
                  #su monUser -c 'autossh -M 0 -q -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -L 8080:127.0.0.1:80 proxy-ssh@torOrWanadress.onion -f'
                  # uncomment next line for debug
                  #set -x
                  
                  if [ ! "$SUDO_USER" ]; then
                  echo "!!! i need root !!!"
                  exit 0
                  fi
                  
                      #SCRIPTS OPTIONS
                  LANG="fr" # notification service ; accept : fr, usa (default)
                  notificationType="notify" # accept : echo; notify, nothing
                  
                      # NETWORK OPTIONS
                  INTERFACE="tun"
                  hosnameVpnLAN="192.168.1.69" # (VPN1 hostname) l'adresse IP locale de votre serveur VPN
                  MacVpnLocal="69:69:69:69:69:69" #l'adresse mac du serveur VPN (tapez ifconfig dans un terminal sur votre server pour la voir)
                  
                      # VPN OPTIONS
                  
                  fichierOvpnLAN="/etc/openvpn/userVPN1.ovpn" # (VPN1) le PATH de votre fichier de conf .ovpn en LAN
                  fichierOvpnNotLAN="/etc/openvpn/userVPN2.ovpn" # (VPN2) le PATH de votre fichier de conf .ovpn via SSH
                  openVpn1Param="--route-nopull" # add options for openvpn connexion to server 1 (lan)
                  openVpn2Param="--route-nopull" # add options for openvpn connexion to server 2 (ssh/tor/wan)
                  
                      # SSH OPTIONS
                  hosnameVpnNotLAN="hostname.onion" # (VPN2 hostname)
                  UserLocalForSshTunneling="daenerys" # l'user a utiliser sur votre ordinateur pour le montage du tunnel (celui qui a exporté sa clés)
                  UserRemoteForSshTunneling="proxy-ssh" # l'user a utiliser côté server ( /!\ n'utilisez jamais root !)
                  portEntree="1194" # le port sur le pc local, par défaut 1194
                  portSortie="1194" # le port sur le serveur, par défaut 1194
                  sshLanEnable=0  # 0 for disable ; 1 for enable : enable or disable the ssh tunneling in LAN
                  sshNotLanEnable=1 # 0 for disable ; 1 for enable : enable or disable the ssh tunneling in Wan | Tor
                  
                  
                  
                              # NOTIFICATION SYSTEM
                  function vpnNotification {
                          # $1 = message ID (watch switch/case);
                          # $2 = hostnameVPN
                      message=""
                      #hostnameVPN=$(cat "$2" | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                      hostnameVPN=$2
                  
                      case $LANG in
                          fr )
                                  case $1 in
                                      VpnDisabled )
                                              message="Connexion VPN fermée ($hostnameVPN)"
                                          ;;
                                      VpnConnecting )
                                              message="Connexion VPN en cours ($hostnameVPN)"
                                          ;;
                                      VpnEnabled )
                                              message="VPN Connecté ! ($hostnameVPN)"
                                          ;;
                                      SshStop )
                                              message="Tunnel SSH STOP ($hostnameVPN)"
                                          ;;
                                      SshStart )
                                              message="Tunnel SSH START ($hostnameVPN)"
                                          ;;
                                  esac
                              ;;
                          usa | *)
                                  case $1 in
                                      VpnDisabled )
                                              message="VPN Connection Close ($hostnameVPN)"
                                          ;;
                                      VpnConnecting )
                                              message="VPN Connection in progress ($hostnameVPN)"
                                          ;;
                                      VpnEnabled )
                                              message="VPN Connected ! ($hostnameVPN)"
                                          ;;
                                      SshStop )
                                              message="SSH Tunneling STOP ($hostnameVPN)"
                                          ;;
                                      SshStart )
                                              message="SSH Tunneling START ($hostnameVPN)"
                                          ;;
                                  esac
                              ;;
                      esac
                  
                  
                      case $notificationType in
                          echo)
                                  echo "$message"
                              ;;
                          notify)
                                  notify-send "$message"
                              ;;
                          nothing | *)
                              ;;
                      esac
                  }
                  
                  function quitOpenVPN {
                          # $1 = ovpn ( $fichierOvpnLAN, $fichierOvpnNotLAN)
                          # $2 = hostnameVPN ( $hosnameVpnLAN, $hosnameVpnNotLAN)
                          ovpn=$1
                          hostVPN=$2
                              #stop VPN
                          if ps -aux | grep "[o]penvpn" | grep "$ovpn" | grep -v "grep" ; then
                                  # LAN
                              for pid in `ps -ef | grep "[o]penvpn"| grep "$ovpn"  | grep -v "grep" | awk '{print $2}'` ; do kill $pid ; done
                              hostnameVPN=$(cat $ovpn | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                              vpnNotification "VpnDisabled" $hostnameVPN
                          fi
                              #stop ssh
                          if ps -aux | grep "[a]utossh" | grep "$hostVPN"  | grep -v "grep" ; then
                              for pid in `ps -ef | grep "[a]utossh" | grep "$hostVPN"  | grep -v "grep" | awk '{print $2}'` ; do kill $pid ; done
                              vpnNotification "SshStop" $hostVPN
                          fi
                          sleep 1
                  }
                  
                  function startOpenVPN {
                          # $1 = hostname VPN ($hosnameVpnLAN, $hosnameVpnNotLAN)
                          # $2 = ovpn ($fichierOvpnLAN, $fichierOvpnNotLAN)
                          # $3 = ssh enable (1) or not (0) ($sshLanEnable, $sshNotLanEnable)
                          # $4 = OpenVpn Param ($openVpn1Param, $openVpn2Param)
                  
                          hostVPN=$1
                          ovpn=$2
                          sshChoice=$3
                          openvpnParam=$4
                  
                                  # SSH TUNNELING
                              if [ $sshChoice == 1 ]; then
                                      # kill oprevious ssh tunneling
                                  for pid in `ps -ef | grep "[a]utossh" | grep "$hostVPN" | awk '{print $2}'` ; do kill $pid ; done
                                      # creat new ssh tunneling
                                  su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$hosnameVpnNotLAN -f"
                              fi
                  
                                  # START OpenVPN
                              openvpn --daemon $openvpnParam --config $ovpn
                  
                                  # NOTIFICATIONS
                              hostnameVPN=$(cat $ovpn | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                              vpnNotification "VpnConnecting" $hostnameVPN
                  
                                  # boucle qui permet de verifier si le VPN se connecte bien
                          stop=0
                          while [ $stop -lt 10 ]
                          do       # temps d'attente entre chaque tentative
                              if ifconfig | grep -iq $INTERFACE; then
                                      vpnNotification "VpnEnabled" $hostnameVPN       
                                      stop=10
                                      exit
                              fi
                                  sleep 5
                                 stop=$((stop+1))
                          done
                  
                  }
                  
                  
                  
                          # boucle qui permet d'attendre que le réseau soit connecté
                  stop="0"
                  while [ $stop -lt 1 ]https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=646&p=1460#p1460
                  do
                  sleep 3       # temps d'attente entre chaque tentative
                  
                  _IP=$(hostname -I) || true
                  if [ "$_IP" ]; then
                          stop=1
                  fi
                  done
                  
                  if ps -aux | grep "[o]penvpn"; then
                      #Connexion VPN active
                  
                              # vpn server 1
                          quitOpenVPN $fichierOvpnLAN $hosnameVpnLAN
                              # vpn server 2
                          quitOpenVPN $fichierOvpnNotLAN $hosnameVpnNotLAN
                  
                  
                  else
                  
                          ping $hosnameVpnLAN -c 3 >> /dev/null 2>&1
                          macRecover=$(arp -n | grep -i -o $MacVpnLocal)
                  
                          if [ "$macRecover" === "$MacVpnLocal" ]; then
                          #        echo "local/LAN/First VPN"
                  
                              startOpenVPN $hosnameVpnLAN $fichierOvpnLAN $sshLanEnable $openVpn1Param
                  
                          else
                          #        echo "tor/wan/second VPN"
                              startOpenVPN $hosnameVpnNotLAN $fichierOvpnNotLAN $sshNotLanEnable $openVpn2Param
                  
                          fi
                  
                  fi

                  source : https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=646&p=1460#p1460

                  PS: c'est chiant que la moulinette doit se situer après les fonctions
                  PS2 : si tu as une idée de petit nom pour ce script (je n'arrive pas a lui trouver un nom simple, compréhensible et bilingue (usa/fr) genre "script pour automatiser choix entre 2 serveur VPN suivant sur quel réseau on est connecté" :D ) Je posterais le tuto sur LinuxFR quand j'aurai trouvé comment titré le wiki :D
                  PS3 : il y a une étrangeté avec, malgré grep "[o]penvpn", je suis quand même obligé de mettre grep -v "grep" si non la commande qui quitte openvpn match le grep (ca ne provoque pas de bug mais ça provoque l'affiche d'une ligne où le script dis ne pas avoir réussi a quitter le process de grep :D )

                  Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

                  • [^] # Re: script pour openvpn dual VPN + SSH

                    Posté par  . Évalué à 1. Dernière modification le 26 juillet 2017 à 18:16.

                    Pfff c'est abusé seulement 5 minutes pour s'éditer, il y a une url qui s'est glissé en plein milieu de mon script lors du copié-collé et je ne peux déjà plus la retirer.
                    à la ligne

                    while [ $stop -lt 1 ]https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=646&p=1460#p1460
                    

                    Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

                  • [^] # Re: script pour openvpn dual VPN + SSH

                    Posté par  . Évalué à 4. Dernière modification le 27 juillet 2017 à 18:00.

                    je suis quand même obligé de mettre grep -v "grep" si non la commande qui quitte openvpn match le grep

                    Le deuxième grep match $ovpn, qui correspond à $fichierOvpnLAN qui vaut "/etc/openvpn/userVPN1.ovpn"

                    Ce deuxième grep n’utilise donc pas l’astuce du caractère entre crochet…

                    Tu peux te simplifier la vie avec pgrep :

                    Exemple :

                    $ pgrep -laf 'avahi-daemon'
                    541 avahi-daemon: running [srv9898455.local]
                    558 avahi-daemon: chroot helper
                    
                    $ pgrep -laf 'avahi-daemon.*chroot'
                    558 avahi-daemon: chroot helper
                    

                    Remplace "pgrep -laf" par "pkill -f" et tu n’as même plus besoin de faire une boucle ;) Note que le motif indiqué à pgrep/pkill est une expression rationnelle (où '.*' signifie « n’importe quel caractère répété zéro ou plusieurs fois »)

                    Pour le nom de ton script : VPNSwitcher ?

                    • [^] # Re: script pour openvpn dual VPN + SSH

                      Posté par  . Évalué à 1.

                      Le deuxième grep match $ovpn, qui correspond à $fichierOvpnLAN qui vaut "/etc/openvpn/userVPN1.ovpn"
                      Ce deuxième grep n’utilise donc pas l’astuce du caractère entre crochet…

                      Oui mais le premier grep avec [o] ne devrait pas matcher le process de grep dans la liste qui est envoyée au grep suivant.

                      Remplace "pgrep -laf" par "pkill -f" et tu n’as même plus besoin de faire une boucle ;) Note que le motif indiqué à pgrep/pkill est une expression rationnelle (où '.*' signifie « n’importe quel caractère répété zéro ou plusieurs fois »)

                      Merci je vais voir pour intégrer cette astuce

                      VPNSwitcher

                      Va pour ça :P

                      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

                    • [^] # Re: script pour openvpn dual VPN + SSH

                      Posté par  . Évalué à 1. Dernière modification le 31 juillet 2017 à 15:24.

                      Sais-tu si on peut utiliser un opérateur AND dans pkill ?

                      Genre je voudrais faire if [ $(pkill -c -f "autossh AND $monUser@$monHostname") -gt 0 ];then

                      Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

                      • [^] # Re: script pour openvpn dual VPN + SSH

                        Posté par  . Évalué à 4.

                        J’ai rien compris… Tu voudrais faire quoi en français ? Je ne comprends pas bien ce que tu veux faire. Pourquoi pkill -c (--count) ??

                        Donc je ne sais pas si ça répond à ta question mais tu peux très bien utiliser une variable pour pgrep/pkill (comme pour n’importe quelle commande, puisque c’est le shell qui va « transformer » cette variable avant d’appeler la commande…), un exemple :

                        (je prends uwsgi comme exemple car je n’ai pas d’openvpn qui tourne ici)

                        Uswgi a plusieurs instances (qui correspondent chacune à une application dans mon cas) :

                        # ps -afx |grep uwsgi
                         8385 pts/0    S+     0:00                      \_ grep uwsgi
                         7523 ?        S      0:00 /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/default.ini --daemonize /var/log/uwsgi/app/default.log
                         7566 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/default.ini --daemonize /var/log/uwsgi/app/default.log
                         7567 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/default.ini --daemonize /var/log/uwsgi/app/default.log
                         7638 ?        S      0:00 /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/paab.ini --daemonize /var/log/uwsgi/app/paab.log
                         7717 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/paab.ini --daemonize /var/log/uwsgi/app/paab.log
                         7718 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/paab.ini --daemonize /var/log/uwsgi/app/paab.log
                         7752 ?        S      0:00 /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/paab-ws.ini --daemonize /var/log/uwsgi/app/paab-ws.log
                         7770 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/paab-ws.ini --daemonize /var/log/uwsgi/app/paab-ws.log
                         7772 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/paab-ws.ini --daemonize /var/log/uwsgi/app/paab-ws.log
                         7868 ?        S      0:00 /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/wst.ini --daemonize /var/log/uwsgi/app/wst.log
                         7877 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/wst.ini --daemonize /var/log/uwsgi/app/wst.log
                         7878 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/wst.ini --daemonize /var/log/uwsgi/app/wst.log
                         7989 ?        S      0:00 /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/yab.ini --daemonize /var/log/uwsgi/app/yab.log
                         8067 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/yab.ini --daemonize /var/log/uwsgi/app/yab.log
                         8068 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/yab.ini --daemonize /var/log/uwsgi/app/yab.log
                         8106 ?        S      0:00 /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/yab-prod.ini --daemonize /var/log/uwsgi/app/yab-prod.log
                         8112 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/yab-prod.ini --daemonize /var/log/uwsgi/app/yab-prod.log
                         8113 ?        S      0:00  \_ /usr/bin/uwsgi --ini /usr/share/uwsgi/conf/default.ini --ini /etc/uwsgi/apps-enabled/yab-prod.ini --daemonize /var/log/uwsgi/app/yab-prod.log
                        

                        Si je veux ne killer qu’une seule d’entre-elles je peux valoriser une variable (nommée toto) :

                        # toto=yab.ini
                        

                        et l’utiliser dans mon pgrep/pkill

                        # pgrep -f uwsgi.*$toto
                        7989
                        8067
                        8068
                        

                        on peut voir que ça ne m’a sélectionné que les PID correspondant à l’instance qui a la chaîne "yab.ini" dans sa ligne de commande.

                        Sinon, pour un if [ … ], si tu veux utiliser un "AND" c’est -a :

                        if [ -z "$plop" -a -n "$plip" ] signifie : Si $plop est une chaîne vide ET $plip une chaîne non-vide. Je t’invite à lire man test qui explique tout ça.

                        • [^] # Re: script pour openvpn dual VPN + SSH

                          Posté par  . Évalué à 2.

                          Oki merci, il manquait un point

                          Je ne comprends pas bien ce que tu veux faire. Pourquoi pkill -c (--count) ??

                          if [ $(pkill -c -f "autossh.*$UserRemoteForSshTunneling@$hostVPN") -gt 0 ]; then
                                      vpnNotification "SshStop" $hostVPN
                          fi
                          

                          M'en servir pour afficher ou non un message :)

                          Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

                          • [^] # Re: script pour openvpn dual VPN + SSH

                            Posté par  . Évalué à 3.

                            OK là je comprends.

                            En fait tu devrais pouvoir te passer du -gt 0, puisque l’entier 0 (que te renverra pkill s’il a bien killé un process) sera déjà évalué à vrai (et si pkill ne kill rien il renvoie 1, ce qui est évalué à faux). Donc :

                            if [ $(pkill -c -f "autossh.*$UserRemoteForSshTunneling@$hostVPN") ]; then
                                        vpnNotification "SshStop" $hostVPN
                            fi

                            il manquait un point

                            Le sens de * ici n’a rien à voir avec celui qu’il a quand tu fais ls -l *.sh ou encore ls /home/*/.ssh (où là, il s’agit juste d’un "joker", que le shell va développer avant d’appeler la commande)

                            Voici l’introduction qui est selon moi la plus simple pour introduire les « expressions régulières »

                            https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re#Utilisation

                            Une expression telle que 'autossh*plop' matcherait : 'autosshplop', 'autosshhhhhplop' (et bien d’autres…) mais pas 'autosshxplop' ou 'autossh.plop'

                            • [^] # Re: script pour openvpn dual VPN + SSH

                              Posté par  . Évalué à 1.

                              si j'utilise le code suivant

                              if [ $(pkill -c -f "autossh.*$UserRemoteForSshTunneling@$hostVPN") ]; then
                                          vpnNotification "SshStop" $hostVPN
                              fi

                              Le script me notifie avoir fermé les deux tunnels SSH (alors qu'un seul est ouvert et ce malgré que dans le terminal je peux voir

                              ++ pkill -c -f 'autossh.*proxy-ssh@hostnameLAN'
                              + '[' 1 ']'
                              + vpnNotification SshStop hostnameLAN
                              [...]
                              ++ pkill -c -f 'autossh.*proxy-ssh@monHostnameSecret.onion'
                              + '[' 0 ']'
                              + vpnNotification SshStop monHostnameSecret.onion

                              On peut voir que le second pkill n'a rien tué mais la notification est quand même lancée.

                              Note que c'est du fignolage, le script fonctionne et peut donc passer en prod je pense :) (j'essaye en vain de résoudre ce soucis en vue d'utiliser ce script :) )

                              Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.