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.
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 .
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.
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.
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 [...]
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
.
TL; DR Exécutez-le en mode démon: openvpn --config Windscribe-Japan.ovpn --daemon
Passer la configuration (.ovpn) nom_fichier à la commande openvpn
ne 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.
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.