私が書いたPython拡張機能は、単一のハードウェア初期化呼び出しを行うためにrootアクセスを必要とします。拡張機能でこの1回の呼び出しのためだけにスクリプト全体をルートとして実行したくないので、ユーザー特権にドロップして実際のスクリプトを実行する前に、この初期化を行うラッパーを作成したいと思います。
私はこのラッパーが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(「python」がないことに注意してください)