RaspberryPi에서 루트로 mutt를 통해 이메일 보내기

RaspberryPi에서 루트로 mutt를 통해 이메일 보내기

Raspberry Pi의 하드웨어에 액세스하려면 루트로 실행해야 하는 애플리케이션이 있습니다. 이 애플리케이션에서는 데이터가 포함된 첨부 파일이 포함된 이메일을 보내야 합니다.

mutt를 사용하여 이메일을 성공적으로 보내는 bash 스크립트를 작성할 수 있었습니다. C++ 코드를 사용한 빠른 테스트에서 이 스크립트를 호출할 수 있었고 성공적으로 실행되었습니다.

하지만 더 큰 프로젝트에 통합할 때 강제로 루트로 실행해야 했고 전송에 실패했습니다. 그런 다음 sudo를 사용하여 스크립트를 단독으로 실행하면 실패한다는 것을 알았습니다.

루트 사용자의 구성이 누락되어 있으며 일반적으로 사용되는 구성이 sudo와 함께 사용되지 않는다고 가정합니다. 사용자 구성과 관련하여 pi는 기본 설정입니다. 구성 세부사항을 사용하여 편집한 "muttrc" 파일을 /etc/, /etc/Mutt, /etc/mutt 및 /etc/.mutt에 배치하려고 했지만 이들 중 아무 것도 작동하지 않았습니다.

편집하다:

이메일 스크립트입니다

    #!/bin/bash  
    DATAFILE=$1  
    RECIPIENT=$2  
    echo "Sending email with data..."  
    echo "Recipient: " $RECIPIENT  
    echo "Attached file: " $DATAFILE  
    echo "" | mutt -s "Update" -i /home/pi/msgbody.txt $RECIPIENT -a $DATAFILE

이 스크립트는 인수가 제공되고 sudo 없이 터미널에서 직접 호출될 때 예상대로 실행됩니다. sudo를 사용하면 작동하지 않습니다. 나는 C 코드가 아니라 mutt 구성이 문제의 근본 원인(말장난 의도)이라고 생각하는 경향이 있습니다.

이것은 ls -l 권한의 출력입니다(유용한지 확실하지 않음).

-rwxr-xr-x  1 pi   pi    222 Mar 19 21:51 emailscript

기본 사용자는 pi라고 생각합니다

C++ 코드(sudo 없이 실행):

void sendFile()
{
    string command = "/home/pi/emailscript " + lastFile + " " + emailAddress;
    system(command.c_str());
}

int main()
{

    cout << "Testing file sending function" << endl;
    sendFile();

    return 0;

}

여기서 파일 이름과 이메일 주소는 위의 전역 변수로 초기화됩니다. 이는 sudo 없이 실행할 때 작동하지만 sudo로 실행하면 중지됩니다.

ls -l 이 코드에 대한 출력:

-rwxr-xr-x 1 pi pi 68540 Mar 19 22:49 emailTestCode

내가 아는 한, 주요 프로젝트는 프로세스입니다. 약 400줄의 코드이며 여러 라이브러리를 사용합니다. 메인 프로젝트의 권한은 위에 제공된 테스트 코드와 정확히 동일합니다.

편집 2: (C 대신 C++)

C++ 코드를 루트로 실행하면 std에 대한 예상 에코 출력이 생성됩니다(단지 내 이메일 주소와 파일 이름이므로 여기에는 포함되지 않음(파일에 대한 절대 경로 제공)).

표준 에러:

/home/pi/emailscript: line 8:  1911 Done                    echo ""
      1912 Alarm clock             | mutt -s "Update" -i /home/pi/msgbody.txt $RECIPIENT -a $DATAFILE

답변1

나는 이 문제를 해결하는 몇 가지 제안을 받았고, 어떤 사람들은 이것을 해결 방법으로 생각할 수도 있습니다.

스크립트가 사용자 Pi로 실행되도록 명령을 편집했습니다.

void sendFile()
{
    string command = "su pi -c \"/home/pi/emailscript " + lastFile + " " + emailAddress + "\"";
    system(command.c_str());
}

"올바른" 해결책은 /root에 mutt 구성을 포함시키는 것일 수도 있지만, 저에게는 효과가 없는 것 같습니다.

답변2

아직도 이 문제가 있는지는 모르겠지만 이 방법으로 문제가 해결되었습니다.

sudo sh -c "에코 >> /etc/Muttrc && cat /home/pi/.muttrc >> /etc/Muttrc"

sudo를 사용할 수 없는 mutt를 만났을 때 오류를 찾아보았지만 찾을 수 없었습니다. 어쨌든 그것은 /home/pi/.muttdebug0에 없고 /root/.muttdebug0을 봐야 한다는 것이 밝혀졌지만 "-d 2"를 사용해도 거기에는 오류가 없습니다. /home/pi/.muttdebug0에 비해 정보가 부족합니다. 마치 mutt가 sudo로 실행할 때 이메일을 보내려고 시도조차 하지 않은 것과 같습니다.

인터넷 검색 중 이 페이지를 발견하고 "/root에 mutt 구성 포함"이 트릭일 수 있다고 생각했지만 작동하지 않는다고 말하면 이유를 알 수 있습니다.

로그 파일 /root/.muttdebug0에는 오류가 표시되지 않지만 다음이 표시됩니다.구성 파일 "/etc/Muttrc"를 읽으십시오."

/home/pi의 구성 파일 이름과 달리 이 구성 파일 이름은 다음으로 끝나지 않습니다.. , 어쩌면 그게 당신에게 효과가 없었던 이유일까요? 파일 이름이 다르다는 사실을 모를 수도 있습니다. 그리고 대문자 M을 잊지 마세요;)

관련 정보