J'essaie d'exécuter ADB sur un serveur Linux avec plusieurs utilisateurs où je ne suis pas root (pour jouer avec mon émulateur Android). Le démon adb écrit ses journaux dans le fichier /tmp/adb.log
qui semble malheureusement être codé en dur dans ADB et cette situation ne va pas changer .
Donc, adb ne parvient pas à terme, donnant l'erreur évidente: cannot open '/tmp/adb.log': Permission denied
. Ce fichier est créé par un autre utilisateur et /tmp
possède un bit collant. Si je démarre adb en le adb nodaemon server
faisant écrire sur stdout, aucune erreur ne se produit (j'ai également configuré son port sur une valeur unique pour éviter les conflits).
Ma question est: existe-t-il un moyen de faire en sorte que la BAD écrive dans un autre fichier que /tmp/adb.log
? Plus généralement, existe-t-il un moyen de créer une sorte de lien symbolique spécifique au processus? Je veux rediriger tous les accès aux fichiers /tmp/adb.log
vers, en disant, un fichier ~/tmp/adb.log
.
Encore une fois, je ne suis pas root sur le serveur, donc chroot
, mount -o rbind
et ce chmod
ne sont pas des options valides. Si possible, je ne voudrais pas modifier les sources ADB, mais sûrement s'il n'y a pas d'autres solutions, je le ferai.
PS Pour le cas ADB spécifique, je peux recourir à la redirection adb nodaemon server
avec nohup
et avec la sortie, mais la question générale est toujours d'actualité.
/tmp/adb.log
, ou même monter son propre/tmp
tout à fait privé . faireman unshare
etman namespaces
etman nsenter
.LD_PRELOAD
astuces, mais ce serait plus compliqué./home/$USER/tmp/adb.log
et de reconstruire adb :)Réponses:
Voici un exemple très simple d'utilisation de
util-linux
'sunshare
pour placer un processus dans un espace de noms de montage privé et lui donner une vue différente du même système de fichiers que son parent possède actuellement:Vous pouvez donner à un processus une vue privée de son système de fichiers avec l'
unshare
utilitaire sur les systèmes Linux à jour, bien que la fonction d'espace de noms de montage elle-même soit assez mature pour toute la série de noyaux 3.x. Vous pouvez entrer des espaces de noms préexistants de toutes sortes avec l'nsenter
utilitaire du même package, et vous pouvez en savoir plus avecman
.la source
unshare
toutes sortes d'espaces de noms - pour inclure l'espace de noms de l'utilisateur. et ainsi votre utilisateur peut exécuter un espace de noms dans lequel il a un accès root et tout ce qu'il fait dans ce qu'un utilisateur root pourrait bousiller n'affecte pas l'espace de noms parent. en d'autres termes, un espace de noms de montage peut être incorporé dans un espace de noms d'utilisateurs. vous avez vraiment besoin de lire cesman
pages. ça devient profond. c'est précisément commentdocker
etsytemd-nspawn
travailler.runuser
utilitaire qui peut être utilisé avecunshare
, et si vous êtes prêt à écrire des programmes compilés de toute façon, il n'y a aucune raison que vous ne puissiez pas utiliser leunshare()
syscall pour faire la même chose, ou même simplementsystem()
avec suid binary.LD_PRELOAD n'est pas trop difficile et vous n'avez pas besoin d'être root. Interposez votre propre routine C qui est appelée à la place du réel
open()
dans la bibliothèque C. Votre routine vérifie si le fichier à ouvrir est "/tmp/adb.log" et appelle la vraie ouverture avec un nom de fichier différent. Voici votre shim_open.c:Compilez-le avec
gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
et testez-le en y mettant quelque chose/tmp/myadb.log
et en l'exécutantLD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
. Essayez ensuite LD_PRELOAD sur adb.la source
Operation not permitted
). J'espère que celaopen
suffit à gérer, mais enfin, ajouterunlink
à ce gestionnaire n'est pas difficile.unshare
, alors nous gagnons tous!