質問
ラズベリーパイを実行していて、数秒後に再起動するだけの実行可能ファイルを作成したいと考えています。(ssh 経由でトリガーし、実際の再起動が行われる前にログアウトする予定です)
次の内容の実行可能ファイルを C++ で作成しました。
#include <cstdlib>
int main () {
system("sleep 5");
system("reboot");
return 0;
}
結果の実行可能ファイルの ls -l:
---s--x--x 1 root ben 6191 Jan 10 15:42 reboot
私の計画は、バイナリの所有者として root と setuid ビットを組み合わせて使用し、どのユーザーでも再起動コマンドを実行できるようにすることでした。
残念ながら、これはうまくいかず、プログラムを実行すると次のようになります。
Failed to issue method call: Access denied
Must be root.
これが機能しない理由について何か説明はありますか?
もっと簡単な方法があるかもしれないことはわかっています。この質問は、なぜこの方法が機能しないのかを理解することを目的としています。
よろしくお願いします
解決
setuid
ビットとbash
のバージョンと同様の問題がありました。私の場合、解決策はこのようなプログラムを書くことでした:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
// circumvent busybox ash dropping privileges
uid_t uid = geteuid();
setreuid(uid, uid);
system("do something....");
return 0;
}
.
これがあなたも助けることを願っています。
他のヒント
あなたの質問に直接答えないのは、shutdown
を使用してユーザーがsudo
を実行できるようにする方法について説明しますか?使用できるオプションを指定することもできます(sudoers(5)
のマニュアルページを参照)。または適切な引数を持つラッパースクリプトを作成し、ユーザーがそれを実行させます。必要に応じて、適切な権限があるかどうかを確認し、sudo
を介して再実行してみてください。
#!/bin/sh
if test `id -u` -eq 0; then
# do your stuff - shutdown, poweroff, whatever
else
exec sudo $0 "$@"
fi
. によると これ 書類、 system()
実際に電話します /bin/sh
, 、一部のディストリビューションでは、Set-UID ビット オプションが無視されます。
使ってみてはいかがでしょうか exec()
それよりも system()
そして直接呼び出します /sbin/shutdown
?