2009-01-21
Python with statement
Python の2.6からwith statement が標準機能となった.2.5でもfuture 機能として取り込まれていたので目新しくはないが,なかなか便利で,もう2.4には戻れない.with statementはtry, except, finally で実現できる構造をもう少し簡単に書けるようにしてくれる.以前のエントリで書いたthreading ライブラリのConditionなどに使うととても簡単に書ける.
このようなwithで使うオブジェクトをContext Managerと呼ぶ.Context Managerを書くのは割に簡単なので,ちょっと書いてみた.こちらの記事によくまとまっている.
実効ユーザIDのセット
Unixのプロセスにはreal user id(実ユーザID)と effective user id(実効ユーザID)の二つのidが割り当てられている.普通のプロセスでは両者は一致しているのだが,セキュリティの関係でことなる値を使いたい場合がある.例えば,任意のユーザのプロセスを操作する必要があるので,root権限が必要なのだけど,普段からroot権限で動くのはいかにも剣呑なので,普段はnobodyで動いているデーモンも多い.実効ユーザIDの戻し忘れはセキュリティホールに直結するので,注意が必要だ.
この実効ユーザIDを操作するContext Manager を書いてみよう.
with文に入るところで __enter__ が呼ばれ,出るところで__exit__が呼ばれるので,それぞれos.seteuidを呼び出しているだけ.__exit__にはちょっと注意が必要で,with文のなかで生じた例外のための引数が余分に存在する.withブロック内部で発生した例外を外に伝搬させるためには,__exit__文の戻り値をFalseにしなければならない.
import os
class Euid():
def __init__(self, id):
self.id = id
def __enter__(self):
self.orgeuid = os.geteuid()
os.seteuid(self.id)
def __exit__(self, exc_type, exc_value, traceback):
os.seteuid(self.orgeuid)
if exc_type:
return False
return True
使い方はこんな感じ.
print os.geteuid()
with Euid(501):
print os.geteuid()
print os.geteuid()
これをroot権限で実行してみるとこうなる.
$ python setuid.py 0 501 0
withブロックの中でだけ実効ユーザIDが変更されていることが分かる.ただし,マルチスレッドで使う場合には注意が必要.実効ユーザIDはプロセス単位で定義されるので,別のスレッドから見ると突然実効ユーザIDがパカパカ切り替わることになる.実際あんまりいいサンプルじゃなかったかもしれない.
所感
with文はとても便利.CentOS 5ではいまだにpythonが2.4なので,まだ標準機能としては使いにくいのだけど.せめて2.5になってくれないものだろうか.
- 15 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4DAJP_jaJP294JP295&q=boost+mutex
- 5 http://www.google.co.jp/search?num=50&hl=ja&rlz=1T4DAJP_jaJP294JP295&pwst=1&q=boost+recursive_mutex&revid=611142024&sa=X&oi=revisions_inline&resnum=0&ct=top-revision&cd=1
- 5 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4DAJP_jaJP294JP295&q=boost+mutex
- 4 http://search.minakoe.jp/rsss/rsss.asp?pid=733572&plp=1&pd=2009/01/21&lid=733461&nlp=1&sd=2009/01/21&base=320&blp=1&bd=2009/01/21&multi=1&qry=domain:hatena
- 3 http://d.hatena.ne.jp/keyword/Python
- 3 http://diaspar.jp/node/183
- 2 http://www.google.co.jp/search?rlz=1C1CHMG_jaJP291JP305&sourceid=chrome&ie=UTF-8&q=cURLpp
- 1 http://72.14.235.132/search?q=cache:2QOq3adlDfMJ:detail.psearch.yahoo.co.jp/i/ONfwibQNcUWTynSBT_rB1P/+curl_easy_setopt 基本&hl=ja&ct=clnk&cd=2&gl=jp
- 1 http://a.hatena.ne.jp/gomaccho/
- 1 http://d.hatena.ne.jp/keyword/ワークアラウンド?kid=233153