
Raspberry Piのハードウェアにアクセスするには、rootとして実行する必要があるアプリケーションがあります。このアプリケーションでは、データを含む添付ファイルを含む電子メールを送信する必要があります。
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を使用すると動作しません。私は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 ++コードをrootとして実行すると、stdの期待されるエコー出力が生成されます(ただし私のEメールアドレスとファイル名なので、ここには含まれません(ファイルへの絶対パスを提供します))。
標準エラー:
/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を忘れないでください;)