4 votes

Comment trouver l'UID d'une application installée sur Android et l'utiliser comme utilisateur shell ?

J'essaie de trouver un moyen de déterminer le nom d'utilisateur de l'utilisateur actuel du shell à partir d'un shell / terminal sur un appareil Android.

L'environnement Android que j'ai dans /system/bin y /system/xbin n'a pas le caractère unix user commande. Dans l'ensemble, il semble que le concept n'existe pas tout à fait sur Android, mais au moins, sur mon appareil enraciné, il y a une commande utilisateur. root et il existe également des groupes tels que shell y everybody en fonction des permissions des fichiers du système.

Le contexte est le suivant :
Je veux lancer un ssh (j'ai installé une version d'OpenSSH également) sur le système Android qui utilise une commande locale. private key . La clé a des permissions de fichier et celles-ci sont requises pour être restrictives par OpenSSH pour une bonne raison (le groupe UNIX du fichier ne devrait pas avoir de permissions pour accéder à la clé, seulement le propriétaire).

Puisque je ne connais que l'utilisateur root je peux définir le propriétaire de la clé comme étant root et exécuter ssh comme Root. Cependant, je n'ai pas vraiment envie d'exécuter ssh en tant que racine.

Je lance la commande shell depuis l'intérieur Automate qui dispose de cette option. Apparemment, il est possible d'exécuter la commande sans les autorisations Root. Cependant, si j'ajoute le fichier de clé à la section ssh il ne peut pas accéder au fichier qui n'est accessible que par la commande root . Ainsi, je voudrais définir le propriétaire dans les permissions de fichiers UNIX de la clé comme étant l'utilisateur du shell utilisé par Automate mais je ne sais pas comment trouver qui c'est.

EDIT :

~# grep automate /data/system/packages.list
com.llamalab.automate 10106 0 /data/user/0/com.llamalab.automate default:targetSdkVersion=24 3002,3003,3001

Je suppose 10106 est l'UID, mais est-ce une valeur statique ? Si oui, puis-je ajouter une ligne à /etc/passwd en utilisant adduser à partir de busybox ou de Termux ?

3voto

Irfan Latif Points 16863

Android hérite de Linux le concept de shell qui est le composant central du processus de connexion de Linux. Mais il n'y a pas de concept de Linux console login sur Android ( 1 ) car il démarre directement à l'interface graphique. Cependant, il utilise le contrôle d'accès discrétionnaire (DAC) du noyau Linux qui est basé sur les UID / GID et le mode de permission. Chaque application installée est considérée comme un utilisateur *NIX et se voit attribuer un UID unique au moment de l'installation. Voir 本答 pour plus de détails à ce sujet.
Vous pouvez obtenir l'UID de Automate application à partir du fichier /data/system/packages.list ou en exécutant id -u à partir de l'application :

~# awk '/^com.llamalab.automate/ {print $2}' /data/system/packages.list
10106

Puisque vous voulez une connexion à distance à partir d'une machine locale en utilisant un fichier ssh binaire (construit à partir de sources Linux standard) qui doit être exécuté par Automate c.-à-d. avec l'UID 10106, l'appli key doit également appartenir à l'UID 10106. Le seul endroit sur le périphérique qui appartient à l'UID 10106 est le répertoire /data/data/com.llamalab.automate Il faut donc le définir comme $HOME para ssh et où le key doit être placé dans le répertoire .ssh appartenant à l'UID/GID 10106 :

~# mkdir /data/data/com.llamalab.automate/.ssh
~# ssh-keygen -f /data/data/com.llamalab.automate/.ssh/id_rsa
~# chmod 0700 /data/data/com.llamalab.automate/.ssh
~# chown -R 10106.10106 /data/data/com.llamalab.automate/.ssh

Créer un fichier /etc/passwd avec une seule ligne : user:x:10106:10106::/data/data/com.llamalab.automate:/system/bin/shuser est un nom d'utilisateur de votre choix. Vous pouvez également utiliser adduser :

~# touch /etc/passwd
~# busybox adduser -D -H -h /data/data/com.llamalab.automate -s /system/bin/sh -u 10106 user

Ajoutez également -o StrictHostKeyChecking=no a ssh pour que le nouveau serveur soit ajouté à known_hosts sans interaction de l'utilisateur.

Toutefois, si le ssh binaire est construit spécifiquement pour Android pour être utilisé avec une application, il doit avoir son $HOME déjà codées en dur et qui ne peuvent pas être modifiées à l'aide de la fonction /etc/passwd . Dans ce cas, vous pouvez essayer quelque chose comme ssh -i <path/to/key> -o UserKnownHostsFile=<path/to/known_hosts> <user>@<IP> . Les permissions doivent être définies et les deux chemins doivent être accessibles par l'application en cours d'exécution.

PS :

Veuillez noter que l'UID 10106 doit être membre du groupe aid_inet (GID 3003) pour ssh pour être capable de faire des liens. Toutes les applications avec android.permission.INTERNET sont membres de ce groupe. Ou vous pouvez ajouter une ligne à /etc/group : internet:x:3003:user . Ou en utilisant addgroup :

~# touch /etc/group
~# busybox addgroup -g 3003 internet
~# busybox addgroup user internet

Cependant, cela n'est utile que pour les programmes qui effectuent un login ( setgroups() ) comme su , sshd etc.

Pour plus de détails sur la façon dont Android n'a pas le mécanisme de connexion de Linux, voir 本答 .

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