Comment exécuter un script bash nécessitant des privilèges root?

15

J'ai ce script lignes de mon fournisseur de services Internet:

sudo bash
echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Cela fonctionne si je colle ligne par ligne dans Terminal. Je veux créer un fichier * .command et l'exécuter en double-cliquant dessus. Mais tout ce que je reçois, c'est l'invite du mot de passe puis la fenêtre bash vide. Le fichier "options" résultant est vide.

J'ai essayé ceci:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Je reçois:

/ etc / ppp / options: autorisation refusée

Je pense que je dois utiliser une commande pour obtenir les privilèges root à partir de bash.

Dmitriy
la source
Lorsque vous avez créé votre script, l'avez-vous exécuté en tapant sudo ./ispscript.command? En outre, les scripts bash ont généralement un suffixe .sh: ipscript.sh.
Aaron Lake
1
FYI Ce script ne doit être exécuté qu'une seule fois. De plus, si vous continuez à exécuter le script tel quel, il est ajouté >> au fichier. La taille du fichier d'options continuera de croître à mesure que vous l'exécutez (le script). Cela peut ou non causer des problèmes avec la lecture du fichier d’options.
dhempler
@ dennis.hempler, merci, je le sais. En fait, je vais souvent exécuter ce script. Parce que le périphérique modem USB a besoin de ce fichier vierge pour fonctionner correctement. Donc, avant d'insérer un modem USB, j'efface le fichier et avant de me connecter à Internet par câble, j'écris ces options dans le fichier.
Dmitriy

Réponses:

15

Prenez le script que vous avez créé:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Enregistrez-le dans votre répertoire personnel ou dans un répertoire "scripts" dans votre répertoire personnel, sous le nom l2tp.sh. Autorisez-le à être exécuté (écrivez cette commande dans Terminal):

chmod 700 ~/path/to/l2tp.sh

Pour exécuter le fichier en utilisant sudo (privilèges root):

Méthode n ° 1. Dans le type de terminal:

$ sudo ~/path/to/l2tp.sh

Méthode n ° 2 Créez un fichier run_l2tp.command avec ce contenu:

sudo ~/path/to/l2tp.sh

Permettez qu'il soit exécuté:

chmod u+x run_l2tp.command

Lorsque vous double-cliquez sur run_l2tp.command et entrez le mot de passe, le fichier l2tp.sh sera exécuté avec les privilèges root.

Méthode n ° 3 Si, pour des raisons de sécurité, vous ne souhaitez pas qu'un utilisateur de votre système puisse exécuter le script, mais plutôt un mot de passe administrateur, vous pouvez également enregistrer le script shell, puis Utilisez le programme AppleScript Editor pour créer un AppleScript.

Le AppleScript serait un one-liner, en disant do shell script «your script's name here» with administrator privileges. Enregistrez ce script en tant qu'application. Ensuite, lorsque vous cliquez dessus, il vous demandera un mot de passe administrateur, puis exécutera le script shell avec les privilèges d'administrateur.

Évidemment, remplacez «your script's name here»par le chemin d'accès à votre script.

Quelques notes:

  • Sur les systèmes UNIX, ~ est l'abréviation de "mon répertoire personnel".
  • Chmod 700 ne rendra le fichier exécutable que par vous. Pour plus d'informations: voir cette page Wikipedia .
  • taper 'sudo' avant qu'une commande exécute le programme en utilisant les privilèges root. Soyez prudent lorsque vous faites cela, de mauvaises choses peuvent arriver si vous n'êtes pas sûr de ce que vous faites.
  • Évidemment, vous pouvez omettre le / path / to si vous avez enregistré ce script directement dans votre répertoire personnel.
Aaron Lake
la source
Pourquoi avez-vous annulé mes modifications? Dans ma question, je parlais du double-clic sans exécuter de terminal et de la saisie manuelle. Et édité votre réponse de manière appropriée.
Dmitriy
Réappliquez vos modifications.
Aaron Lake
3

Sauvegarde ça:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

sur votre bureau dans un fichier nommé script.sh.

Ouvrez une fenêtre de terminal et tapez:

sudo bash ~/Desktop/script.sh

