Comment puis-je exécuter OpenVPN en tant que root en arrière-plan, dans un script?

22

Je voudrais écrire un script qui appelle d' openvpnabord, suivi de ssh. Lors de la saisie de la commande

sudo openvpn ~/my_connection.ovpn

dans l'invite de commande, j'obtiens la sortie suivante:

...
Wed Jan  4 21:04:35 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jan  4 21:04:35 2017 /sbin/ip link set dev tun0 up mtu 1500
Wed Jan  4 21:04:35 2017 /sbin/ip addr add dev tun0 local IP_FOO peer IP_FOO
Wed Jan  4 21:04:35 2017 Initialization Sequence Completed

Cette commande bloque et le shell n'est pas libéré. Afin de démarrer une connexion ssh par la suite, je dois pousser le processus openvpn en arrière-plan en tapant Ctrl+ Zsuivi de a bg.

Cependant, je voudrais appeler automatiquement l'étape de connexion openvpn et le ssh en appelant simplement mon fichier bash. Comment puis-je émuler le Ctrl+ Zet les bgétapes de ce fichier?

J'ai essayé d'ajouter un &à la openvpncommande et de le placer nohupdevant. Ni l'un ni l'autre ne fonctionne.

nul
la source
Ce genre de question a été posée plusieurs fois. Si vous avez besoin d'aide, vous devez vraiment publier votre script.
Panther
utiliser sudo -bpour exécuter la commande qui la suit en arrière
Nick Sillito
1
Il me semble que ce n'est vraiment pas un doublon de cette question , qui couvre à peine l'exécution de programmes d'arrière-plan en tant que root, et ne couvre pas du tout comment démonifier correctement OpenVPN.
Eliah Kagan
Ensuite, nous devons à nouveau modifier le titre pour souligner que j'ai essayé d'exécuter un programme d'arrière-plan en tant que root.
null
@null J'ai réédité le titre, comme demandé. OpenVPN est souvent exécuté en tant que root et, dans les situations où il ne l'est pas, l' --daemonoption peut toujours être utilisée, mais vous avez raison de dire que la partie concernant son exécution en tant que root est au cœur de cette question et devrait se refléter dans son titre . Merci de l'avoir signalé!
Eliah Kagan

Réponses:

35

TL; DR: Utilisation sudo -bou mieux .openvpn [...] --daemon

Étant donné que vous exécutez openvpn(et, plus précisément, puisque vous souhaitez exécuter un programme en tant que root en arrière-plan), les informations les plus communément distribuées sur la façon d'exécuter des commandes en arrière-plan ne répondent pas à votre situation. Tu as dit:

J'ai essayé d'ajouter un & à la commande cpenvpn et de placer nohop devant. Les deux ne fonctionnent pas.

Votre commande est:

sudo openvpn ~/my_connection.ovpn

Dans sudola configuration par défaut de, si vous n'avez pas récemment entré votre mot de passe sudodans le même contexte (pour une utilisation interactive, cela signifie généralement le même terminal), il vous demandera votre mot de passe. Mais si vous exécutez la commande en arrière-plan en l'ajoutant, &la ligne ne vous sera pas montrée ni la possibilité de la saisir.[sudo] password for user:

Donc, dans cette situation, exécuter la commande, entrer votre mot de passe et l'envoyer en arrière-plan est une façon raisonnable de le faire, pour une utilisation interactive .

Mais ce n'est pas le seul moyen et, comme vous le dites, vous ne voudrez pas le faire dans un script .

Façon 1: assurez-vous d' sudoavoir un nouvel horodatage.

Vous pouvez vous assurer qu'il sudoa un horodatage actuel lorsqu'il est utilisé pour exécuter votre commande, en exécutant d'abord:

sudo -v

Ensuite, après cela, vous pouvez exécuter:

sudo openvpn ~/my_connection.ovpn &

Cependant, il est généralement préférable d'éviter &(et nohup) complètement lorsque vous souhaitez exécuter une commande en arrière-plan avec sudo. C'est particulièrement le cas pour les scripts.

Méthode 2: utilisez sudo -b. En général, c'est généralement ce que vous voulez.

Au lieu de cela, vous pouvez vous exécuter sudoau premier plan, mais passer l' -bindicateur sudoentraîne l'exécution de la commande en arrière-plan.

sudo -b openvpn ~/my_connection.ovpn

C'est généralement un meilleur moyen, surtout si vous mettez la commande dans un script. Avec sudo -bvous, vous n'obtenez pas le contrôle des travaux , mais dans un script shell, le contrôle des travaux est désactivé par défaut et vous ne devriez généralement pas l'utiliser .

Comme l' man sudoexplique:

     -b, --background
                 Run the given command in the background.  Note that it is not
                 possible to use shell job control to manipulate background
                 processes started by sudo.  Most interactive commands will
                 fail to work properly in background mode.

Cela fonctionne car rien ne s'exécute en arrière-plan tant que sudo n'a pas reçu votre mot de passe (si nécessaire) et déterminé que vous êtes autorisé à exécuter la commande.

