Як я можу визначити, чи маю я дозвіл на запуск певної команди?


18

Чи є спосіб визначити, чи я як звичайний користувач маю право видавати команду.

Наприклад; Я хочу перевірити, чи маю я право видавати команду відключення, перш ніж я її фактично видаю.

Щось на зразок наступних команд

-> doIhaveRightToIssue shutdown
-> Yes/No

4
Прямий шлях - спробувати (без sudo) і з’ясувати. Команди текстового режиму можуть знадобитися, sudoа можуть знадобитися графічні команди gksudo. Ви також можете перевірити, де встановлена ​​команда which command. Якщо в /sbinабо /usr/sbin- ви можете очікувати, що команда потребує sudoабо gksudo.
sudodus

Відповіді:


26

Найпростіший випадок - такий бінарний виконуваний файл gzip. Спочатку ми знаходимо виконуваний файл:

$ which gzip
/bin/gzip

Потім ми розглянемо атрибути цього файлу:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Три x говорять нам про те, що файл може бути виконаний власником (першим root) або будь-ким із групи root(другим root) та ким-небудь, відповідно. Тож ваш користувач може виконувати програму.

Однак ваш виконуваний файл може бути файлом сценарію, який викликає інші виконувані файли всередині. Ви можете виконати сценарій, але не програми, викликані всередині нього. Немає способу визначити, чи дозволено це користувачеві, окрім того, як насправді це спробувати.

Тоді є спеціальні випадки на кшталт shutdown- це справді символічне посилання на основну утиліту systemctl, яка називається , яка має власні механізми, щоб визначити, чи вам дозволено її викликати, і запитати у вас пароль sudo, якщо ви цього не зробите, наприклад .

(Про whichкоманду: це знаходить виконувані файли у вашому $ PATH, які ви можете дозволити виконувати, і повідомляє вам, який з них ви використовуєте, якщо у $ PATH у вас є більше одного з тим самим іменем. Він не знаходить просто жодного виконуваного файлу. I використовуйте його тут як приклад того, де шукати дозвіл. Факт, що whichзнаходить виконуваний файл, вже вказує на те, що у вас є дозвіл на його виконання.)


Дуже лаконічна відповідь (+1). Наприклад, можна імітувати результат apt-get install з прапорцем -s (sudo apt-get install -s htop). Я подумав, якщо немає можливості дізнатися дозвіл команди перед тим, як видавати, є принаймні щось на кшталт "імітувати".
Бернхард Колбі

Звичайно, є утиліти, які надають прапор "сухого виконання" або "імітувати", який ви можете використовувати.
Джос

4
whichКоманда повинна бути достатньою для тих файлів, які перебувають в одному з каталогів, доданих до $PATHзмінної. Наприклад, виконання sudo chmod 700 /bin/nanoабо sudo chmod 744 nanoзмушення whichне давати результатів. Для локальних сценаріїв, які перебувають десь, крім одного з PATHкаталогів, ls -lабо statдзвінки, це зробить свою справу. Хороша відповідь, але будь ласка, додайте цю інформацію у свій пост
Сергій Колодяжний

Виконуючи те, що сказав Серг, використовуйте щось на зразок, stat -c '%a' /bin/gzipщоб отримати, 755наприклад.
AT

21

З sudo:

$ sudo -l shutdown
/sbin/shutdown

Якщо я не мав дозволу, sudoскаржиться, а не показує команду.

За допомогою polkit ви перевіряєте, чи потрібно діяти:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

Пошук відповідних дій - інше питання.


Проблема з судо полягає в тому, що я не судоє в системі. Через це я намагаюся бути обережним, перш ніж дійсно видавати команду.
Бернхард Колбі

4
@BernhardColby ти можеш сміливо бігати, sudo -lнавіть якщо ти не судоер - у цьому і полягає вся суть -l- сказати вам, чи можна виконувати команду з sudo.
muru

