Есть ли способ определить, имеет ли я как обычный пользователь право выдавать команду.
Например; Я хочу проверить, есть ли у меня право выдать команду shutdown, прежде чем я ее выпущу.
Что-то вроде следующих команд
-> doIhaveRightToIssue shutdown
-> Yes/No
С 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
Поиск соответствующего действия - это другой вопрос.
Вы можете использовать:
test -x $(command -v shutdown) && echo yes || echo no
command -v shutdown возвращает путь к команде shutdown. test -x проверяет, является ли этот путь для вас выполнимым.
Обратите внимание, что, хотя вы, возможно, сможете выполнить команду, команда может по-прежнему терпеть неудачу, потому что у нее есть недостаточное разрешение для выполнения задачи. Это обычный случай в системах Unix-типа, которые вместо того, чтобы ограничивать доступ к выполнению команды, вместо этого ограничивают доступ к операциям, которые действительно могут выполнять программы.
Ну, иногда это может быть немного сложно ...
Прежде всего, посмотрите разрешения с ls -l ...
owngrpotr user group command -rwxr-xr-x root bin vimЕсли последний / третий триплет получил в нем x («может выполнить»), затем другие - и это означает, что вы - можете выполнить его ... Если это скрипт оболочки или что-то в этом роде, тогда другим понадобится r («может читать») )
Если другие не получили разрешения на выполнение, но группа (вторая тройка) делает, то вы можете выполнить ее, если вы являетесь членом ] others - в примере over, bin. Например, колесная группа часто используется для ограничения того, кто может запускать su, поэтому только пользователи, принадлежащие к этой группе, могут выполнить ее вообще. Другим примером является создание группы для разработчиков и ограничение выполнения C-компилятора и таких инструментов для этой группы.
Если после последнего триплека существует x , это означает, что используются AccessControllLists - это может добавить права исполнения для дополнительных пользователей и групп.
+++
Даже если вы можете выполнить команду, команда может зависеть от доступ к файлам, каталогам и / или устройствам, к которым у вас нет доступа - это может ограничить то, что вы сможете сделать (возможно, вы ничего не сможете сделать).
Наконец, хотя вы может быть разрешено выполнить команду, сама команда может проверить вашу личность и отказаться от использования вами, если вы не указаны в конфигурационном файле или не являетесь определенными пользователями (например, group ). Например, команда mount разрешает root устанавливать любое устройство - обычным пользователям разрешено монтировать устройства, перечисленные как таковые в файле / etc / fstab ..., которые могут быть ничем. Если вы не bin и пытаетесь что-то монтировать, mount будет жаловаться и отказывать в монтировании устройства. Другим примером является sudo, который будет запущен для всех, но только пользователям, перечисленным в / etc / sudoers, будет разрешено запускать все как root.
Использование which, type, command и т. д. - это практическое решение, которое будет работать в 99% случаев, но чтобы быть на 100% уверенным, вам придется вручную проверять каждый исполняемый каталог, указанный в вашем $PATH. Многие оболочки (в том числе bash) будут префикс вашей команды entres из $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. Опять же, нет общего способа узнать, что без ручного контроля или выдачи команды и наблюдения за результатами.