Есть ли способ определить, имею ли я как обычный пользователь право выдавать команду.
Например; Я хочу проверить, есть ли у меня право на команду выключения, прежде чем я действительно ее выполню.
Что-то вроде следующих команд
-> doIhaveRightToIssue shutdown
-> Yes/No
command-line
permissions
Бернхард Колби
источник
источник
sudo
) и выяснить. Команды текстового режима могут понадобитьсяsudo
и графические команды могут понадобитьсяgksudo
. Вы также можете проверить, где установлена командаwhich command
. Если в/sbin
или/usr/sbin
- вы можете ожидать, что команда нуждаетсяsudo
илиgksudo
.Ответы:
Самый простой случай - это двоичный исполняемый файл типа
gzip
. Сначала мы находим исполняемый файл:Затем мы смотрим на атрибуты этого файла:
Три x говорят нам, что файл может быть выполнен владельцем (первым
root
) или кем-либо в группеroot
(вторымroot
) и кем-либо еще, соответственно. Таким образом, ваш пользователь может выполнять программу.Тем не менее, ваш исполняемый файл может быть файлом сценария, который вызывает другие исполняемые файлы внутри. Вы можете выполнять скрипт, но не программы, вызываемые внутри него. Нет никакого способа определить, разрешено ли вашему пользователю делать это, кроме как на самом деле попробовать.
Кроме того, существуют особые случаи, такие как
shutdown
- это действительно символическая ссылка на базовую утилитуsystemctl
, которая имеет собственные механизмы, позволяющие определить, разрешено ли вам вызывать ее, и, например, запросить пароль sudo, если вы этого не сделаете. ,(О
which
команде: она находит исполняемые файлы в вашем $ PATH, которые вам разрешено выполнять, и сообщает вам, какой из них вы используете, если у вас более одного с таким же именем в $ PATH. Он не находит только исполняемый файл. I используйте его здесь как пример того, где искать разрешение. Тот факт, чтоwhich
исполняемый файл уже найден, указывает на то, что у вас есть разрешение на его выполнение.)источник
which
Команда должна быть достаточной для тех файлов, которые находятся в одном из каталогов, добавляемых в$PATH
переменную. Например, выполнениеsudo chmod 700 /bin/nano
илиsudo chmod 744 nano
приводитwhich
к выводу без вывода. Для локальных сценариев, которые находятся где-то, кроме одного изPATH
каталогов,ls -l
илиstat
вызовы добьются цели. Хороший ответ, но, пожалуйста, добавьте эту информацию в свой постstat -c '%a' /bin/gzip
чтобы получить755
.С
sudo
:Если у меня не было разрешения, я
sudo
буду жаловаться вместо показа команды.С помощью polkit вы проверяете действие, которое хотите запустить:
Поиск соответствующего действия - это другой вопрос.
источник
sudo -l
даже если вы не sudoer - в этом весь смысл-l
- чтобы сказать вам, можете ли вы запустить команду с sudo.Ты можешь использовать:
command -v shutdown
возвращает путь кshutdown
команде.test -x
проверяет, является ли этот путь исполняемым для вас.Обратите внимание, что, хотя вы можете выполнить команду, команда все равно может завершиться ошибкой, поскольку у нее недостаточно прав для выполнения задачи. Это распространенный случай в системах Unix-типа, которые вместо ограничения доступа для выполнения команды вместо этого ограничивают доступ к операциям, которые программы могут фактически выполнять.
источник
alias shutdown="shutdown now"
?$(which shutdown)
или$(shopt -u expand_aliases && command -v shutdown)
. Эта проблема появляется только в интерактивном режиме.Ну, иногда это может быть немного сложно ...
Прежде всего, посмотрите на разрешения с
ls -l
...Если в последнем / третьем триплете есть x («можно выполнить»), то другие - и это означает, что вы - можете выполнить его… Если это скрипт-сценарий или что-то в этом роде, тогда другим понадобится r (» читать тоже могу)
Если у других нет разрешения на выполнение, а есть у группы (второй триплет), вы можете выполнить его, если вы являетесь членом группы - в примере выше, bin . Например, колесная группа часто используется для ограничения того, кто может работать
su
, поэтому ее могут выполнять только пользователи, принадлежащие к этой группе. Другой пример - создание группы для разработчиков и ограничение выполнения C-компилятора и подобных инструментов для этой группы.Если после последнего триплета есть завершающий + , это означает, что используются AccessControllLists - это может добавить права на выполнение для дополнительных пользователей и групп.
+++
Даже если вы в состоянии выполнить команду, команда может зависеть от доступа к файлам, каталогам и / или устройствам, к которым у вас нет доступа - это может ограничить то, что вы сможете сделать (вы не сможете делать что-либо).
Наконец, хотя вам может быть разрешено выполнить команду, сама команда может проверить вашу личность и отказать вам в ее использовании, если вы не указаны в config-файле или не являетесь определенными пользователями (например, root ). Например,
mount
команда разрешит root только для монтирования любого устройства - обычным пользователям разрешено монтировать только те устройства, которые указаны как таковые в / etc / fstab ..., которые могут отсутствовать. Если вы не root и пытаетесь что-то монтировать,mount
будете жаловаться и отказываться монтировать устройство. Другой примерsudo
, который будет работать для всех, но только пользователям, перечисленным в / etc / sudoers, будет разрешено запускать вещи от имени пользователя root .источник
Использование
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
. Опять же, нет общего способа узнать это без ручного осмотра или выдачи команды и наблюдения за результатами.источник