Estoy tratando de ejecutar ADB en un servidor Linux con múltiples usuarios donde no soy root (para jugar con mi emulador de Android). El adb daemon escribe sus registros en el archivo /tmp/adb.log
que desafortunadamente parece estar codificado en ADB y esta situación no va a cambiar .
Por lo tanto, el BAD está fallando a plazo, dando el error obvio: cannot open '/tmp/adb.log': Permission denied
. Este archivo es creado por otro usuario y /tmp
tiene un bit fijo. Si empiezo adb adb nodaemon server
haciendo que escriba en stdout, no se producen errores (también configuro su puerto en un valor único para evitar conflictos).
Mi pregunta es: ¿hay alguna forma de hacer que ADB escriba en otro archivo que no sea /tmp/adb.log
? En términos más generales, ¿hay alguna manera de crear una especie de enlace simbólico específico del proceso? Quiero redirigir todos los accesos a /tmp/adb.log
un archivo, por ejemplo ~/tmp/adb.log
.
Nuevamente, no soy root en el servidor, por lo tanto chroot
, mount -o rbind
y chmod
no son opciones válidas. Si es posible, me gustaría no modificar las fuentes ADB, pero seguramente si no hay otras soluciones, lo haré.
PD: Para el caso específico de ADB que se puede recurrir a correr adb nodaemon server
con nohup
y redirección de la salida, pero la cuestión general sigue siendo relevante.
/tmp/adb.log
, o incluso montar su propio archivo privado/tmp
. hacerman unshare
yman namespaces
yman nsenter
.LD_PRELOAD
trucos, aunque eso sería más complicado./home/$USER/tmp/adb.log
y reconstruir adb :)Respuestas:
Aquí hay un ejemplo muy simple de cómo usar
util-linux
'sunshare
para poner un proceso en un espacio de nombres de montaje privado y darle una vista diferente del mismo sistema de archivos que tiene actualmente su padre:Puede proporcionar a un proceso una vista privada de su sistema de archivos con la
unshare
utilidad en sistemas Linux actualizados, aunque la instalación de espacio de nombres de montaje en sí ha sido bastante madura para toda la serie de kernel 3.x. Puede ingresar espacios de nombres preexistentes de todo tipo con lansenter
utilidad desde el mismo paquete, y puede obtener más información conman
.fuente
unshare
todo tipo de espacios de nombres, para incluir el espacio de nombres de usuario. y para que su usuario pueda ejecutar un espacio de nombres en el que tenga acceso a la raíz y cualquier cosa que haga dentro de lo que un usuario raíz pueda arruinar no afecta el espacio de nombres principal. en otras palabras, se puede incrustar un espacio de nombres de montaje dentro de un espacio de nombres de usuario. Realmente necesitas leer esasman
páginas. Se hace profundo. esto es precisamente cómodocker
y cómosytemd-nspawn
funciona.runuser
utilidad con la que se puede usarunshare
, y si de todos modos está abierto a escribir programas compilados, no hay razón para que no pueda usarunshare()
syscall para hacer lo mismo, o incluso solosystem()
con suid binary.LD_PRELOAD no es demasiado difícil y no necesitas ser root. Interponga su propia rutina C que se llama en lugar de la real
open()
en la biblioteca C. Su rutina verifica si el archivo a abrir es "/tmp/adb.log" y llama a la apertura real con un nombre de archivo diferente. Aquí está tu shim_open.c:Compílelo
gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
y pruébelo poniendo algo en/tmp/myadb.log
funcionamientoLD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
. Luego intente con LD_PRELOAD en adb.fuente
Operation not permitted
). Espero queopen
sea suficiente para manejarlo, pero finalmente, agregarunlink
a este controlador no es difícil.unshare
eso, así que todos ganamos!