Сценарий оболочки, печатающий пустую переменную $USER при выполнении Smartd

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

Setuid запускает программу с правами пользователя владельца файла. Setgid запустит программу с правами группы файловой группы. Ни то, ни другое не будет работать непосредственно для сценария.

Для запуска программы (или сценария) с правами, определенными в файле конфигурации sudo, можно использовать служебную программу, например sudo .

Я считаю, что подсистемы безопасности, такие как SELinux, ограничивают доступ, а не предоставляют его.

Я не знаю, можно ли использовать ACL для предоставления прав выполнения. Мне никогда не нужно было расследовать.

-121--175028-

Исправление @ jimmij

первоначально я написал это с неправильной оболочкой в виду (bash вместо zsh). ниже отражает исправленный код

От этот ответ stackoverflow :

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 ).

Существует много других вариантов, таких как добавление меток времени, замена частей команд,загрузка и сохранение частей истории, переключение всех стеков истории...

0
08.03.2015, 09:51
1 ответ

Ваша основная проблема заключалась в том, что 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); 

$ USER, $ LOGNAME, $ HOME, $ SHELL

Имя пользователя (дважды), домашний каталог и оболочка входа. Переменные устанавливаются для модулей, для которых установлено значение User =, включая пользовательские экземпляры systemd.

Поскольку в среде smartd не было переменной HOME , и она, вероятно, была запущена в каталоге / , mailx ] не читал файл /root/.mailrc .

Чтобы исправить: добавьте строку

export HOME=~

или

export MAILRC=~/.mailrc

в сценарий оболочки до того, как он вызовет mailx

, или (не проверено мной) добавьте

User=root

в [Service] вашего файла конфигурации smartd.service .

1
28.01.2020, 02:51

Теги

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