Sto cercando di eseguire ADB su un server Linux con più utenti in cui non sono root (per giocare con il mio emulatore Android). Il demone adb scrive i suoi log nel file /tmp/adb.log
che purtroppo sembra essere codificato in ADB e questa situazione non cambierà.
Quindi, adb non viene eseguito, dando l'errore ovvio:cannot open '/tmp/adb.log': Permission denied
. Questo file è stato creato da un altro utente e da /tmp
ha un po' di adesivo. Se avvio adb con adb nodaemon server
facendolo scrivere su stdout, non si verificano errori (ho anche impostato la sua porta su un valore univoco per evitare conflitti).
La mia domanda è:c'è un modo per fare in modo che ADB scriva su un altro file diverso da /tmp/adb.log
? Più in generale, esiste un modo per creare una sorta di collegamento simbolico specifico del processo? Voglio reindirizzare tutti gli accessi ai file a /tmp/adb.log
a, dicendo, un file ~/tmp/adb.log
.
Ancora una volta, non sono root sul server, quindi chroot
, mount -o rbind
e chmod
non sono opzioni valide. Se possibile, vorrei non modificare i sorgenti ADB, ma sicuramente se non ci sono altre soluzioni, lo farò.
PS Per il caso specifico di ADB posso ricorrere all'esecuzione di adb nodaemon server
con nohup
e il reindirizzamento dell'output, ma la domanda generale è ancora pertinente.
Risposta accettata:
Ecco un esempio molto semplice dell'utilizzo di util-linux
's unshare
per mettere un processo in uno spazio dei nomi di montaggio privato e dargli una vista diversa dello stesso filesystem che il suo genitore ha attualmente:
{ cd /tmp #usually a safe place for this stuff
echo hey >file #some
echo there >file2 #evidence
sudo unshare -m sh -c ' #unshare requires root by default
mount -B file2 file #bind mount there over hey
cat file #show it
kill -TSTP "$$" #suspend root shell and switch back to parent
umount file #unbind there
cat file' #show it
cat file #root shell just suspended
fg #bring it back
cat file2 #round it off
}
there #root shell
hey #root shell suspended
hey #root shell restored
there #rounded
Puoi dare a un processo una vista privata del suo filesystem con unshare
utility su sistemi Linux aggiornati, sebbene la funzione di mount namespace stessa sia stata abbastanza matura per l'intera serie di kernel 3.x. Puoi inserire spazi dei nomi preesistenti di tutti i tipi con nsenter
utility dallo stesso pacchetto e puoi saperne di più con man
.