• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:シェルスクリプトで一時的にルート権限として実行)

Linuxシェルスクリプトで一時的にルート権限を実行する方法は?

このQ&Aのポイント
  • Linuxのシェルスクリプトで一時的にルート権限として実行したい場合、いくつかの方法があります。例えば、sudoコマンドを使用する方法や、setuidビットを設定する方法などがあります。
  • sudoコマンドを使用する場合、sudoersファイルに実行したいスクリプトを記述し、ユーザーにsudo権限を与える必要があります。また、setuidビットを設定する方法では、スクリプトファイルにsetuidビットを設定することで、実行ユーザーではなく所有者の権限でスクリプトが実行されます。
  • ただし、セキュリティ上の理由から、ルート権限を持つスクリプトを実行する場合は注意が必要です。慎重に設定を行い、必要最小限の権限で実行するようにしましょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.2

ラッパープログラムを作成して、そのプログラムにsetuid(所有者をrootにして chmod 4755)を設定するのがよいでしょう。 以下はラッパープログラムの一例です。execvの引数(/bin/bashの部分)とargvを 書き換えることで任意のプログラムを起動できるでしょう。 -- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <grp.h> #include <sys/wait.h> int main () {  struct passwd *pw;  pw = getpwuid (geteuid ());  if (!(pw && pw->pw_name && pw->pw_name[0]))   {    perror ("getpwuid");    exit (EXIT_FAILURE);   }  if (initgroups (pw->pw_name, pw->pw_gid) == -1)   {    perror ("initgropuos");    exit (EXIT_FAILURE);   }  if (setgid (pw->pw_gid) == -1)   {    perror ("setgid");    exit (EXIT_FAILURE);   }  if (setuid (pw->pw_uid) == -1)   {    perror ("setuid");    exit (EXIT_FAILURE);   }  char *argv[4];  argv[0] = "-bash";  argv[1] = "-c";  argv[2] = "screen.sh";  argv[3] = NULL;  if (execv ("/bin/bash", argv) == -1)   {    perror ("execv");    exit (EXIT_FAILURE);   }  exit (EXIT_SUCCESS); } -- 特定のユーザのみ起動できるようにしたい場合はグループ(ここではwrapperとする)を 作成してchgrp wrapper、chmod 4750すればよいでしょう。

kracfire
質問者

お礼

回答有り難うございます。 ソースコードも実装にそって書いていただきわかりやすく感謝致します。 回答に関して2点ほど疑問点がありましたので補足法で加筆させて頂きます。

kracfire
質問者

補足

1.最後の chmod 4750とはどういった設定なのでしょうか? 2.このプログラムを実行、実装するにあたって脆弱性はどのようになりますか?

その他の回答 (1)

noname#208507
noname#208507
回答No.1

下記のURLに書かれているような方法はいかがでしょう。

参考URL:
http://dminor11th.blogspot.jp/2011/01/setuid.html
kracfire
質問者

お礼

回答有り難うございます。 こういった方法も在るのですね。 セキュリティ面が気になるところですが、勉強として参考にさせて頂きます。

関連するQ&A