2 votes

Pourquoi je ne peux pas exécuter adb via udev ?

J'écris un script bash qui s'exécute lorsque je branche mon téléphone Android 6.0.1 sur mon ordinateur portable Ubuntu 16.04. Je suis bloqué au point où le script s'exécute correctement lorsque je l'exécute manuellement à partir d'une session de terminal, mais il échoue lorsque j'essaie de l'exécuter automatiquement via une règle udev.

Le contenu de /etc/udev/rules.d/99-Android.rules est :

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

Le contenu de /data/personal/backup/backup_galaxya5_start est :

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

Le contenu de /data/personal/backup/backup_galaxya5 est un tas de choses, mais il se résume essentiellement à :

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"

Comme je l'ai dit, l'exécuter lorsque le téléphone est branché à partir d'un terminal fonctionne sans aucun problème. Cependant, lorsque je branche le téléphone pour que le script s'exécute automatiquement, il se produit ce qui suit :

  1. La règle udev détecte le fait que le téléphone a été branché et exécute /data/personal/backup/backup_galaxya5_start.
  2. Ce fichier utilise la commande at pour programmer l'exécution du script de sauvegarde.
  3. Le script de sauvegarde proprement dit s'exécute et démarre le serveur adb.
  4. Le script de sauvegarde est alors incapable de copier le fichier rsync.bin sur le téléphone.
  5. Les commandes adb suivantes échouent également.

A un moment donné, j'ai même modifié le script pour récupérer la commande "adb push" qui a échoué et ensuite faire un "adb kill-server", mais cela n'a pas aidé non plus.

J'aimerais savoir ce qu'il me manque pour que ce script fonctionne lorsqu'il est appelé à partir de la règle udev.

1voto

diyism Points 111

J'ai essayé de http://www.joescat.com/linux/android_rules.html mais il n'a pas réussi à démarrer le serveur adb, je ne sais pas pourquoi.

Dans "/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 et & et disown ne fonctionnent pas, "at now" fonctionne) :

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

Et les 3 dernières lignes dans le rehadb.log ont montré :

...
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

Finalement, je l'ai réparé (il y a peut-être de mauvais effets secondaires) :

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

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X