Entrez votre mot de passe lorsque vous y êtes invité et toutes les commandes du fichier s'exécuteront avec des privilèges de super utilisateur.

Ian C.
la source
Il est élégant de passer le script (avec les autorisations éventuelles) à un exécutable doté des autorisations appropriées.
bmike
@ Peugeotavros m'a manqué que vous ne vouliez cliquer que sur. Opps. Appréciez le vote cependant.
Ian C.
1

Si, pour des raisons de sécurité, vous ne souhaitez pas qu'un utilisateur de votre système puisse exécuter le script, mais plutôt un mot de passe administratif, vous pouvez également enregistrer le script shell, puis utiliser le programme. AppleScript Editor pour créer un AppleScript.

AppleScript serait un one-liner, en disant do shell script «your script's name here» with administrator privileges. Enregistrez ce script en tant qu'application. Ensuite, lorsque vous cliquez dessus, il vous demandera un mot de passe administrateur, puis exécutera le script shell avec les privilèges d'administrateur.

Évidemment, remplacez «your script's name here»par le chemin d'accès à votre script.

Daniel
la source
1
Ceci est identique à la méthode sudo. Avec sudo, vous devez avoir un compte de niveau administrateur. Ce que vous suggérez prend un script et l'enveloppe dans un script.
Aaron Lake
Non, ce n'est pas identique. Cela prend un script Terminal et l'encapsule dans un script d'interface graphique - ainsi, l'utilisateur n'a jamais à se familiariser avec le terminal. Un mot de passe lui est demandé dans l'interface graphique familière du Mac et non dans une fenêtre de terminal. Pour un utilisateur technique, cela peut sembler être la même chose; pour la plupart des utilisateurs finaux, ne pas avoir à utiliser Terminal fait toute la différence.
Daniel
1
Vous avez parlé de "pour des raisons de sécurité". Si c'était pour la facilité d'utilisation, vous auriez dû le mentionner. Quoi qu'il en soit, plus de solutions valent mieux qu'aucune.
Aaron Lake
La solution la plus utilisable par l'utilisateur final serait de créer un fichier binaire pouvant appeler setuid, de l'exécuter en tant que superutilisateur et d'appeler le fichier de script afin que l'utilisateur final double-clique sur quelque chose et que le résultat souhaité se produise. Il existe cependant des failles de sécurité de la taille de l’Oklahoma dans cette solution. Il s’agit donc d’une amélioration de la sécurité.
Daniel
1
@DanielLawson, j'ai créé un fichier texte avec le contenu suivant: créer un script shell "~ / vpn_enable.sh" avec des privilèges d'administrateur. Puis renommé en fichier .app. Lorsque je double-clique dessus, je reçois: Vous ne pouvez pas ouvrir l'application AppleScritpTest.app car l'environnement Classic n'est plus pris en charge.
Dmitriy
1

Le problème est que lorsque vous le faites à partir de la ligne de commande, vous commencez bashpar ce que vous faites sudo, puis vous envoyez les deux commandes suivantes à bash, pas le shell original. (le signe étant que vous devezexit deux fois)

Lorsque vous le faites dans un script, le bash commande ne se ferme jamais. Les deux commandes suivantes ne s'exécutent donc jamais.

Ce n'est pas aussi élégant que la solution AppleScript, mais si vous voulez le faire en tant que script depuis la ligne de commande, l'équivalent serait:

#!/bin/sh --
sudo bash -c 'echo "plugin L2TP.ppp">>/etc/ppp/options' 
sudo bash -c 'echo "l2tpnoipsec">>/etc/ppp/options'

Si nous n'avions pas besoin de la redirection io (le >>bit), nous pourrions simplement appeler la commande directement via sudosans avoir besoin de l' sudo sh -castuce. (Et notez que je devais citer l'argument pour l' sh -cempêcher d'exécuter l'écho en tant que root, mais en ajoutant le fichier en tant qu'utilisateur d'origine.)

Il va travailler en tant que .commandfichier à partir du Finder, mais il va faire apparaître une fenêtre de terminal, vous demandant votre mot de passe, et si correctement saisi, va exécuter les commandes. (en supposant que vous ne vous êtes pas authentifié récemment pour sudo... si vous l'avez fait, cela se déroulera sans invite)

Joe
la source