Как я могу узнать, есть ли у меня разрешение на запуск определенной команды?

18

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

Например; Я хочу проверить, имеет ли я право выпустить команду shutdown , прежде чем я ее выпущу.

Что-то вроде следующих команд

-> doIhaveRightToIssue shutdown
-> Yes/No
    
задан Bernhard Colby 21.03.2017 в 14:28
источник

5 ответов

24

Самый простой случай - двоичный исполняемый файл, например 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 имеется более одного имени с таким же именем. найдите какой-либо исполняемый файл. Я использую его здесь как пример того, где искать разрешение. Тот факт, что which находит исполняемый файл уже указывает, что у вас есть разрешение на его выполнение.)

    
ответ дан Jos 21.03.2017 в 14:44
источник
21

С sudo :

$ sudo -l shutdown
/sbin/shutdown

Если у меня не было разрешения, sudo будет жаловаться вместо указания команды.

С polkit вы проверяете действие, которое хотите запустить:

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

Поиск соответствующего действия - это другой вопрос.     

ответ дан muru 21.03.2017 в 14:52
8

Вы можете использовать:

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

command -v shutdown возвращает путь к команде shutdown . test -x проверяет, является ли этот путь для вас выполнимым.

Обратите внимание, что хотя вы можете выполнить команду, команда может по-прежнему терпеть неудачу, поскольку она имеет недостаточное разрешение для выполнения задачи. Это обычный случай для систем Unix-типа, которые вместо того, чтобы ограничивать доступ к выполнению команды, вместо этого ограничивают доступ к операциям, которые действительно могут выполнять программы.

    
ответ дан Robie Basak 21.03.2017 в 19:54
5

Ну, иногда это может быть немного сложно ...

Прежде всего, просмотрите разрешения с ls -l ...

 owngrpotr  user  group  command
-rwxr-xr-x  root  bin    vim

Если последний / третий триплет получил в нем x («может выполнить»), то others - и это означает, что вы можете его выполнить ... Если это shell-скрипт или что-то в этом роде, тогда others потребуется r («читать»).

Если others не имеет разрешения на выполнение, но group (второй триплет), то вы можете выполнить его, если вы являетесь членом group - в примере выше, bin . Например, колесо -группа часто используется для ограничения того, кто может запускать su , поэтому только пользователи из этой группы могут вообще ее выполнить. Другим примером является создание группы для develop и ограничение выполнения C-компилятора и таких инструментов для этой группы.

Если после последнего триплека существует + , это означает, что используются AccessControllLists - это может добавить права выполнения для дополнительных пользователей и групп.

+++

Даже если вы можете выполнить команду, команда может зависеть от доступа к файлам, каталогам и / или устройствам, к которым у вас нет доступа - это может ограничить то, что вы сможете сделать (вы можете не сможет ничего сделать).

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

    
ответ дан Baard Kopperud 21.03.2017 в 18:27
3

Использование which , type , command и т. д. - это практическое решение, которое будет работать в 99% случаев, но чтобы быть на 100% уверенным, вам придется вручную проверять каждый исполняемый каталог, указанный в вашем %код%. Многие оболочки (в том числе $PATH ) будут префикс вашей команды entres из bash и попытаться выполнить эти файлы несколько раз, пока они не добьются успеха. Поскольку $PATH не может действительно выполнить команду, невозможно предсказать, какой файл будет действительно выбран вашей оболочкой.

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

Другим аспектом является то, что вы считаете «имеющим разрешения». Как пользователь, у меня есть разрешения на запуск /opt/arm/bin/dd , но не rm ~/file . Опять же, нет общего способа узнать, что без ручного осмотра или выдачи команды и наблюдения за результатами.

    
ответ дан Dmitry Grigoryev 22.03.2017 в 15:04