J'essaie de créer un script qui démarre au démarrage pour se connecter à mon VPN personnel.
J'ai un fichier d'initialisation: /etc/init.d/vpnstartup
qui appelle mon script vpnon.sh au démarrage avec les commandes:
case "$1" in
start)
su username -c $VPN_DIR/vpnon.sh
;;
dans mon script vpnon.sh, certaines commandes nécessitent l'exécution d'autorisations root:
sudo iptables -A INPUT -i pptp -j ACCEPT
sudo iptables -A OUTPUT -o pptp -j ACCEPT
J'accorde les autorisations du fichier vpnstartup init et du script vpnon.sh avec chmod 775 lorsque j'essaie mon fichier init en l'appelant à l'aide de ./vpnstartup start
J'obtiens l'erreur suivante lorsque la commande sudo iptables est appelée
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
Ce que je pense, c'est que la commande sudo nécessite un mot de passe, mais ne permet pas de l'obtenir.
La seule solution que j'ai trouvée a été d'ajouter le NOPASSWD :ALL option
fichier au fichier sudoers sous mon nom d'utilisateur.
Pour des raisons de sécurité, je ne souhaite pas utiliser cette méthode s'il existe une meilleure solution.
S'il vous plaît laissez-moi savoir si vous pouvez m'aider avec ce problème; J'ai passé de nombreuses heures dessus.
la source
su
partir de la racine dans votre script d'initialisation pour exécuter un script qui vous oblige àsudo
revenir à la racine: ne pouvez pas vous organiser votre script (s) pour éviter cela?Réponses:
Je pense que l'un des facteurs clés ici est que, comme un script est exécuté avec sudo, il peut faire tout ce que root peut faire. Le problème est que les autres commandes sudo de ce script n'héritent pas nécessairement des droits d'accès root, mais sont exécutées en tant qu'utilisateur contrôlant. Cela peut souvent produire l’erreur que vous voyez de sudo, même si le script parent lui-même est autorisé via sudo mais que les sous-commandes ne le sont pas.
Ce qui se passe, c’est que l’appel sudo imbriqué dans ce script échoue car sudo devrait normalement demander un mot de passe, mais il n’existe aucun shell de contrôle qui le permette. Cela génère l'
sudo: no tty present and no askpass program specified
erreur légèrement ambigu que vous voyez.Un moyen simple d’illustrer ceci est si, comme dans votre exemple, un script init contient des appels internes utilisant sudo. Fonctionnement:
peut échouer si votre propre utilisateur ne dispose pas des droits sudo sur tous les appels sudo au sein de celui-ci et risque de vous donner l'erreur sudo tty. Cependant, l'exécuter comme ceci:
fonctionnerait probablement. Dans ce dernier cas,
sudo sh
un shell de commande est créé en tant que root. Par conséquent, tout ce qui est exécuté dans ce shell est exécuté en tant que root. Root dispose généralement d'autorisations sudo illimitées, il n'est donc plus important si une commande est exécutée avec sudo ou non.Quelques points à noter:
sudo sh
peut résoudre le problème, mais cela entraîne également des problèmes de sécurité. Considérez que sudo se comporte de cette manière comme une vérification de cohérence, afin de s’assurer que le contenu du script ne fait pas ce qu’il ne devrait pas, même si le script lui-même est autorisé.la source
J'ai trouvé la solution au problème.
J'ai supprimé toutes les commandes sudo de mon script vpnon.sh et les ai passées dans sudo de l'extérieur du script.
Dans mon fichier /etc/init.d/vpnstartup, j'ai changé
su username -c
à cesudo $VPN_DIR/vpnon.sh
qui ressemble à ceci maintenant:puis appelé
sudo update-rc.d vpnstartup defaults
et maintenant le VPN se connecte au démarrage!:)
la source