[eside-ghost] Ejecutando cosas dentro de entornos chroot

Saúl Ibarra saghul en gmail.com
Mie Abr 14 12:08:15 CEST 2010


Bueno, ya creo que lo medio-tengo :) El tema es lanzar un nuevo
proceso en el que se hace un chroot a donde queramos, nos bajamos los
privilegios y a molar, ya que el proceso padre seguirá siendo del
señor root :)

152 def exec_process_in_chroot(cmdline, chroot_dir, uid=0, gid=0,
silent=True, input=None, **kwargs):
153     preexec = PreExec(chroot_dir, uid, gid)
154     try:
155         sub = subprocess.Popen(cmdline,
156                                stdin=subprocess.PIPE,
157                                stdout=subprocess.PIPE,
158                                stderr=subprocess.PIPE,
159                                preexec_fn = preexec)
160
161         stdout, stderr = sub.communicate(input=input)
162         if not silent:
163             sys.stdout.write(stdout)
164             sys.stderr.write(stderr)
165     except OSError, e:
166         if e.errno == 2:
167             raise RuntimeError('"%s" is not present on this
system' % cmdline[0])
168         else:
169             raise
170     else:
171         if sub.returncode != 0:
172             raise RuntimeError('Got return value %d while
executing "%s", stderr output was:\n%s' % (sub.returncode, "
".join(cmdline), stderr.rstrip("\n")))
173         return (sub.returncode, stdout)
174
175 class PreExec(object):
176     def __init__(self, chroot_dir, uid, gid):
177         self.chroot_dir = chroot_dir
178         self.uid = uid
179         self.gid = gid
180     def __call__(self, *args, **kwargs):
181         os.setpgrp()
182         os.chdir(self.chroot_dir)
183         os.chroot(self.chroot_dir)
184         os.setregid(self.gid, self.gid)
185         os.setreuid(self.uid, self.uid)
186


Saludos,

-- 
/Saúl
http://saghul.net | http://sipdoc.net


Más información sobre la lista de distribución eside-ghost