2010-12-29 5 views
3

これは簡単な質問かもしれませんが、どのようにしてcコンソールアプリケーションのユーザからシステム/ root権限を "要求"しますか?私は/ Private/etcに書き込む必要がありますが、できません。これはmac/unix用です。アクセス権/私的/ etc/c

私はそれが他のコンソールコマンドで使用されているのを見ました。 "sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder"というコマンドを実行すると、ターミナルからパスワードが尋ねられます。これはどうすればいいですか?

おかげで、UNIXシステムの場合JNK

+0

「sudo/path/to/my/c/file」というコマンドを実行するだけで解決策が見つかりました... – JNK

答えて

5

プロセスにroot権限を取得させるシステムコールはありません。 seteuidはこのように動作すると予想されますが、ルートプロセスを持つプロセスでのみ使用できます(非特権プロセスでは、euidをuidと同じに設定することができます)。

sudoは、その実行可能ファイルにはsetuid権限があるため、特別です。これは、sudoを実行すると、それを実行しているユーザーではなく、それを所有するユーザー(root)として実行されることを意味します。 sudoは、パスワードを確認して設定ファイルを読むことで、root権限を持つことを確認できます。チェックが成功すると、要求されたコマンドを実行するためにforkexecveが呼び出されます。

特権のないアプリケーションでroot特権を取得するには、いくつかのフープを飛ばしなければなりません。 fork/execveを使用して、自分のコマンドにsudoを呼び出すことができます。一度認証されると、特権を持つ子プロセスを持つことになります。特殊な引数や環境変数を渡すことで、子プロセスが特権を持つコードにジャンプすることができます。親プロセスは、子プロセスが完了するのを待つだけです。

0

は、あなたのプログラムにsetuidの旗を持っている必要があります、それは有効な資格情報のための/ etc/passwdと/ etc/shadowをチェックする必要があります。私はcrypt(3)関数がパスワードのハッシュに使われると信じています。 Macについてはわからない。

+0

いいえ、Macでは動作しません。 –

+0

これは、sudoのダイアログを表示するという質問とは関係ないように見えることは言うまでもありません。 –

+0

Mmmm、yehパスワードが入力されている間、端末で入力された文字のエコーを削除するためにgetpass()(実際には推奨されていません)を使用することができます。 – atx

1

Macで必要な作業を行う方法は、ユーザーが実行する部分と特権タスクを実行する部分からなる「ファクタードアプリケーション」を作成することです。特権のある部分をシステムlaunchdドメインにインストールし、特殊なアクセス権が必要な作業のためにユーザーツールを呼び出すようにします。

特権ヘルパーの使用が許可されていることを確認し、Authorization Servicesを使用する必要があります。ユーザーツールでは、 "右"を取得し、外部フォームに変換してヘルパーに渡します。ヘルパーツールは、特権作業を行う前に、正しく権限があることを確認する必要があります。

もう1つの選択肢は、ツールをすべて正常に実行できないようにすることです(どちらの場合でも実行する必要があります)。特権アクセスが必要な場合はsudoで実行するようユーザーに依頼します。それがUNIXの残りの部分の仕組みです。