1

管理者アカウント内で実行するbashスクリプトを作成したいと思います。スクリプトで既存のhostsファイルをファイル拡張子.originalで同じディレクトリにバックアップしてから、スクリプトで3つの事前定義されたエントリ(スクリプト本体内で指定)をhostsファイルに追加し、既存のフォーマットを維持する必要があります。ホストファイル。ユーザーが認証しなくてもこれを実現するにはどうすればよいですか?管理者のパスワードをスクリプトに保存し、エスカレーションを要求するたびにsudoに渡す必要があります。ありがとうございました。

4

3 に答える 3

1

プログラム (コンパイルされたコード) を作成し、それを実行するために root に suid する必要があります。その後、root パスワードをユーザーに明らかにする必要はありません。スクリプトを suid できるシステムにはまだ出会ったことがありません。または、実際のプログラムである bash 自体を suid する必要があります。そうすれば、誰もが root になることができます。

例: (ルートとして実行)

ex qq.c << EOF
1,\$d
i
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
int main() {
    assert(0 == setreuid(geteuid(),-1));
    return system(
    "/bin/bash << DONE\n"
    "if [ \"\$UID\" != '0' ];then echo \"need to be root to do this\";exit 16;fi;\n"
    "cp /etc/hosts /etc/hosts.org\n"
    "echo 127.0.0.1 banned1.domain >> /etc/hosts\n"
    "echo 127.0.0.1 banned2.domain >> /etc/hosts\n"
    "echo 127.0.0.1 banned3.domain >> /etc/hosts\n"
    "DONE\n");
}
.
x
EOF
gcc -o qq qq.c && chmod u+s qq
于 2012-05-06T03:09:08.860 に答える
1

スクリプトにパスワードを保存しないでください。それはセキュリティ上の脆弱性です。setuid ビットを使用すると、パスワードをどこにも保存せずに、目的の動作を実現できます。

最初chmod u+s myscriptに実行して、所有者として実行します (所有者を root にすると、スクリプトが root として実行されるため、スクリプト内で sudo を使用する必要はまったくありません)。

次に、必要な人がスクリプトを実行できることを確認します。すべてのユーザーが実行できるようにする場合は、chmod +x myscript. chmod g+x myscript自分だけがグループ内の唯一のユーザーであることを確認し、代わりに使用できるようにしたい場合。

次に実行sudo chown root myscriptして、root が所有するようにします。

これで、そのスクリプトを実行する権限を持つユーザーがスクリプトを実行すると、そのユーザーが管理者であるかどうかに関係なく、root として実行されます。

于 2012-05-05T18:16:27.300 に答える
0

コマンドを使用してこれを行うことができますsudo。このsudoコマンドを使用すると、どのユーザーがどのコマンドを実行できるか、およびどのユーザーが実行できるかを指定できます。通常、実行するには root になる必要がある特定のコマンドへのアクセス権をユーザーに付与します。たとえば、特定の人が Apache httpd を開始および停止できる必要があります。通常、これを実行できるのは root だけですが、Web 管理者に root として他のことを行う許可を与えずに、この許可を与えることができます。

このsudoコマンドは、/private/etc/sudoersファイルによって制御されます。(コマンドで編集する必要がありますvisudo)。

ファイルを編集するためのシェル スクリプトを作成するとし/etc/hostsます。最初に、特定の場所に配置する必要があります/usr/local/edit_hosts_file。ディレクトリはルートが所有しているため、これは適切な場所です。

ここで、root だけがこのファイルを実行できるようにし、おそらく root だけがこのファイルを読み取ることができるようにし、特に root だけがこのファイルを編集できるようにしたいと考えています。そうしないと、このファイルを使用して、システムの他の部分へのルート アクセス権を自分に与えることができます。

 $ sudo chown root:root /usr/share/edit_hosts_file
 $ sudo chmod 700 /usr/share/edit_hosts_file

コマンドが安全になったので、/private/etc/sudoersファイルを編集して、特定のユーザーのみがこのシェル スクリプトを root として実行できるようにします。

User_Alias ALLOWED_USERS = bob, carol, ted, alice
Cmnd_Alias ETC_HOSTS_EDIT = /usr/share/bin/edit_hosts_file
Host_Alias MACHINE_LIST = localhost
ALLOWED_USERS    MACHINE_LIST=(ALL) NOPASSWD: ETC_HOSTS_EDIT

これにより、定義されたALLOWEDユーザー リスト内のすべてのユーザーがetc/hosts、パスワードを必要とせずに編集スクリプトを実行できるようになります。

これで、誰かがスクリプトを実行したい場合root、パスワードを知らなくても、パスワードを教えなくても実行できます。このようにして、スクリプトを別のスクリプトで実行できます。

 $ sudo /usr/share/bin/edit_hosts_file
 Script completed: /etc/hosts edited
于 2012-05-06T05:00:05.677 に答える