我有一个应用程序需要以 root 身份运行才能访问 Raspberry Pi 上的硬件。在此应用程序中,我需要发送带有包含数据的附件的电子邮件。
我能够编写一个使用 mutt 成功发送电子邮件的 bash 脚本。在使用 C++ 代码的快速测试中,我能够调用此脚本并且它成功运行。
但是,当我将其集成到更大的项目中时,我被迫以 root 身份运行,但它无法发送。然后我注意到,如果我使用 sudo 单独运行脚本,它也会失败。
我假设 root 用户的配置丢失,并且通常使用的配置未与 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 则不起作用。我倾向于认为 mutt 配置是问题的根本原因(双关语),而不是 C 代码。
这是 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)
以 root 身份运行 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());
}
“正确的”解决方案可能是将 mutt 配置包含在 /root 中,但这似乎对我不起作用。
答案2
我不知道你是否仍然遇到这个问题,但这为我解决了这个问题:
sudo sh -c“echo >> /etc/Muttrc && cat /home/pi/.muttrc >> /etc/Muttrc”
当我遇到 mutt 无法使用 sudo 时,我尝试查找错误,但没有找到任何错误。无论如何,不在 /home/pi/.muttdebug0 中,结果我必须查看 /root/.muttdebug0 ,但那里也没有错误,即使使用“-d 2”也没有错误。只是与 /home/pi/.muttdebug0 相比缺乏信息,几乎就像 mutt 在使用 sudo 执行时甚至没有尝试发送电子邮件一样。
当谷歌搜索时,我遇到了这个页面,并认为“在 /root 中包含 mutt 配置”可能是诀窍,但你说它不起作用,我可能知道为什么。
日志文件 /root/.muttdebug0 没有显示任何错误,但它确实显示了以下内容:“读取配置文件“/etc/Muttrc”。”
与 /home/pi 中的配置文件名不同,该配置文件名不以。 ,也许这就是它对你不起作用的原因?您可能不知道文件名是不同的,哦,不要忘记大写的 M ;)