質問: シェルスクリプトでsetuidを許可する setuid許可ビットは、エグゼキューターではなく、所有者の有効なユーザーidでプログラムを実行するようにlinuxに指示します。> cat setuid-test.c #include <stdio.h> #include <unistd.h> int main(int argc, char** argv) { printf("%d", geteuid()); return 0; } > gcc -o setuid-test setuid-test.c > ./setuid-test 1000 > sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test > ./setuid-test 65534 ただし、これは実行可能ファイルにのみ適用されます。シェルスクリプトはsetuidビットを無視します。> cat setuid-test2 #!/bin/bash id -u > ./setuid-test2 1000 > sudo chown nobody ./setuid-test2; sudo chmod +s ./setuid-test2 > ./setuid-test2 1000 ウィキペディア 言う : セキュリティ上の欠陥の可能性が高まるため、多くのオペレーティングシステムは、実行可能なシェルスクリプトに適用されると、setuid属性を無視します。 私がそれらのリスクを受け入れる用意があると仮定して、実行可能ファイルと同じようにシェルスクリプトでもsetuidビットを同じように処理するようにlinuxに指示する方法はありますか?そうでない場合、この問題の一般的な回避策はありますか?現在の解決策は、sudoersエントリを追加して、allが特定のスクリプトを実行したいユーザーとして実行できるようにし、nopasswdを使用してパスワードプロンプトを回避することです。その主な欠点は、これを行うたびにsudoersエントリが必要になることと、呼び出し側がsudo some-scriptだけでなくsome-scriptを呼び出す必要があることです。
回答: この問題を解決する1つの方法は、setuidビットを使用できるプログラムからシェルスクリプトを呼び出すことです。 そのsudoのようなもの。たとえば、これはcプログラムでこれを実現する方法です。#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { setuid( 0 ); // you can set it at run time also system( "/home/pubuntu/setuid-test2.sh" ); return 0; } それをsetuid-test2.cとして保存します。 コンパイル 次に、このプログラムバイナリでsetuidを実行します。su - nobody [enter password] chown nobody:nobody a.out chmod 4755 a.out これで、スクリプトを実行できるようになり、誰も権限なしでスクリプトが実行されていることがわかります。 しかし、ここでもスクリプトパスをハードコードするか、コマンドライン引数として上記のexeに渡す必要があります。