Предполагая, что вы используете Томаса Кенига 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
определяются программно при создании задания. Логика определения имени пользователя такова:
getlogin()
getenv("LOGNAME")
getpwnam()
getpwuid(real_uid)
Итак, как мы можем убедить 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
и т. д.)