Рассмотрите этот сценарий Python, который вызывает HandBrakeCLI, программа, которая пытается читать из DVD-привода:
invoke.py
#!/usr/bin/python
import sys
import os
import subprocess as subp
import pprint
#immediately switch users
os.setgid(1002) #gid of "media"
os.setuid(1005) #uid of "jack"
#verify the switch worked
print os.getuid(), os.geteuid()
print os.getgid(), os.getegid()
#clear up any possible env var diffs
os.environ['USER'] = 'jack'
os.environ['USERNAME'] = 'jack'
os.environ['LOGNAME'] = 'jack'
#output env variables to see if there's anything different:
ff = open('env_%s.log' % sys.argv[1], 'w')
ff.write(pprint.pformat(dict(os.environ)))
ff.write("\n")
ff.close()
#call the program
p = subp.Popen(["HandBrakeCLI", "-i", "/dev/sr0", "-t", "0"])
p.communicate()
sys.exit(p.returncode)
Следующий ("A") успешно выполняется:
sudo -u jack -g media HandBrakeCLI -i /dev/sr0 -t 0
как делает этот ("B"):
sudo -u jack -g media ./invoke.py jack
но этот ("C") сбои:
sudo ./invoke.py root
и ошибки печати, предполагающие, что HandBrakeCLI не мог получить доступ к CD-приводу. Операторы печати подтверждают, что UID/GID был успешно изменен на jack:media, как бы то ни было. Если я удаляю setuid/setgid и называю HandBrakeCLI от invoke.py как корень, он работает еще раз.
Разность показывает, что среды являются по существу тем же:
$ diff env_root.log env_jack.log
8c8
< 'SUDO_COMMAND': './invoke.py root',
---
> 'SUDO_COMMAND': './invoke.py jack',
После вызова setuid и setgid, там "память" исходного пользователя вызова? В противном случае, что HandBrake мог возможно видеть по-другому между "B" и "C"?
Я работаю 10.04 на бездисплейном сервере, к которому я получаю доступ через ssh.
Это действительно имеет значение, так как можно определить, были ли повышены привилегии (случай suid), что отличается от работы через sudo. Это потому, что весь процесс выполняется как 'jack' в случае sudo (и никогда не отменяет uid: процесс просто завершается), тогда как случай suid "запоминает" исходный uid, и изменяется только эффективный uid.
Ваша ситуация немного отличается, но вот тестовый скрипт, который обнаруживает каждую комбинацию sudo / suid: test_privs.sh Подобный код теперь используется на сервере X11 для обнаружения повышенных привилегий: xorg -уровневое обсуждение
Я не рассмотрел ваши конкретные потребности устройства / ручного тормоза, но это должно поставить вас на правильный путь.