Без явного назначения прав программа или сценарий будут выполняться в качестве вызывающего абонента.
Setuid запускает программу с правами пользователя владельца файла. Setgid запустит программу с правами группы файловой группы. Ни то, ни другое не будет работать непосредственно для сценария.
Для запуска программы (или сценария) с правами, определенными в файле конфигурации sudo, можно использовать служебную программу, например sudo
.
Я считаю, что подсистемы безопасности, такие как SELinux, ограничивают доступ, а не предоставляют его.
Я не знаю, можно ли использовать ACL для предоставления прав выполнения. Мне никогда не нужно было расследовать.
-121--175028-
Исправление @ jimmij
первоначально я написал это с неправильной оболочкой в виду (bash вместо zsh). ниже отражает исправленный код
history | cut -c 8-
И далее, чтобы ограничить историю поддерживают определенное число линий, пробег
history - (history -20 prints the last 20 entries)
Наконец: история-20 | сократила-c 8-> Удар commands_list.sh
#!/bin/bash
#!/bin/zsh
в начале того файла, chmod +x commands_list.sh
, сделанный.
-121--120232-
Встроенная команда fc
позволяет извлекать команды из истории с помощью ряда критериев (подробнее см. man zshbuiltins
).
fc
означает «команда фиксации», и при вызове без параметров открывается редактор с последней введенной командой. Для изменения команды можно использовать все функции редактора, а при сохранении и выходе из zsh
выполняет фиксированную команду. По умолчанию используется редактор vi
, но его можно переопределить с помощью переменной оболочки EDITOR
или, если требуется использовать определенный редактор с помощью команды fc
, FCEDIT
.
fc
имеет много возможностей манипулировать историей за пределами последней команды, некоторые из которых предоставляют именно те возможности, которые вы просите.
Опция -l
«перечисляет» содержимое истории. По умолчанию в нем перечислены последние 16 команд, но можно указать нижнюю и верхнюю границы как индексы в истории или даже как начальный текст команды. Отрицательные индексы возвращаются из последней команды, чтобы извлечь последние 15 строк:
fc -l -15
По умолчанию fc -l
включает индексы истории в качестве первого столбца ее вывода. Если у вас есть точный диапазон, -n
сбрасывает числа так:
fc -ln -12 -5
будет извлекать только те строки (от 12 назад до 5 назад) в формате, подходящем для сценария.
Использование команд в качестве границ может быть очень полезным:
fc -l rm ls
перечисляет всю историю, начиная с последней rm
и заканчивая последней ls
(поэтому в выходных данных будет одна команда rm
, но может быть несколько команд ls
).
Существует много других вариантов, таких как добавление меток времени, замена частей команд,загрузка и сохранение частей истории, переключение всех стеков истории...
Ваша основная проблема заключалась в том, что mailx
при вызове из сценария оболочки, запущенного smartd
, запущенным systemd
в Arch Linux, не читал Файл $ HOME / .mailrc пользователя root .
Это было вызвано несколькими факторами:
mailx
в Arch Linux, s-nail , при поиске полагается на переменную среды HOME
для файла .mailrc
. Если HOME
нет, используется текущий рабочий каталог. if ((cp = getenv("HOME")) == NULL) cp = "."; /* XXX User and Login objects; Login: pw->pw_dir */ homedir = savestr(cp);
systemd
устанавливает HOME
только в том случае, если файл конфигурации объекта содержит параметр Пользователь
.
$ USER, $ LOGNAME, $ HOME, $ SHELL
Имя пользователя (дважды), домашний каталог и оболочка входа. Переменные устанавливаются для модулей, для которых установлено значение User =, включая пользовательские экземпляры systemd.
Поскольку в среде smartd
не было переменной HOME
, и она, вероятно, была запущена в каталоге /
, mailx
] не читал файл /root/.mailrc
.
Чтобы исправить: добавьте строку
export HOME=~
или
export MAILRC=~/.mailrc
в сценарий оболочки до того, как он вызовет mailx
, или (не проверено мной) добавьте
User=root
в [Service]
вашего файла конфигурации smartd.service
.