2 votos

¿Por qué no puedo ejecutar adb a través de udev?

Estoy escribiendo un bash script que se ejecutará al conectar mi teléfono Android 6.0.1 en mi portátil Ubuntu 16.04. Estoy atascado en el punto en el que el script se ejecuta bien cuando lo hago manualmente desde una sesión de terminal, pero falla cuando intento que se ejecute automáticamente a través de una regla udev.

El contenido de /etc/udev/rules.d/99-Android.rules es:

ACTION=="add", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="6860",MODE="0666", RUN+="/data/personal/backup/backup_galaxya5_start"

El contenido de /data/personal/backup/backup_galaxya5_start es:

#!/bin/bash
sudo -u marc echo /data/personal/backup/backup_galaxya5 | at now

El contenido de /data/personal/backup/backup_galaxya5 es un montón de cosas, pero esencialmente se reduce a:

adb start-server
adb push /data/download/rsync4android/rsync.bin /data/local/tmp/rsync >> "$LOGFILE"
adb shell chmod 755 /data/local/tmp/rsync >> "$LOGFILE"
adb shell 'exec >/data/local/tmp/rsyncd.conf && echo address = 127.0.0.1 && echo port = 1873 && echo "[root]" && echo path = / && echo use chroot = false && echo read only = false' >> "$LOGFILE"
adb shell /data/local/tmp/rsync --daemon --no-detach --config=/data/local/tmp/rsyncd.conf --log-file=/proc/self/fd/2 & >> "$LOGFILE"
adb forward tcp:6010 tcp:1873
rsync -av --exclude .thumbnails/ "rsync://localhost:6010/root/sdcard/DCIM/" "$TARGETDIR" > "$RSYNCLOGFILE"

Como he dicho, ejecutar esto cuando el teléfono está conectado desde un terminal funciona sin problemas. Sin embargo, cuando conecto el teléfono para que el script se ejecute automáticamente, ocurre lo siguiente:

  1. La regla udev recoge el hecho de que el teléfono estaba enchufado y ejecuta /data/personal/backup/backup_galaxya5_start.
  2. Ese archivo utiliza el comando at para programar la ejecución de la copia de seguridad real script.
  3. La copia de seguridad real script se ejecuta e inicia el servidor adb.
  4. La copia de seguridad script es entonces incapaz de copiar el archivo rsync.bin al teléfono.
  5. Los comandos adb posteriores también fallan.

En algún momento incluso cambié el script para recoger el comando "adb push" fallido y luego hacer un "adb kill-server", sin embargo esto tampoco ayudó.

Me gustaría saber qué me falta para que este script funcione al ser llamado desde la regla udev.

1voto

Fortyrunner Puntos 161

He dado una oportunidad a http://www.joescat.com/linux/android_rules.html pero no pudo iniciar el servidor adb, no sé por qué

En "/etc/udev/rules.d/51-Android.rules":

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee7", ACTION=="add", RUN+="/usr/bin/rehtet"

/usr/bin/rehtet (nohup y & y disown no funcionan, "at now" sí):

#!/bin/bash
echo "/usr/bin/adb shell ls >/tmp/rehadb.log" | at now

Y las últimas 3 líneas en el rehadb.log mostraron:

...
socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(5037), sin_addr=inet_addr("127.0.0.1")}, 16

Finalmente, lo arreglé (tal vez haya efectos secundarios malos):

edit "/lib/systemd/system/systemd-udevd.service", change "IPAddressDeny=any" into "IPAddressDeny="
run "systemctl daemon-reload"   "service udev restart"
to enable udev script (gnirehtet / adb) to access 127.0.0.1:5037

0 votos

Hola. ¿Puedes decir cómo responde esto a la pregunta? No creo que esto constituya ni siquiera una respuesta parcial, pero puede que me esté perdiendo algo aquí.

0 votos

El comando debería funcionar, pero falló en mi máquina

0 votos

askubuntu.com/questions/574046/ Un problema similar, parece que las conexiones de red no están permitidas en los scripts de udev.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X