Smartd 执行时 Shell 脚本打印空白 $USER 变量

Smartd 执行时 Shell 脚本打印空白 $USER 变量

我创建了一个 smartd 守护进程 (smartmontools) 按照下面的命令执行的脚本。

DEVICESCAN -a -m email -M test -M exec /usr/share/smartmontools/my-script -n stand...

查看 top 命令输出,Smartd 似乎正在以 root 身份运行,但无法在 /root 中找到配置文件。 $USER、$HOME、whoami、export USER=$(id -u -n) 命令不会回显任何内容,甚至不会回显空行。当在终端中手动执行时,它会按预期打印当前用户名。脚本被 chmod 为 700。

为什么会发生这种情况?

编辑:这是我想要运行的实际脚本。

#!/bin/sh

export USER=$(id -u -n)
echo $whoami
echo "USER: "
echo "$USER"
echo $HOME

EMAIL_EXEC="mailx"
EMAIL_ACCOUNT="gmail"
EMAIL_SUBJECT="simplified"
EMAIL_BODY="simplified"

echo "$EMAIL_BODY " | $EMAIL_EXEC -A $EMAIL_ACCOUNT -s "$EMAIL_SUBJECT" [email protected]

重新启动 smartd 后,会在日志中发现错误,并且不会发送电子邮件,这与以 root 身份手动执行不同。

sudo systemctl restart smartd
journalctl -u smartd

这是journalctl日志的输出:

Test of /etc/smartmontools/run.d/email to [email protected] produced unexpected output (69 bytes) to STDOUT/STDERR:
USER:
root
Account `gmail' does not exist.
No mail for root

正如您所提到的,export USER=$(id -u -n) 似乎已经设置了 $USER 变量。 “gmail”是 /root/.mailrc 文件中的配置文件。以非 root 用户身份运行时会产生相同的错误,因为用户主目录中缺少 .mailrc 文件。

如何像 $USER 变量一样设置 $HOME 变量?这可能会告诉您为什么找不到该文件。

答案1

您的最终问题是,当在 Arch Linux 上从由 运行、启动的mailxshell 脚本调用时,没有读取 root 用户的文件。smartdsystemd$HOME/.mailrc

这是由以下几个因素造成的:

  • mailxArch Linux 上,蜗牛HOME,查找文件时依赖环境变量.mailrc。如果HOME不存在,则使用当前工作目录。
  if ((cp = getenv("HOME")) == NULL)
      cp = "."; /* XXX 用户和登录对象;登录:pw->pw_dir */
  homedir = savestr(cp);

$用户、$日志名称、$HOME、$SHELL

用户名(两次)、主目录和登录 shell。这些变量是为设置了 User= 的单元设置的,其中包括用户 systemd 实例。

HOME由于提供给 的环境中没有变量smartd,并且它很可能是在该/目录中启动的,mailx因此没有读取该/root/.mailrc文件。

修复方法:添加行

export HOME=~

或者

export MAILRC=~/.mailrc

在调用 shell 脚本之前mailx

或(未经我测试)添加

User=root

到您的单元配置文件[Service]的节。smartd.service

相关内容