Чи повинні сценарії, які вимагають sudo, виходять з ладу, якщо вони не мають, або використовувати sudo та підказку?


26

У мене є сценарій, який дає мені тонкий контроль над яскравістю підсвічування і вимагає sudoзапуску. По суті це:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

і живе в ~/bin/backlight-adjust. Сценарію потрібні sudoпривілеї, оскільки tee $backlightвін пише в привілейоване місце. Тож воно вийде з ладу, якщо його не запустити sudo.

Такий підхід має проблеми, тому що я просто не можу працювати sudo backlight-adjust, тому що ~/binне в $PATHв sudoсередовищі, тільки в моєму оточенні. Тому мені доведеться бігати sudo env "PATH=$PATH" backlight-adjustчи щось подібне.

Як варіант, я міг би написати це так:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

і запропонуйте мені пароль.

Другий підхід для мене працює краще, тому що мені не потрібно пам’ятати набирати судо; це підкаже мене. І я можу зберегти $PATHнедоторканим. Це в цілому зручніше, але чи є причини, чому я не повинен робити це другим способом?

(Я запускаю Xubuntu 14.04, і моя оболонка - GNU bash 4.2.45, якщо це має значення.)


Дякуємо за виправлення. Я запускаю модифікований Debian (LMDE), і мій sudoфактично зберігає мою $PATHза замовчуванням, тому у мене немає цієї проблеми.
terdon

Відповіді:


27

Особисто я би застосував інший підхід. Створіть псевдонім для свого сценарію. Додайте цей рядок до свого ~/.bashrc(або еквівалента в інших оболонках)

alias backlight-adjust='sudo ~/bin/backlight-adjust'

Таким чином, вам не потрібно турбуватися про запам'ятовування, щоб запустити його, sudoі вам не потрібно додавати його sudoдо сценарію. Він буде для вас повністю прозорим і просто запитайте пароль при спробі запуску backlight-adjust.


Це здається дуже розумним підходом і таким, що має мінімальний вплив на решту системи. +1.
Джон Фемінелла

@JohnFeminella З іншого боку, якщо ви коли-небудь захочете поділитися цим сценарієм з ким-небудь ще, їм також знадобиться псевдонім. Особисто я не бачу жодних причин не вводити sudoфактичний сценарій, тим більше, що це дозволяє легко бачити, які елементи сценарію насправді вимагають кореневих прав.
Кайл Странд

@KyleStrand ні, вони не будуть. Команда, викликана сценарієм, просто скаржиться на відсутність доступу.
terdon

@terdon Я визнаю, що я міг бути трохи зрозумілішим, але, мабуть, ви знаєте, що я мав на увазі: одержувач сценарію зіткнеться з тією самою проблемою, яку спочатку зіткнувся автор сценарію, і як сумлінний подільник сценарію, автор повинен також діляться своїм особистим рішенням цієї дилеми щодо використання.
Кайл Странд

@KyleStrand так, але проблем не було. Єдиною проблемою, яка склалася в ОП, було те, що він не хотів "пам'ятати, щоб набрати sudo", крім цього, сценарій буде ідеально портативним. Моя думка, що псевдонім є абсолютно необов’язковим і нічого не вирішує, він просто полегшує використання.
тердон

7

Я не можу зрозуміти, чому це може бути неправильно --- хоча я, як правило, вважаю за краще, щоб команди не запитували мене, щоб вони могли писати сценарій. Ви можете налаштувати, /etc/sudoersщоб це sudoпрацювало без пароля.

Але ... чому б не додати

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

у своєму /etc/rc.localі забути sudo?

(Якщо ви можете користуватися Ubuntu, sudoви перебуваєте в групі судо , тому ви можете користуватися ним chgrp sudo /sys...і бути задоволеним.)


3

Можна також додати

Defaults        env_keep +="PATH"

у ваш /etc/sudoersфайл.


2

Ви заявляєте підсвічування судо-підсвітки, оскільки ~ / bin не знаходиться в $ PATH в середовищі sudo

То чому саме від цього залежати? Я думаю, ви повинні просто змінити цю лінію /home/user/bin/backlight-adjustі вона спрацює.

Але я дуже хотів би також рішення Тердона використовувати псевдонім. Або ви можете розмістити свій скрипт, /usr/bin/і він буде доступний для кожного користувача (включаючи root)


Так, але це прикро робити. В іншому випадку, який сенс ставити його в першу чергу в моєму $ PATH? Крім того, мені подобається мати його, ~/binтому що тоді він знаходиться в сховищі dotfiles мого будинку, тому він залишається в контролі версій.
Джон Фемінелла

@JohnFeminella, до речі, немає причин змінювати шлях, просто використовуйте -Eпрапор для збереження навколишнього середовища:sudo -E command
terdon

@terdon Це не працює в Debian; це скасовано з міркувань безпеки. Вам доведеться чітко передавати змінні середовища, як я вже згадував у своєму запитанні ( sudo env "PATH=$PATH" ...).
Джон Фемінелла

1

Не можу дати загальне правило ... якщо сценарій / програма призначена для певної перенастроювання (наприклад, принтера) і викликається постійними користувачами, це повинно. В іншому випадку я б достатньо добре залишився в спокої: Якщо звичайний користувач запускає його, просто не вдається (або в результаті явної перевірки, або просто тому, що йому не дозволяється щось робити).

Підвищені пільги слід надавати скупо, якщо взагалі. Перехід на більш високу привілей складний, краще залиште це експертам (тобто sudo(1)).


0

Я особисто використовую щось на зразок ${SUDO}у своїх сценаріях, щоб абонент міг встановити це за потреби або ${SUDO:-sudo}використовувати його за замовчуванням.

У вашому конкретному випадку я все-таки приймаю відповідь.


-1

Поставте сценарій (без sudo) у належне для користувача місцеположення, наприклад /bin, і виконайте це:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

Це працює, встановивши встановлений прапор, а це означає, що він завжди буде працювати як власник файлу. Детальніше читайте на http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/ . Я насправді не знаю все так багато про те, як це працює, я просто виявив, що це гуглінг, спираючись на те, що я думав, що прочитав кілька років тому.


1
Сценарії оболонки більше не можна налаштовувати, дякую добру ... Це абсолютно зла відповідь. Особливо безпечний.
mirabilos

@mirabilos Це єдино небезпечно, якщо прапор групи або загальний запис увімкнено. Ризик із налаштуванням полягає в тому, що кожен, хто має дозволи на запис файлу, може виконувати все, що завгодно, як якщо б він був користувачем, і тому ці дозволи на запис потрібно захистити. 4755означає, що завжди виконується як власник, власник може читати, писати та виконувати, група може читати та виконувати, а користувачі можуть читати та виконувати, що є стандартним рівнем дозволу для речей, яким будь-який користувач повинен робити дозволу на root.
AJMansfield

@mirabilos І думка про те, що сценарії оболонки з setuid вводять більше вразливостей, ніж бінарні файли з setuid, просто нерозумна; Бінарні файли також не застраховані від експлуатації ptrace, що є основним подвигом, який використовує перевагу налаштування.
AJMansfield

2
Усі поточні Unix-подібні ОС забороняють встановити сценарії. Це лише факт. Запитайте їх самі з причин, якщо ви мені не вірите. Почніть з OpenBSD.
mirabilos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.