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

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

Например; я хочу проверить, имею ли я право дать команду завершения работы, прежде чем я на самом деле выпущу его.

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

-> doIhaveRightToIssue shutdown
-> Yes/No
18
задан 21 March 2017 в 07:51

5 ответов

Самый простой случай является случаем двоичного исполняемого файла как gzip. Во-первых, мы определяем местоположение исполняемого файла:

$ which gzip
/bin/gzip

Затем мы смотрим на атрибуты этого файла:

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

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

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

Затем существуют особые случаи как shutdown - это - действительно символьная ссылка на базовую утилиту, названную systemctl, который имеет ее собственные механизмы, чтобы определить, разрешают ли Вам назвать ее и попросить у Вас Вашего sudo пароля, если Вы не делаете, например.

(Об эти which команда: это определяет местоположение исполняемых файлов в Вашем $PATH, который Вам разрешают выполнить, и говорит Вам, какой Вы используете, если у Вас есть больше чем один с тем же именем в $PATH. Это не определяет местоположение просто никакого исполняемого файла. Я использую его здесь в качестве примера того, где искать разрешение. То, которое which находит исполняемый файл уже, указывает, что у Вас есть разрешение выполнить его.)

26
ответ дан 23 November 2019 в 02:03

С 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

Нахождение соответствующего действия является другим вопросом.

21
ответ дан 23 November 2019 в 02:03

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

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

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

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

8
ответ дан 23 November 2019 в 02:03

Используя 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. Снова, нет никакого общего способа знать это без ручного контроля, или выдачи команды и наблюдения результатов.

3
ответ дан 23 November 2019 в 02:03

Хорошо это может время от времени быть немного трудно...

В первую очередь, посмотрите на полномочия с ls -l...

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

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

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

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

+++

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

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

5
ответ дан 23 November 2019 в 02:03

Другие вопросы по тегам:

Похожие вопросы: