Как настроить системный журнал в SuSE 12

Предполагая, что вы используете Томаса Кенига atв системе glibc (Linux )(теперь , которую поддерживает Хосе Каларис ), это возможно, но не задокументировано четко, изat(1):

If the file /var/run/utmp is not available or corrupted, or if the user is not logged on at the time at is invoked, the mail is sent to the userid found in the environment variable LOGNAME. If that is undefined or empty, the current userid is assumed.

Способ работы atзаключается в создании файла задания, который использует atd, первые три строки которого:

#!/bin/sh
# atrun uid=100 gid=100
# mail youruser 1

, где uid=100, gid=100и youruserопределяются программно при создании задания. Логика определения имени пользователя такова:

  1. звонокgetlogin()
  2. если это вызов NULLgetenv("LOGNAME")
  3. проверьте, существует ли имя, позвонивgetpwnam()
  4. если это вызов NULLgetpwuid(real_uid)
  5. если это NULL, выбросьте все игрушки из коляски

Итак, как мы можем убедить getlogin()вернуть NULL, чтобы использовать переменную LOGNAME? Один из способов состоит в том, чтобы сделать так, чтобы stdin , а не был терминалом (, поэтому я предполагаю, что glibc,getlogin()ведет себя по-разному в разных системах ).

Для этого изbash:

LOGNAME=backup at 19:52 -m <<< uptime
echo uptime | LOGNAME=backup at 19:52 -m 

Суть в том, чтобы использовать перенаправление для представления команды (s )на stdin для запуска at.(atтакже выполняет повторное открытие стандартного ввода, если вы используете его -fпараметр, хотя слишком поздно, чтобы использовать его здесь. )Вместо этого вы можете сохранить свою команду в файл или с помощью bash сохранить создание файла:

LOGNAME=backup at 19:52 -m -f <( echo uptime ) 0<&-

(0<&-закрывает стандартный ввод, < /dev/nullтакже будет работать)

Если ваш терминал (, screenилиtmux)игнорируетutmp(по конфигурации или из-за разрешений или проблем с помощником ), вы даже можете просто установить LOGNAMEи просто использовать atкак обычно. так как getlogin()не удастся. Вы можете определить, так ли это, найдя свой терминал, используя tty, а затем проверив w, чтобы убедиться, что вы правильно вошли в систему на этом tty, или попробуйте perl -E 'say getlogin()||"not-in-utmp";'.

(Просто для ясности: LOGNAME может быть только локальным именем пользователя, если вам нужна электронная почта для перехода в другое место, вам нужно будет использовать aliases/ .forward/ procmailи т. д.)

1
17.12.2020, 02:46
0 ответов

Теги

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