Estou tentando executar o ADB em um servidor Linux com vários usuários onde não sou root (para jogar com o meu emulador Android). O daemon adb grava seus logs no arquivo /tmp/adb.log
que infelizmente parece estar codificado no ADB e essa situação não vai mudar .
Então, adb não está a prazo, dando o erro óbvio: cannot open '/tmp/adb.log': Permission denied
. Este arquivo é criado por outro usuário e /tmp
possui um adesivo. Se eu iniciar o adb adb nodaemon server
fazendo com que ele escreva para stdout, nenhum erro ocorrerá (eu também configurei sua porta com um valor exclusivo para evitar conflitos).
Minha pergunta é: existe alguma maneira de fazer o ADB gravar em outro arquivo /tmp/adb.log
? De maneira mais geral, existe uma maneira de criar uma espécie de link simbólico específico do processo? Quero redirecionar todos os acessos de arquivos /tmp/adb.log
para, digamos, um arquivo ~/tmp/adb.log
.
Novamente, eu não sou raiz no servidor, por isso chroot
, mount -o rbind
e chmod
não são opções válidas. Se possível, gostaria de não modificar as fontes do ADB, mas certamente se não houver outras soluções, farei isso.
PS Para o caso específico ADB posso recorrer a correr adb nodaemon server
com nohup
e redirecionamento de saída, mas a questão geral ainda é relevante.
/tmp/adb.log
ou até montar seu próprio privado/tmp
. façaman unshare
eman namespaces
eman nsenter
.LD_PRELOAD
truques, embora isso seja mais complicado./home/$USER/tmp/adb.log
e reconstruir adb :)Respostas:
Aqui está um exemplo muito simples de como usar
util-linux
'sunshare
para colocar um processo em um namespace de montagem privada e fornecer uma visão diferente do mesmo sistema de arquivos que seu pai atualmente possui:Você pode dar a um processo uma visão privada de seu sistema de arquivos com o
unshare
utilitário em sistemas linux atualizados, embora o próprio recurso de namespace mount tenha sido bastante maduro para toda a série do kernel 3.x. Você pode inserir namespaces pré-existentes de todos os tipos com onsenter
utilitário do mesmo pacote e descobrir mais comman
.fonte
unshare
todos os tipos de espaços para nome - para incluir o espaço para nome do usuário. e, assim, seu usuário pode executar um espaço para nome no qual possui acesso root e tudo o que fizer dentro do qual um usuário raiz possa estragar não afeta o espaço para nome pai. em outras palavras, um espaço para nome de montagem pode ser incorporado a um espaço para nome de usuário. você realmente precisa ler essasman
páginas. fica profundo. é exatamente assimdocker
esytemd-nspawn
funciona.runuser
utilitário que pode ser usado eunshare
, se você estiver aberto para escrever programas compilados, não há razão para não usar ounshare()
syscall para fazer o mesmo, ou mesmo apenassystem()
com o suid binário.LD_PRELOAD não é muito difícil e você não precisa ser root. Interponha sua própria rotina C, que é chamada em vez do real
open()
na biblioteca C. Sua rotina verifica se o arquivo a ser aberto é "/tmp/adb.log" e chama a abertura real com um nome de arquivo diferente. Aqui está o seu shim_open.c:Compile-o
gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
e teste-o colocando algo em/tmp/myadb.log
execuçãoLD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
. Em seguida, tente o LD_PRELOAD no adb.fonte
Operation not permitted
). Espero que issoopen
seja suficiente, mas, finalmente, adicionarunlink
a esse manipulador não é difícil.unshare
, então todos nós ganhamos!