Wie führe ich ein Bash-Skript aus, für das Root-Rechte erforderlich sind?

15

Ich habe diese Skriptzeilen von meinem ISP:

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

Es funktioniert, wenn ich Zeile für Zeile in das Terminal einfüge. Ich möchte eine * .command-Datei erstellen und per Doppelklick ausführen. Aber alles was ich bekomme ist eine Passwortabfrage und dann ein leeres Bash-Fenster. Die resultierende "options" -Datei ist leer.

Ich habe es versucht:

#!/bin/bash

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

Ich bekomme:

/ etc / ppp / options: Berechtigung verweigert

Ich denke, ich muss einen Befehl verwenden, um Root-Rechte von innerhalb der Bash zu erhalten.

Dmitriy
quelle
Wenn Sie Ihr Skript erstellt haben, haben Sie es ausgeführt, indem Sie sudo ./ispscript.command eingegeben haben? Bash-Skripte haben normalerweise das Suffix .sh: ipscript.sh.
Aaron Lake
1
FYI Dieses Skript sollte nur einmal ausgeführt werden müssen. Wenn Sie das Skript so ausführen, wie es ist, wird es >> an die Datei angehängt. Die Optionsdatei wird immer größer, je mehr Sie sie ausführen (das Skript). Dies kann zu Problemen beim Lesen der Optionsdatei führen oder auch nicht.
Dhempler
@dennis.hempler, danke das weiß ich. Eigentlich werde ich dieses Skript oft ausführen. Da für ein USB-Modemgerät diese Datei leer sein muss, um ordnungsgemäß zu funktionieren. Bevor ich ein USB-Modem einsetze, lösche ich die Datei und bevor ich mich mit dem kabelgebundenen Internet verbinde, schreibe ich diese Optionen in die Datei.
Dmitriy

Antworten:

15

Nehmen Sie das Skript, das Sie erstellt haben:

#!/bin/bash

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

Speichern Sie es in Ihrem Ausgangsverzeichnis oder in einem Skriptverzeichnis in Ihrem Ausgangsverzeichnis unter dem Namen l2tp.sh. Lassen Sie die Ausführung zu (schreiben Sie diesen Befehl in Terminal):

chmod 700 ~/path/to/l2tp.sh

So führen Sie die Datei mit sudo aus (Root-Rechte):

Methode 1. Im Terminaltyp:

$ sudo ~/path/to/l2tp.sh

Methode # 2. Erstellen Sie eine Datei run_l2tp.command mit folgendem Inhalt:

sudo ~/path/to/l2tp.sh

Lassen Sie es ausführen:

chmod u+x run_l2tp.command

Wenn Sie auf run_l2tp.command doppelklicken und das Kennwort eingeben, wird die Datei l2tp.sh mit Root-Rechten ausgeführt.

Einige Notizen:

  • Auf UNIX-ähnlichen Systemen steht ~ für "Mein Home-Verzeichnis".
  • Chmod 700 macht die Datei nur für Sie ausführbar. Weitere Informationen finden Sie auf dieser Wikipedia-Seite .
  • Wenn Sie vor einem Befehl 'sudo' eingeben, wird das Programm mit Root-Rechten ausgeführt. Seien Sie vorsichtig, wenn Sie sich nicht sicher sind, was Sie tun.
  • Natürlich können Sie den / path / to weglassen, wenn Sie dieses Skript direkt in Ihrem Home-Verzeichnis gespeichert haben.
Aaron Lake
quelle
4

Speichere das:

#!/bin/bash

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

auf Ihrem Desktop in einer Datei mit dem Namen script.sh.

Öffnen Sie ein Terminalfenster und geben Sie Folgendes ein:

sudo bash ~/Desktop/script.sh

Geben Sie Ihr Kennwort ein, wenn Sie dazu aufgefordert werden, und alle Befehle in der Datei werden mit Superuser-Berechtigungen ausgeführt.

Ian C.
quelle
4

Wenn Sie aus Sicherheitsgründen nicht möchten, dass ein Benutzer Ihres Systems das Skript ausführt, sondern zur Eingabe eines Administratorkennworts aufgefordert wird, können Sie das Shell-Skript auch speichern und dann das Programm verwenden AppleScript Editor zum Erstellen eines AppleScript.

Das AppleScript wäre ein Einzeiler do shell script «your script's name here» with administrator privileges. Speichern Sie das Skript als Anwendung. Wenn Sie darauf klicken, werden Sie nach einem Administratorkennwort gefragt. Führen Sie dann das Shell-Skript mit Administratorrechten aus.

Ersetzen Sie dies natürlich durch «your script's name here»den Pfad zu Ihrem Skript.

Daniel
quelle
2

Das Problem ist, dass Sie, wenn Sie es von der Befehlszeile aus tun, bashunter beginnen sudound dann die nächsten beiden Befehle an senden bash, nicht an die ursprüngliche Shell. (Das Zeichen ist, dass Sie exitzweimal müssen)

Wenn Sie dies in einem Skript tun, wird der bashBefehl nie beendet, sodass die nächsten beiden Befehle niemals ausgeführt werden.

Es ist nicht so elegant wie die AppleScript-Lösung, aber wenn Sie dies als Skript über die Befehlszeile ausführen, lautet das Äquivalent:

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

Wenn wir die io-Umleitung (das >>Bit) nicht benötigen , können wir den Befehl einfach direkt über aufrufen, sudoohne den sudo sh -cTrick zu benötigen . (und beachte, dass ich das Argument zitieren musste, um sh -czu verhindern, dass das Echo als root ausgeführt wird, aber die Datei als ursprünglicher Benutzer angehängt wird.)

Es wird als ein Werk .commandaus dem Finder - Datei, aber es wird ein Terminal - Fenster und fragt nach Ihrem Passwort bringen, und wenn sie richtig eingegeben, werden die Befehle ausgeführt werden . (Vorausgesetzt, Sie haben sich kürzlich nicht authentifiziert für sudo... Wenn ja, wird es ohne Aufforderung ausgeführt.)

Joe
quelle