[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