Question pptp (pon) échoue lorsqu'il est appelé via cron (debian)


J'ai un lien VPN PPTP numérotant de mon serveur Linux (debian) ici, à un serveur ISA2003 sur un site distant.

La connexion Internet aux deux extrémités est un peu louche, alors j’ai écrit un petit script pour appeler pon myvpnlink s'il détecte que le lien est tombé.

Ce script fonctionne bien si je l'exécute à partir de la CLI, mais s'il est appelé via cron, l'appel pon semble échouer.

J'ai réécrit ceci en bash et en perl et j'ai le même problème avec chacun. Le script est exécuté, il peut indiquer si le lien VPN est actuellement actif ou négatif, il appelle pon qui appelle pppd, qui ne parvient pas à se connecter. Si je vais ensuite exécuter le script à partir de la CLI, tout va bien.

Toutes les pensées seraient très appréciées - cela fait ma boîte maintenant.

#Syslog (on a failure):
Dec 30 17:02:01 LogServer /USR/SBIN/CRON[4530]: (root) CMD (/bin/bash /root/scripts/vpnup.bash >> /root/scripts/vpn.log)
Dec 30 17:02:01 LogServer pppd[4542]: pppd 2.4.4 started by root, uid 0
Dec 30 17:02:01 LogServer pppd[4542]: Couldn't get channel number: Input/output error
Dec 30 17:02:01 LogServer pppd[4542]: Exit.

#Cron Line
* * * * * root /bin/bash /root/scripts/vpnup.bash >> /root/scripts/vpn.log

Mettre à jour:

Fonctionne bien maintenant. J'appelais mon entrée cron via /etc/cron.d/vpn qui ressemblait à l'origine à:

MAILTO=root
* * * * * root /bin/bash /root/scripts/vpnup.pl >> /root/scripts/vpn.log

Maintenant que cela a été changé, PPTP fonctionne parfaitement :-D

MAILTO=root
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root perl /root/scripts/vpnup.pl >> /root/scripts/vpn.log

merci beaucoup à Justin pour ses exemples :)


7
2017-12-30 17:06


origine




Réponses:


Le message d'erreur que vous avez posté marque en quelque sorte un bogue dans pppd, cependant la situation que vous avez décrite "fonctionne à partir de shell mais pas de cron" est d'habitude liés à des problèmes de chemin.

Puisqu'il ne peut pas faire mal, pouvez-vous essayer d'ajouter ceci au sommet de votre crontab?

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

edit: une solution de contournement que vous pouvez utiliser, est que si cela fonctionne toujours à partir du shell, utilisez un autre script court

while true;do vpnup.sh;sleep 1m;done >> log

alors vous pouvez simplement commencer cela à l'écran avec quelque chose comme

screen -S vpn -d -m thatscript

5
2018-01-02 22:25



Merci pour la réponse. Je vais essayer d'ajouter des instructions de chemin dans l'entrée cron de mon script et voir s'il y a un changement. L’idée de créer une boucle est une bonne solution de contournement, même si j’essayais de l’éviter au cas où mon script se planterait ou quoi que ce soit. J'aime que vous appeliez mon script à partir d'un autre script, ce qui devrait renforcer votre résilience. Je me demandais si je devrais créer mon propre démon (à exécuter via init) qui surveille le VPN, ou est-ce que ce serait tout simplement excessif? - BuildTheRobots
oui, l'instruction path aide (et l'appeler via bash et perl est probablement utile aussi). Merci :-D - BuildTheRobots
Cool :-) Un démon est probablement excessif tant que cron fonctionne. J'ai tendance à utiliser daemontools ou pour des choses qui doivent fonctionner 24 heures sur 24, 7 jours sur 7 ou des choses qui doivent être exécutées par exemple, toutes les 10 minutes, mais qui peuvent prendre plus de 10 minutes. - Justin


Merci cela a fonctionné pour moi! Ma configuration ressemble maintenant à ceci ...

#!/bin/bash
result=`ifconfig | grep ppp0 | wc -l`
if [[ $result  != "1" ]]; then
pon hma
sleep 10
route add -net 0.0.0.0 ppp0 #Routes all traffic on the server through VPN (useful)
fi

Et mon cron ...

# m h  dom mon dow   command
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /home/foo/restart_vpn.sh

2
2017-07-11 06:12