Как мне выполнить скрипт bash, который требует привилегий root?

15

У меня есть этот скрипт строки от моего провайдера:

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

Это работает, если я вставляю построчно в Терминал. Я хочу создать файл * .command и запустить его, дважды щелкнув. Но все, что я получаю, это запрос пароля, а затем пустое окно bash. Полученный файл опций пуст.

Я попробовал это:

#!/bin/bash

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

Я получил:

/ etc / ppp / options: в доступе отказано

Я думаю, что мне нужно использовать какую-то команду, чтобы получить привилегии root изнутри bash.

Дмитрий
источник
Когда вы создали свой скрипт, вы выполняли его, набрав sudo ./ispscript.command? Кроме того, скрипты bash обычно имеют суффикс .sh: ipscript.sh.
Озеро Аарон
1
К вашему сведению: этот скрипт нужно запускать только один раз. Кроме того, если вы продолжите запускать скрипт как есть, он ПРИЛОЖИТ >> к файлу. Файл опций будет продолжать увеличиваться в размере, чем больше вы его запускаете (скрипт). Это может или не может вызвать проблемы с тем, что когда-либо читает файл опций.
dhempler
@ dennis.hempler, спасибо, я знаю это. На самом деле я буду часто запускать этот скрипт. Поскольку USB-модему требуется, чтобы этот файл был пустым для правильной работы. Поэтому перед установкой USB-модема я стираю файл, а перед подключением к проводному интернету я записываю эти опции в файл.
Дмитрий

Ответы:

16

Возьмите сценарий, который вы создали:

#!/bin/bash

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

Сохраните его в своем домашнем каталоге или в каталоге «scripts» внутри своего домашнего каталога, как l2tp.sh. Разрешить его выполнение (запишите эту команду в Терминале):

chmod 700 ~/path/to/l2tp.sh

Чтобы выполнить файл с помощью sudo (привилегии root):

Способ № 1. В терминале тип:

$ sudo ~/path/to/l2tp.sh

Способ № 2. Создайте файл run_l2tp.command с этим содержимым:

sudo ~/path/to/l2tp.sh

Позвольте этому быть выполненным:

chmod u+x run_l2tp.command

Если дважды щелкнуть run_l2tp.command и ввести пароль, файл l2tp.sh будет выполнен с правами суперпользователя.

Некоторые заметки:

  • В UNIX-подобных системах ~ означает «мой домашний каталог».
  • Chmod 700 сделает файл исполняемым только вами. Для получения дополнительной информации: см. Эту страницу Википедии .
  • введите sudo перед тем, как команда запустит программу с правами суперпользователя. Будьте осторожны при этом, могут случиться плохие вещи, если вы не уверены, что делаете.
  • Очевидно, вы можете опустить / путь / к, если вы сохранили этот скрипт прямо в вашем домашнем каталоге.
Озеро Аарон
источник
4

Сохранить это:

#!/bin/bash

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

на рабочий стол в файле с именем script.sh.

Откройте окно терминала и введите:

sudo bash ~/Desktop/script.sh

При появлении запроса введите пароль, и все команды в файле будут выполняться с привилегиями суперпользователя.

Ян С.
источник
4

Если в целях безопасности вы не хотите, чтобы какой-либо пользователь вашей системы мог запускать сценарий, а наоборот, вы хотите, чтобы вас попросили ввести пароль администратора, альтернативным решением было бы сохранить сценарий оболочки и затем использовать программу. Редактор AppleScript для создания AppleScript.

AppleScript будет однострочным, говоря do shell script «your script's name here» with administrator privileges. Сохраните этот скрипт как приложение. Затем, когда вы щелкните по нему, он попросит вас ввести пароль администратора, а затем запустите сценарий оболочки с правами администратора.

Очевидно, замените «your script's name here»путь к вашему сценарию.

Даниэль
источник
2

Проблема, что когда вы делаете это из командной строки, что вы делаете, начиная bashпод sudo, а затем отправить эти следующие две команды bash, а не оригинальной оболочки. (признак того, что вам нужно exitдважды)

Когда вы делаете это в скрипте, bashкоманда никогда не завершается, поэтому следующие две команды никогда не запускаются.

Это не так элегантно, как решение AppleScript, но если вы собираетесь сделать это как скрипт из командной строки, эквивалент будет:

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

Если бы нам не требовалось перенаправление io ( >>бит), мы могли бы просто вызвать команду напрямую, sudoне прибегая к sudo sh -cхитрости. (и обратите внимание, что мне пришлось процитировать аргумент, чтобы sh -cон не запускал эхо от имени пользователя root, но файл добавлялся как исходный пользователь.)

Он будет работать как .commandфайл из Finder, но откроет окно терминала, запрашивающее ваш пароль, и при правильном вводе запустит команды. (при условии, что вы недавно не sudoпроходили аутентификацию для ... если у вас есть, она будет проходить без запроса)

Джо
источник