いままでハマったことがなかったのだけど、ついにハマってしまった。
補助グループ権限もつけてくれるsetuidgidのようなもの - (ひ)メモ を読んで、どうするかな〜と思いつつsetusergroupsを試してみたが、Unix::Groups がデフォルトで入っておらずちょっと困ったので python で以下のようにした。
#!/usr/bin/python
import os
import sys
import pwd
if len(sys.argv) < 3:
print >> sys.stderr, 'Usage: setusergroups user program'
sys.exit(1)
pw = pwd.getpwnam(sys.argv[1])
pw_name = pw[0]
pw_uid = pw[2]
pw_gid = pw[3]
pw_home = pw[5]
os.environ['HOME'] = pw_home
os.initgroups(pw_name, pw_gid)
os.setgid(pw_gid)
os.setuid(pw_uid)
os.execvp(sys.argv[2], sys.argv[2:])
エラると例外で落ちてトレースバックがでて十分なので特にエラー処理してな
備考
ハマったのは Raspberry Pi の pi ユーザで i2c を触るようなデーモンを作るケースで、この場合 pi ユーザに i2c グループ権限がついてないとダメなのでこういうのが必要になる。
依存なしでどうにかしたかったのは、cpanm が ansible の Core Modules に入ってなくてめんどかったから