Smartd가 실행될 때 쉘 스크립트는 빈 $USER 변수를 인쇄합니다.

Smartd가 실행될 때 쉘 스크립트는 빈 $USER 변수를 인쇄합니다.

smartd 데몬(smartmontools)을 생성하고 다음 명령으로 스크립트를 실행했습니다.

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

최상위 명령 출력을 보면 Smartd가 루트로 실행되고 있지만 /root에서 구성 파일을 찾을 수 없는 것으로 보입니다. $USER, $HOME, whoami,export USER=$(id -u -n) 명령은 아무것도, 심지어 빈 줄도 에코하지 않습니다. 터미널에서 수동으로 실행하면 현재 사용자 이름이 예상대로 인쇄됩니다. 스크립트는 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를 다시 시작하면 로그에서 오류가 발견되며 루트로 수동으로 수행하는 것과 달리 이메일이 전송되지 않습니다.

sudo systemctl restart smartd
journalctl -u smartd

이것은 Journalctl log의 출력입니다.

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

언급했듯이 내보내기 USER=$(id -u -n) 은 이미 $USER 변수를 설정한 것 같습니다. "gmail"은 /root/.mailrc 파일에 있는 구성 파일입니다. 루트가 아닌 사용자로 실행하면 사용자의 홈 디렉터리에 .mailrc 파일이 없기 때문에 동일한 오류가 발생합니다.

$USER 변수처럼 $HOME 변수를 어떻게 설정합니까? 파일을 찾을 수 없는 이유를 알려줄 수 있습니다.

답변1

마지막 문제는 Arch Linux에서 실행되는 쉘 스크립트에서 호출할 때 mailx루트 사용자의 파일을 읽을 수 없다는 것 입니다.smartdsystemd$HOME/.mailrc

이는 다음 요인으로 인해 발생합니다.

  • mailx아치 리눅스 에서는달팽이들HOME, 파일을 검색할 때 환경 변수에 의존합니다 .mailrc. 존재하지 않는 경우 HOME현재 작업 디렉토리가 사용됩니다.
  if ((cp = getenv("HOME")) == NULL)
      cp = "."; /* XXX 사용자 및 로그인 개체: pw->pw_dir */
  homedir = savestr(cp);

$user, $log 이름, $HOME, $SHELL

사용자 이름(2번), 홈 디렉터리 및 로그인 셸. 이러한 변수는 사용자 systemd 인스턴스를 포함하여 User=가 설정된 장치에 대해 설정됩니다.

HOME제공된 환경에 변수가 없고 해당 디렉터리에서 실행되었을 smartd가능성이 높으므로 파일 을 읽지 못했습니다./mailx/root/.mailrc

수정: 행 추가

export HOME=~

또는

export MAILRC=~/.mailrc

쉘 스크립트를 호출하기 전에mailx

또는 (내가 테스트하지 않음) 추가

User=root

장치 구성 파일 의 섹션 [Service].smartd.service

관련 정보