Як виконати скрипт 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
FYI Цей сценарій потрібно запустити лише один раз. Крім того, якщо ви продовжуєте виконувати сценарій таким, яким він є, додаток >> до файлу. Файл параметрів надалі збільшуватиметься, чим більше ви будете запускати його (сценарій). Це може не спричинити проблеми з тим, що коли-небудь читає файл параметрів.
dhempler

@ dennis.hempler, дякую, я це знаю. Насправді я буду запускати цей сценарій часто. Оскільки для належного функціонування пристрою USB-модему цей файл повинен бути порожнім. Тому перед тим, як вставити USB-модем, я стираю файл і перед підключенням до дротового Інтернету записую ці параметри у файл.
Дмитро

Відповіді:


16

Візьміть створений вами сценарій:

#!/bin/bash

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

Збережіть його у своєму домашньому каталозі або у каталозі "скриптів" всередині вашого домашнього каталогу, як l2tp.sh. Дозвольте його виконати (напишіть цю команду в Термінал):

chmod 700 ~/path/to/l2tp.sh

Щоб виконати файл за допомогою sudo (root privileges):

Спосіб №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 буде виконаний з правами root.

Деякі примітки:

  • У таких системах, як UNIX, ~ - скорочення "моя домашня директорія".
  • Chmod 700 зробить файл виконуваним лише ви. Для отримання додаткової інформації: див. Цю сторінку Вікіпедії .
  • набравши 'sudo' перед командою, яка виконує програму, використовуючи привілеї root. Будьте обережні, роблячи це, погані речі можуть статися, якщо ви не впевнені, що робите.
  • Очевидно, що ви можете опустити / path / to, якщо ви зберегли цей скрипт безпосередньо у своєму домашньому каталозі.

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не запускати ехо як корінь, але файл, що додається як початковий користувач.)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.