Come eseguo uno script bash che richiede i privilegi di root?


15

Ho queste righe di script dal mio ISP:

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

Funziona se incollo riga per riga nel Terminale. Voglio creare un file * .command ed eseguirlo facendo doppio clic. Ma tutto quello che ottengo è la richiesta della password e quindi svuotare la finestra bash. Il file "opzioni" risultante è vuoto.

Ho provato questo:

#!/bin/bash

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

Ottengo:

/ etc / ppp / options: autorizzazione negata

Penso di aver bisogno di usare un comando per ottenere i privilegi di root da dentro bash.


Quando hai creato il tuo script, l'hai eseguito digitando sudo ./ispscript.command? Inoltre, gli script bash di solito hanno un suffisso .sh: ipscript.sh.
Lago Aaron,

1
FYI Questo script dovrebbe essere eseguito solo una volta. Inoltre, se continui a eseguire lo script così com'è, è APPENDING >> al file. Il file delle opzioni continuerà a crescere di dimensioni quanto più lo esegui (lo script). Ciò può o meno causare problemi con ciò che mai sta leggendo il file delle opzioni.
dhempler,

@ dennis.hempler, grazie lo so. In realtà eseguirò spesso questo script. Perché il dispositivo USB-modem necessita che questo file sia vuoto per funzionare correttamente. Quindi, prima di inserire il modem USB, cancello il file e prima di collegarmi a Internet via cavo scrivo quelle opzioni nel file.
Dmitriy,

Risposte:


15

Prendi lo script che hai creato:

#!/bin/bash

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

Salvalo nella tua home directory o in una directory 'script' nella tua home directory, come l2tp.sh. Consentire l'esecuzione (scrivere questo comando nel Terminale):

chmod 700 ~/path/to/l2tp.sh

Per eseguire il file utilizzando sudo (privilegi di root):

Metodo n. 1. Nel tipo di terminale:

$ sudo ~/path/to/l2tp.sh

Metodo n. 2. Crea un file run_l2tp.command con questo contenuto:

sudo ~/path/to/l2tp.sh

Consentire l'esecuzione:

chmod u+x run_l2tp.command

Quando si fa doppio clic su run_l2tp.command e si immette la password, il file l2tp.sh verrà eseguito con i privilegi di root.

Alcune note:

  • Su sistemi come UNIX, ~ è l'abbreviazione di "mia home directory".
  • Chmod 700 renderà il file eseguibile solo da te. Per maggiori informazioni: vedi questa pagina di Wikipedia .
  • digitando 'sudo' prima che un comando esegua il programma usando i privilegi di root. Fai attenzione quando fai questo, possono succedere cose brutte se non sei sicuro di cosa stai facendo.
  • Ovviamente puoi omettere il / percorso / se hai salvato questo script direttamente nella tua home directory.

4

Salva questo:

#!/bin/bash

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

sul desktop in un file denominato script.sh.

Apri una finestra Terminale e digita:

sudo bash ~/Desktop/script.sh

Immettere la password quando richiesto e tutti i comandi nel file verranno eseguiti con privilegi di superutente.


4

Se per motivi di sicurezza, non vuoi che nessun utente del tuo sistema sia in grado di eseguire lo script, ma piuttosto ti viene richiesta una password amministrativa, una soluzione alternativa sarebbe quella di salvare lo script della shell e quindi utilizzare il programma AppleScript Editor per creare un AppleScript.

L'AppleScript sarebbe un one-liner, dicendo do shell script «your script's name here» with administrator privileges. Salvare quello script come un'applicazione. Quindi, quando fai clic su di esso, ti verrà richiesta una password amministratore, quindi esegui lo script della shell con i privilegi di amministratore.

Ovviamente, sostituiscilo «your script's name here»con il percorso della tua sceneggiatura.


2

Il problema è che quando lo fai dalla riga di comando, quello che stai facendo è iniziare bashsotto sudoe quindi inviare i successivi due comandi a bash, non alla shell originale. (il segno è che è necessario exitdue volte)

Quando lo fai in uno script, il bashcomando non termina mai, quindi i successivi due comandi non vengono mai eseguiti.

Non è elegante come la soluzione AppleScript, ma se lo farai come uno script dalla riga di comando, l'equivalente sarebbe:

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

Se non avessimo bisogno del reindirizzamento io (il >>bit), potremmo semplicemente chiamare il comando direttamente sudosenza bisogno del sudo sh -ctrucco. (e nota che ho dovuto citare l'argomento per sh -cimpedirgli di eseguire l'eco come root, ma il file è stato aggiunto come utente originale.)

Esso sarà lavorare come .commandfile dal Finder, ma sarà far apparire una finestra di terminale, che chiede la password e, se inserito correttamente, verrà eseguito i comandi. (supponendo che non ti sei autenticato di recente per sudo... se lo hai, verrà eseguito senza richiesta)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.