Way 3: Mais pour openvpn, vous devriez probablement simplement l'exécuter avec --daemon.

openvpns'exécutera automatiquement en arrière-plan si vous l'exécutez avec l' --daemonoption:

sudo openvpn ~/my_connection.ovpn --daemon

Passez --daemonaprès votre .opvnnom de fichier plutôt qu'avant; le --daemoncas échéant, l'argument suivant est interprété comme le nom que le openvpnprocessus démonisé doit utiliser. (N'ajoutez pas également &.)

Le fait que cela soit approprié ou non dépend du fait qu'une interaction doit ou non se produire après openvpnson exécution mais avant sa démonétisation. Et cela dépend, en partie, de ce qui est mis en place ~/my_connection.ovpn. Mais si vous openvpnne pouvez pas démonifier immédiatement, toutes les autres façons de l'exécuter immédiatement en arrière-plan seront également interrompues .

Par conséquent, dans une situation où vous savez que vous voulez openvpnpour commencer en cours d' exécution en arrière - plan, et vous savez que vous ne voudrez pas le ramener au premier plan, vous devriez sérieusement envisager la méthode de l' invoquer avec l' --daemonoption. Ceci est spécifique à - la openvpnplupart des programmes ne prennent pas en charge une --daemonoption, bien que de nombreux programmes serveur aient une telle option. (Le nom et la syntaxe varient cependant.)

Pour décider d'utiliser ou non cette option (et comment vous souhaitez l'utiliser), je vous recommande de lire la openvpnpage de manuel , en particulier dans la section sur --daemon. Il contient de nombreuses informations utiles, et je ne cite ici que le premier paragraphe:

       --daemon [progname]
              Become  a  daemon  after  all   initialization   functions   are
              completed.   This option will cause all message and error output
              to be sent to  the  syslog  file  (such  as  /var/log/messages),
              except  for  the  output of scripts and ifconfig commands, which
              will go to /dev/null unless otherwise  redirected.   The  syslog
              redirection  occurs  immediately  at  the point that --daemon is
              parsed on the command line even though the  daemonization  point
              occurs  later.   If one of the --log options is present, it will
              supercede syslog redirection.

              The optional progname parameter [...]

Méthode 4 : Parfois, il est raisonnable d'exécuter le script entier en tant que root.

Si vous avez un script qui exécute plusieurs actions en tant que root, il n'a aucune activité significative qui serait raisonnablement exécutée non en tant que root, et il n'y a jamais rien d'utile à venir de l'exécution du script en tant qu'utilisateur non root, alors le l'utilisateur du script devrait probablement l'exécuter en tant que root.

Si tel est le cas, vous devez supprimer sudodes commandes du script. Lorsque le script s'exécute en tant que root, il n'est pas nécessaire de le faire sudo. (Bien que la boîte utilisateur root, par défaut, exécutez une commande comme tout utilisateur , y compris lui - même avec sudoet n'a pas besoin d' un mot de passe pour le faire. Donc , si vous faites cas de congé de sudodans le script , alors il sera probablement encore du travail.)

Si vous avez des instances de sudodans le script qui sont réellement utilisées pour exécuter des commandes en tant qu'utilisateur autre que root (avec ), vous devez toujours conserver ces instances.-u user

Si l'intégralité du script est exécuté en tant que root, la plupart des méthodes typiques pour exécuter des commandes en arrière-plan s'appliquent, y compris l'ajout &et, si nécessaire, l'utilisation de nohup(que vous connaissez déjà). Pour cela, cependant, vous devriez toujours envisager sérieusement openvpnd' utiliser l' --daemonoption.

Eliah Kagan
la source
Une réponse incroyablement complète et réfléchie. Bien joué.
gwideman
2

TL; DR Exécutez-le en mode démon:openvpn --config Windscribe-Japan.ovpn --daemon

La transmission du nom de fichier de configuration (.ovpn) à la openvpncommande ne fonctionne que si aucune autre option n'est spécifiée. Si je spécifie une --daemonoption, openvpn essaie d'analyser le nom de fichier en tant que paramètre d'options et génère une erreur d'options: j'essaie d'analyser "Windscribe.ovpn" en tant que paramètre --option mais je ne vois pas de "-" en tête .

Répondre:

Pour éviter cela, le nom du fichier doit être spécifié avec --configoption. Par exemple openvpn --config Windscribe.ovpn --daemon,. Ensuite, suivez le syslog avec tail -f /var/log/syslog, pour une inspection plus approfondie.

Vous pouvez également vérifier la sortie avant et après de cette commande curl curl ifconfig.copour vous assurer que le VPN est connecté.

Remarque: Cela permettra au démon de fonctionner même après votre déconnexion de la session SSH.

RajaRaviVarma
la source
0

Vous pouvez simplement copier votre

Fichier .conf dans / etc / openvpn /

Demandez ensuite à «service openvpn @ confName start» de gérer tous les processus de démonisation et sudo pour vous.

Voir /unix//a/366680/198666

user18099
la source