web-dev-qa-db-fra.com

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

J'aimerais écrire un script qui appelle d'abord openvpn, suivi de ssh. Lorsque vous tapez la commande

Sudo openvpn ~/my_connection.ovpn

dans l'invite de commande, j'obtiens le résultat suivant:

...
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 est bloquante et le shell n'est pas publié. Afin de démarrer une connexion ssh après, je dois pousser le processus openvpn en arrière-plan en tapant Ctrl+Z suivi d'un bg.

Cependant, j'aimerais appeler l'étape de connexion openvpn et le ssh automatiquement en appelant uniquement mon fichier bash. Comment puis-je réussir à imiter le Ctrl+Z et bg étapes dans ce fichier?

J'ai essayé d'ajouter un & à la commande openvpn et de placer Nohup devant celle-ci. Ni fonctionne.

16
null

TL; DR: Utilisez Sudo -b ou, mieux, openvpn [...] --daemon.

Puisque vous exécutez openvpn (et, moins précisément, puisque vous souhaitez exécuter un programme en tant que root en arrière-plan), les informations les plus couramment distribuées sur la manière d'exécuter des commandes dans le répertoire arrière-plan ne répond pas à votre situation. Tu as dit:

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

Votre commande est:

Sudo openvpn ~/my_connection.ovpn

Dans la configuration par défaut de Sudo, si vous n'avez pas récemment saisi votre mot de passe pour Sudo dans le même contexte (pour une utilisation interactive, il s'agit généralement du même terminal), votre mot de passe vous sera demandé. Mais si vous exécutez la commande en arrière-plan en ajoutant &, la ligne [Sudo] password for user: ne s'affiche pas et vous ne pouvez pas la saisir.

Ainsi, dans cette situation, exécuter la commande, saisir votre mot de passe et l'envoyer ensuite à l'arrière-plan est un moyen 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 faire cela dans un script .

Way 1: Assurez-vous que Sudo a un nouvel horodatage.

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

Sudo -v

Ensuite, après cela, vous pourrez lancer:

Sudo openvpn ~/my_connection.ovpn &

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

Way 2: Utilisez Sudo -b. En général, c'est ce que vous voulez.

Au lieu de cela, vous pouvez exécuter Sudo lui-même au premier plan, mais passez l'indicateur -b afin que Sudo provoque 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 placez la commande dans un script. Avec Sudo -b vous n'obtenez pas contrôle du travail , mais dans un script Shell, le contrôle du travail est désactivé par défaut et vous ne devriez généralement pas l'utiliser .

Comme man Sudo explique:

-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 parce que rien ne fonctionne en arrière-plan jusqu'à après == Sudo a reçu votre mot de passe (si nécessaire) et a déterminé que vous êtes autorisé à exécuter la commande.

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

openvpn s'exécutera en arrière-plan automatiquement si vous l'exécutez avec l'option --daemon:

Sudo openvpn ~/my_connection.ovpn --daemon

Passez --daemon après votre .opvn nom_fichier plutôt qu'avant; L'argument suivant --daemon, le cas échéant, est interprété comme le nom que le processus démonisé openvpn doit utiliser. (Do not ajoutez également &.)

Que cela soit approprié ou non dépend de la nécessité ou non d'une interaction après l'exécution de openvpn mais avant sa démonisation. Et que dépend en partie de ce qui est configuré dans ~/my_connection.ovpn. Mais si openvpn ne peut pas immédiatement démoniser, tous les autres moyens de l'exécuter immédiatement en arrière-plan sont également inutilisables .

Par conséquent, dans les cas où vous savez que vous souhaitez que openvpn soit start exécuté en arrière-plan et que vous ne souhaitiez pas le ramener au premier plan, vous devez sérieusement envisager la méthode pour l'appeler avec l'option --daemon. Ceci est spécifique à openvpn--, la plupart des programmes ne supportent pas l'option --daemon, bien que de nombreux programmes serveur disposent d'une telle option. (Le nom et la syntaxe varient, cependant.)

Pour décider d'utiliser ou non cette option (et comment vous voulez l'utiliser), je vous recommande de lire la page de manuel openvpn , en particulier dans la section relative à --daemon. Il contient beaucoup d'informations utiles, et je ne fais que citer le premier paragraphe ici:

--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 [...]

Way 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 ne possède pas d'activité significative qui pourrait raisonnablement être exécutée not en tant que root, et il n'y a jamais rien d'utile à en tirer. En exécutant le script en tant qu'utilisateur non root, l'utilisateur du script devrait probablement l'exécuter en tant que root.

Si tel est le cas, vous devez supprimer Sudo des commandes du script. Lorsque le script est exécuté en tant que root, il n'est pas nécessaire d'utiliser Sudo. (Bien que l'utilisateur root puisse, par défaut, exécuter une commande comme n'importe quel utilisateur, y compris lui-même avec Sudo et n'a pas besoin d'un mot de passe pour le faire. Donc, si vous do laissez des instances de Sudo dans le script, cela fonctionnera probablement encore.)

Si le script contient des instances de Sudo utilisées pour exécuter des commandes en tant qu'utilisateur autre que root (avec -u user), vous devez toujours conserver celles .

Si tout le script est exécuté en tant qu'utilisateur root, la plupart des méthodes classiques permettant aux commandes de s'exécuter en arrière-plan s'appliquent, y compris en ajoutant & et, le cas échéant, l'utilisation de Nohup (que vous connaissez déjà ). Pour cela, cependant, vous devriez toujours fortement envisager d'utiliser openvpn avec l'option --daemon.

23
Eliah Kagan

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

Passer la configuration (.ovpn) nom_fichier à la commande openvpnne fonctionne que si aucune autre option n'est spécifiée. Si je spécifie l'option --daemon, openvpn tente d'analyser le nom du fichier en tant que paramètre d'options et jette Erreur d'options: j'essaie d'analyser "Windscribe.ovpn" en tant que paramètre --option, mais je ne vois pas un '-'.

Réponse:

Pour éviter cela, le nom du fichier doit être spécifié avec l'option --config. Par exemple, openvpn --config Windscribe.ovpn --daemon. Suivez ensuite le journal système avec tail -f /var/log/syslog, pour une inspection plus poussée.

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

Remarque: Le démon restera actif même après votre déconnexion de la session SSH.

2
RajaRaviVarma

Vous pouvez simplement copier votre

Fichier .conf dans/etc/openvpn /

Puis demandez à 'service openvpn @ confName start' de gérer tous les processus de démonisation et Sudo pour vous.

Voir https://unix.stackexchange.com/a/366680/198666

0
user18099