Ruby 4.0 リファレンスマニュアル

module Process::GID

[edit]

要約

カレントプロセスのグループ ID を操作するためのモジュールです。

移植性が考慮されており、プラットフォーム間の違いを吸収するように実装されています。プラットフォームのシステムコールを直接使いたい場合には Process::Sys が提供されています。Process::Sys と Process::GID を同時に使うことは推奨されません。

実グループ ID を変更するメソッドは提供されていません。これは Process::GID?.eid=Process::GID?.re_exchange を以下のように組み合わせることによって実現できます。

                           # (r,e,s) == (g1,g2,??)
Process::GID.re_exchange   # (g1,g2,??) ==> (g2,g1,??)
Process::GID.eid = id      # (g2,g1,??) ==> (g2,id,??)
Process::GID.re_exchange   # (g2,id,??) ==> (id,g2,??)

目次

モジュール関数

モジュール関数

change_privilege(id) -> Integer[permalink][rdoc][edit]
(Integer group) → Integer

実グループ ID・実効グループ ID・保存グループ ID のすべてを指定された id に変更します。成功したら id を返します。主に root 権限を完全に放棄するために使います。

利用できるかはプラットフォームに依存します。

[PARAM] id:
グループ ID を整数で指定します。
[EXCEPTION] ArgumentError:
変更できないグループ ID があった場合に発生します。例外の発生時にこのメソッドを呼び出す前の各グループ ID の値が保存されているかどうかは保証されません。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
p [Process.gid, Process.egid]        # => [0, 0]
p Process::GID.change_privilege(33)  # => 33
p [Process.gid, Process.egid]        # => [33, 33]
eid -> Integer[permalink][rdoc][edit]
() → Integer

現在のプロセスの実効グループ ID を返します。

利用できるかはプラットフォームに依存します。

[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
p Process.egid # => 500
grant_privilege(id) -> Integer[permalink][rdoc][edit]
eid=(id)
(Integer group) → Integer

現在のプロセスの実効グループ ID を id に変更します。成功したら id を返します。

実グループ ID は変更されないことが保証されます。保存グループ ID が変更されないかもしれないので root 権限の完全放棄には使えません。保存グループ ID が変化するかどうかは Process::GID?.re_exchangeable? が true を返すかどうかで決まります。

  • true の環境では、実グループ ID と異なる値を設定した場合、保存グループ ID は新しい実効グループ ID の値に設定されます。
  • false の環境では保存グループ ID は変化しません。

利用できるかはプラットフォームに依存します。

[PARAM] id:
グループ ID を整数で指定します。
[EXCEPTION] Errno::EXXX:
設定できない場合に発生します。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
p [Process.gid, Process.egid]        # => [0, 0]
p Process::GID.grant_privilege(33)   # => 33
p [Process.gid, Process.egid]        # => [0, 33]
from_name(name) -> IntegerRuby 2.0.0 から[permalink][rdoc][edit]
(String name) → Integer

引数で指定した名前の実グループ ID を返します。

p Process::GID.from_name("wheel") # => 0
Process::GID.from_name("nosuchgroup") # => can't find group for nosuchgroup (ArgumentError)
[PARAM] name:
グループ名を指定します。
[EXCEPTION] ArgumentError:
引数で指定したグループが存在しない場合に発生します。
re_exchange -> Integer[permalink][rdoc][edit]
() → Integer

現在のプロセスの実グループ ID と実効グループ ID を入れ替えます。保存ユーザ ID は新しい実効ユーザ ID と同じになります。新しい実効グループ ID を返します。

利用できるかはプラットフォームに依存します。

[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
p [Process.gid, Process.egid] # => [0, 33]
p Process::GID.re_exchange    # => 0
p [Process.gid, Process.egid] # => [33, 0]
re_exchangeable? -> bool[permalink][rdoc][edit]
() → bool

現在のプラットフォームで Process::GID?.re_exchange が実装されているなら true を返します。そうでない場合に false を返します。

rid -> Integer[permalink][rdoc][edit]
() → Integer

現在のプロセスの実グループ ID を返します。

p Process.rid # => 500
sid_available? -> bool[permalink][rdoc][edit]
() → bool

現在のプラットフォームが保存グループ ID を持つなら true を返します。そうでない場合に false を返します。

ただし、このメソッドの値には保証がありません。現在は次の条件のいずれかが満足される場合には保存グループ ID を持つものと判定しています。

  • setresgid() を持つ
  • setegid() を持つ
  • _POSIX_SAVED_IDS が真として定義されている
switch -> Integer[permalink][rdoc][edit]
switch {...} -> object
() → Integer
[T] () { () → T } → T

実効グループ ID を一時的に変更するために使います。

実効グループ ID を実グループ ID に変更します。実効グループ ID と実グループ ID が等しい場合には、実効グループ ID を保存グループ ID に変更します。変更前の実効グループ ID を返します。

ブロックが指定された場合、実効グループ ID を実グループ ID へ変更しブロックを実行します。ブロック終了時に実効グループ ID を元の値に戻します。ブロックの実行結果を返します。

なお、保存グループ ID を持たない環境でこのメソッドを実行すると実グループ ID が変化します。

[EXCEPTION] Errno::EPERM:
各グループ ID がこのメソッドを実行するのに適切な状態でない場合、つまり、実グループ ID・実効グループ ID・保存グループ ID が全て同じ場合に発生します。ブロック付きの場合は、なんらかの原因で元の権限に復帰できないにも発生します。ブロック内でグループ ID が変更されたなどの理由が挙げられます。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
include Process
# (r, e, s) == (500, 505, 505)
p [gid, egid]           # => [500, 505]
Process::GID.switch do
  p [gid, egid]         # => [500, 500]
end
p [gid, egid]           # => [500, 505]