カレントプロセスのユーザ ID を操作するためのモジュールです。
移植性が考慮されており、プラットフォーム間の違いを吸収するように実装されています。プラットフォームのシステムコールを直接使いたい場合には Process::Sys が提供されています。Process::Sys と Process::UID を同時に使うことは推奨されません。
実ユーザ ID を変更するメソッドは提供されていません。これは Process::UID.#eid= と Process::UID.#re_exchange を以下のように組み合わせることによって実現できます。
# (r,e,s) == (u1,u2,??) Process::UID.re_exchange # (u1,u2,??) ==> (u2,u1,??) Process::UID.eid = id # (u2,u1,??) ==> (u2,id,??) Process::UID.re_exchange # (u2,id,??) ==> (id,u2,??)
change_privilege(id) -> Integer
[permalink][rdoc]実ユーザ ID・実効ユーザ ID・保存ユーザ ID のすべてを指定された id に変更します。成功したら id を返します。主に root 権限を完全に放棄するために使います。
利用できるかはプラットフォームに依存します。
[Process.uid, Process.euid] #=> [0, 0] Process::UID.change_privilege(33) #=> 33 [Process.uid, Process.euid] #=> [33, 33]
eid -> Integer
[permalink][rdoc]現在の実効ユーザ ID を返します。
grant_privilege(id) -> Integer
[permalink][rdoc]eid=(id)
現在のプロセスの実効ユーザ ID を id に変更します。成功したら id を返します。
実ユーザ ID は変更されないことが保証されます。保存ユーザ ID が変更されないかもしれないので root 権限の完全放棄には使えません。保存ユーザ ID が変化するかどうかは Process::UID.#re_exchangeable? が true を返すかどうかで決まります。
利用できるかはプラットフォームに依存します。
[Process.uid, Process.euid] #=> [0, 0] Process::UID.grant_privilege(33) #=> 33 [Process.uid, Process.euid] #=> [0, 33]
from_name(name) -> Integer
[permalink][rdoc]引数で指定した名前の実ユーザ ID を返します。
Process::UID.from_name("root") # => 0 Process::UID.from_name("nosuchuser") # => can't find user for nosuchuser (ArgumentError)
re_exchange -> Integer
[permalink][rdoc]実ユーザ ID と実効ユーザ ID とを入れ換えます。保存ユーザ ID は新しい実効ユーザ ID と同じになります。新しい実効ユーザ ID を返します。
利用できるかはプラットフォームに依存します。
re_exchangeable? -> bool
[permalink][rdoc]Process::UID.#re_exchange が実装されているならば true を返します。そうでない場合に false を返します。
rid -> Integer
[permalink][rdoc]現在の実ユーザ ID を返します。
sid_available? -> bool
[permalink][rdoc]保存ユーザ ID を持つ環境かどうかを真偽値で返します。保存ユーザ ID を持つなら true を返します。
ただし、このメソッドの値には保証がありません。現在は次の条件のいずれかが満足される場合には保存ユーザ ID を持つものと判定しています。
switch -> Integer
[permalink][rdoc]switch { .... } -> object
実効ユーザ ID を一時的に変更するために使います。
実効ユーザ ID を実ユーザ ID に変更します。実効ユーザ ID と実ユーザ ID が等しい場合には、実効ユーザ ID を保存ユーザ ID に変更します。変更前の実効ユーザ ID を返します。
ブロックが指定された場合、実効ユーザ ID を実ユーザ ID へ変更しブロックを実行します。ブロック終了時に実効ユーザ ID を元の値に戻します。ブロックの実行結果を返します。
なお、保存ユーザ ID を持たない環境でこのメソッドを実行すると実ユーザ ID が変化します。
include Process # (r, e, s) == (500, 505, 505) p [uid, euid] #=> [500, 505] Process::UID.switch do p [uid, euid] #=> [500, 500] end p [uid, euid] #=> [500, 505]