私が書いたPythonの拡張機能は、単一のハードウェアの初期化呼び出しを行うにはrootアクセスが必要です。私はむしろ、私の拡張でこの1つの呼び出しのためだけにrootとしてスクリプト全体を実行しないので、ユーザ権限に落として実際のスクリプトを実行する前に、この初期化を行うラッパーを書きたいと思います。setuidラッパーに関する考慮事項
このラッパーはsudo
経由で実行されるために、私は私のようなもの(はバグのカップルを修正するために更新)を考慮した例
$ sudo devwrap python somescript.py
、つもり:だから私は持っている
int main(int argc, char * argv[])
{
if(argc < 2) return 0;
int res = do_hardware_init();
if(res != OK_VALUE)
{
// Print error message
return HW_ERR;
}
const char *sudo_uid = getenv("SUDO_UID");
if(sudo_uid)
{
int real_uid = (int) strtol(sudo_uid, NULL, 0);
setuid(real_uid);
}
return execvp(argv[1], &argv[1]); // No return if successful
}
を3つの質問:
- これは正常に見えますか?私は通常、* uid()呼び出しを混乱させる必要はないので、私は通常の落とし穴に精通していません。
execvp
コールも少し奇妙に見えますが、私が見る限り、適切な場所に引数があります)。 execvp
のマニュアルページにはがあります。 "environアレイはアプリケーションによって直接アクセスされるべきではありません" -getenv
は悪い考えですか?execvp
より良いコールがありますので、私はsudo devwrap somescript.py
(「パイソン」のノート不在)を行うことができ、より下の正気の
*達成するための別の方法がないと確信していますか?いいえ、私はいないが、私は別の方法を考えることはできません。初期化コールがルートとして実行されない場合は、失敗して完全に停止します。私は*それがプロセス毎に必要であるとは思わない* – detly
...しかしそれは文書化されていない。私は驚くかもしれませんが、メモリマップされた制御レジスタのようです。 – detly
申し訳ありませんが、これを受け入れるには長い時間がかかります。私はあなたの助言を取り、SUIDルートに行くことに決めました。 – detly