Jak wykonać skrypt bash, który wymaga uprawnień roota?

15

Mam te wiersze skryptu od mojego ISP:

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

Działa, jeśli wkleję wiersz po wierszu w terminalu. Chcę utworzyć plik * .command i uruchomić go, klikając dwukrotnie. Ale dostaję tylko monit o hasło, a następnie puste okno bash. Wynikowy plik „opcji” jest pusty.

Próbowałem tego:

#!/bin/bash

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

Dostaję:

/ etc / ppp / options: Odmowa dostępu

Myślę, że muszę użyć jakiegoś polecenia, aby uzyskać uprawnienia roota od basha.

Dmitriy
źródło
Czy po utworzeniu skryptu wykonałeś go, wpisując sudo ./ispscript.command? Ponadto skrypty bash zwykle mają sufiks .sh: ipscript.sh.
Aaron Lake,
1
FYI Ten skrypt należy uruchomić tylko raz. Ponadto, jeśli nadal uruchamiasz skrypt w obecnej postaci, DODAWA SIĘ >> do pliku. Plik opcji będzie się powiększał wraz z jego uruchomieniem (skrypt). Może to powodować problemy z odczytaniem pliku opcji.
dhempler
@ dennis.hempler, dzięki, wiem to. Właściwie często uruchamiam ten skrypt. Ponieważ urządzenie USB-modem wymaga, aby ten plik był pusty, aby działał poprawnie. Dlatego przed włożeniem modemu USB usuwam plik i przed podłączeniem do przewodowego Internetu zapisuję te opcje w pliku.
Dmitriy,

Odpowiedzi:

16

Weź skrypt, który utworzyłeś:

#!/bin/bash

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

Zapisz go w katalogu domowym lub w katalogu „scripts” w katalogu domowym jako l2tp.sh. Pozwól na wykonanie (napisz to polecenie w Terminalu):

chmod 700 ~/path/to/l2tp.sh

Aby uruchomić plik przy użyciu sudo (uprawnienia roota):

Metoda nr 1. W typie terminala:

$ sudo ~/path/to/l2tp.sh

Metoda nr 2. Utwórz plik run_l2tp.command z następującą zawartością:

sudo ~/path/to/l2tp.sh

Pozwól na wykonanie:

chmod u+x run_l2tp.command

Po dwukrotnym kliknięciu polecenia run_l2tp.command i wpisaniu hasła plik l2tp.sh zostanie uruchomiony z uprawnieniami administratora.

Niektóre uwagi:

  • W systemach takich jak UNIX ~ jest skrótem od „mój katalog domowy”.
  • Chmod 700 sprawi, że plik będzie wykonywalny tylko przez ciebie. Aby uzyskać więcej informacji: zobacz tę stronę w Wikipedii .
  • wpisanie „sudo” przed wykonaniem polecenia spowoduje uruchomienie programu z uprawnieniami administratora. Zachowaj ostrożność, ponieważ mogą się zdarzyć złe rzeczy, jeśli nie jesteś pewien, co robisz.
  • Oczywiście możesz pominąć / path / to, jeśli zapisałeś ten skrypt bezpośrednio w swoim katalogu domowym.
Aaron Lake
źródło
4

Zachowaj to:

#!/bin/bash

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

na pulpicie w pliku o nazwie script.sh.

Otwórz okno terminala i wpisz:

sudo bash ~/Desktop/script.sh

Po wyświetleniu monitu wprowadź hasło, a wszystkie polecenia w pliku będą uruchamiane z uprawnieniami superużytkowników.

Ian C.
źródło
4

Jeśli ze względów bezpieczeństwa nie chcesz, aby jakikolwiek użytkownik systemu mógł uruchomić skrypt, ale chcesz otrzymać monit o podanie hasła administracyjnego, alternatywnym rozwiązaniem byłoby zapisanie skryptu powłoki, a następnie użycie programu AppleScript Editor, aby utworzyć AppleScript.

Mówiąc, AppleScript byłby jednostronny do shell script «your script's name here» with administrator privileges. Zapisz ten skrypt jako aplikację. Następnie po kliknięciu poprosi o podanie hasła administratora, a następnie uruchom skrypt powłoki z uprawnieniami administratora.

Oczywiście zastąp «your script's name here»ścieżką do skryptu.

Daniel
źródło
2

Problemem jest, że gdy to zrobić z wiersza poleceń, co robisz zaczyna bashpod sudo, a następnie wysyłając te kolejne dwa poleceń bash, a nie oryginalnej powłoki. (znak, że musisz exitdwa razy)

Gdy robisz to w skrypcie, bashpolecenie nigdy nie kończy działania, więc kolejne dwa polecenia nigdy się nie uruchamiają.

Nie jest tak elegancki jak rozwiązanie AppleScript, ale jeśli zamierzasz to zrobić jako skrypt z wiersza poleceń, odpowiednikiem byłoby:

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

Gdybyśmy nie potrzebowali przekierowania io ( >>bit), moglibyśmy po prostu wywołać komendę bezpośrednio, sudonie potrzebując sudo sh -csztuczki. (i zwróć uwagę, że musiałem zacytować argument, aby sh -cnie uruchamiał echa jako root, ale plik był dołączany jako pierwotny użytkownik).

To będzie pracować jako .commandplik z Findera, ale to przywołać okno terminala, z prośbą o podanie hasła, a jeśli wpisany poprawnie, uruchom polecenia. (zakładając, że ostatnio nie uwierzytelniłeś się sudo... jeśli tak, uruchomi się bez monitowania)

Joe
źródło