Дякую (+1), я цього не знав. Я спробую ваше рішення, як тільки я отримав свій ПК.
Бернхард Колбі

8

Ви можете використовувати:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdownповертає шлях до shutdownкоманди. test -xперевіряє, чи цей шлях можна виконати для вас.

Зауважте, що хоч ви могли б виконати команду, команда може все-таки вийти з ладу, оскільки вона має неадекватний дозвіл на виконання завдання. Це звичайний випадок у системах типу Unix, які замість обмеження доступу для виконання команди, а натомість обмежують доступ до операцій, які фактично можуть виконувати програми.


Що щодо напр. alias shutdown="shutdown now"?
Дмитро Григор’єв

Щоб уникнути проблеми з псевдонімами, можна використовувати $(which shutdown)або $(shopt -u expand_aliases && command -v shutdown). Ця проблема з’являється лише в інтерактивному режимі.
Девід Фоерстер

5

Ну, це може бути часом важко ...

Перш за все, подивіться на дозволи з ls -l...

 команда групи користувачів Owngrpotr
-rwxr-xr-x root bin vim

Якщо останній / третій триплет отримав у ньому x ("може виконати"), то інші - а це означає, що ви - можете виконати його ... Якщо це оболонка-скрипт чи щось подібне, то іншим знадобиться r (" може також читати ").

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

Якщо після останнього триплета є задні + , це означає, що використовуються AccessControllLists - це може додавати права виконання для додаткових користувачів та груп.

+++

Навіть якщо ви зможете виконати команду, команда може залежати від доступу до файлів, каталогів та / або пристроїв, до яких у вас немає доступу - це може обмежити те, що ви зможете робити (можливо, ви не зможете робити що-небудь).

Нарешті, хоча вам може бути дозволено виконувати команду, сама команда може перевірити вашу особу та відмовити вам у використанні, якщо ви не вказані у конфігураційному файлі чи певних користувачів (наприклад, root ). Наприклад, mountкоманда дозволить монтувати тільки root на будь-який пристрій - звичайним користувачам дозволено монтувати пристрої, перелічені як такі в / etc / fstab ..., які можуть бути жодними. Якщо ви не користуєтесь коренем і намагаєтеся щось монтувати, mountпоскаржиться та відмовиться монтувати пристрій. Ще один приклад - sudoце запуск для будь-кого, але тільки користувачі, перелічені в / etc / sudoers, фактично дозволять запускати речі як root .


3

Використовуючи which, type, і commandт.д. практичне рішення , яке буде працювати в 99% випадків, але бути 100% впевнені , що вам доведеться вручну перевіряти кожен виконуваний каталог , вказаний у вашому $PATH. Багато оболонок (у тому числі bash) будуть префіксувати вашу команду входами $PATHта намагатимуться виконувати ці файли повторно, поки вони не досягнуть успіху. Оскільки whichдійсно не можна виконати команду, неможливо передбачити, який файл буде дійсно обраний.

Наприклад, уявіть, що у мене є PATH=/opt/arm/bin:/binобидва каталоги, що містять виконувані файли, але для різних архітектур. Запуск which ddповернеться /opt/arm/bin/dd(якщо припустити, що я маю дозволи на його виконання), оскільки цей запис стане першим. Однак, коли я біжу ddв своїй оболонці, /bin/ddбуде виконана, тому що /opt/arm/bin/ddне вдасться запустити. Така ж ситуація може трапитися і у випадку зіпсованих двійкових файлів, відсутніх ліфтів тощо. Зрештою, немає жодного надійного способу дізнатися, чи зможете ви виконати команду чи ні, окрім спроб.

Ще один аспект - це те, що ви вважаєте "маючи дозволи". Як користувач, я маю дозволи на запуск, rm ~/fileале ні rm /root/file. Знову ж таки, немає загального способу знати, що без ручного огляду чи видачі команди та спостереження за результатами.

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