2011-01-06 3 views
0

申し訳ありませんが、私の質問は簡単ですが、私はCにちょっと新しく、誰かが私を助けてくれることを願っていました。私はCの別のユーザーに変更したいと思います。たとえば、ユーザーのパスワードを知っていて、ユーザーが次のように入力したとします。 ./change user1 user1に変更されます。私はこれが今セキュリティ上の問題かもしれないことは知っていますが、私は現時点ではセキュリティについて心配していません。あなたはそれがPOSIXシステム上で利用可能であるunistd.hで見つけることができるのsetuid使用したいと思うでしょうCユーザーの変更

+2

Cでは、ユーザーとしてそのようなものはありません。それは使用しているオペレーティングシステムに依存します。あなたが望むことを実行する方法が全くない可能性があります。 –

+0

この質問は、オペレーティングシステムに大きく依存しています。どのOSが対象ですか? – Thanatos

+0

"./change user1'"を使うとき、シェルが他のユーザになることを意味しますか?もしそうなら、すでにそのためのツールがあります。 – dreamlax

答えて

2

(ので、任意のLinux/Unixのfalvourは、[OK]をする必要があり)

のmanページから

の場合プロセスは適切な特権を持ち、setuid()は実際のユーザID、 実効ユーザID、および呼び出したプロセスの保存されたset-user-IDをuidに設定する。

プロセスに適切な権限がなくても、uidが実際の ユーザーIDまたは保存されたset-user-IDと等しい場合、setuid()は実効ユーザーIDをuidに設定します。 実際のユーザーIDと保存されたユーザーIDは変更されません。

setuid()関数は、補助グループリストに何ら影響してはなりません。ここ

はあなたがgetpwuid()を使用してUIDを見つけるために持っているexample

+1

それはプログラムの視点からユーザーを変えるだけですが、そうではありませんか?すなわち、ユーザは、プログラムを呼び出した元のユーザに戻り、プログラムの実行が終了した後、新しいユーザに永久に変更されない。 – CanSpice

+0

はい。彼はsetuidの後に実行可能ファイルをいくつか起動して、実際に何か便利なことをする必要があります – hhafez

0

です。その後、あなたのプログラムのUIDをsetuid()に設定してから、これらの新しい権限で実行するアプリケーション/機能を設定する必要があります。シェル。 現在の UIDを使用してアプリケーションを起動するには、system()を使用します。

1

はUnix一般的に、あなたの特定のOSの両方で、変更する資格情報のについてのすべての複雑さを知っている、(例えばsystem()またはfork()exec機能の一つの組み合わせを介して)suバイナリを呼び出します。端末は共有され、元のユーザに属し続ける。

単純なsetuid()コールで処理されない複雑さの中には、グループ、アカウントの無効化、およびリソースの制限があります。

これはちょうど楽しみのためのもので、setgid()と先行するsetuid()initgroups()で十分でしょう。

関連する問題