4 votos

¿Cómo encontrar el UID de una aplicación instalada en Android y usarla como usuario shell?

Estoy tratando de encontrar una manera de determinar el nombre de usuario del usuario de shell actual desde dentro de un shell / terminal en un dispositivo Android.

El entorno Android que tengo en /system/bin y /system/xbin no tiene el sistema unix user mando. En general, parece que el concepto no existe del todo en Android, pero al menos, en mi dispositivo rooteado, hay un usuario root y también hay grupos como shell y everybody , basándose en los permisos de los archivos del sistema.

Los antecedentes son los siguientes:
Quiero dirigir una ssh (también instalé una versión de OpenSSH) en el Android que utiliza un private key . La clave tiene permisos de archivo y estos son requeridos para ser restrictivos por OpenSSH por una buena razón (el grupo UNIX del archivo no debe tener permisos para acceder a la clave, sólo el propietario).

Como sólo conozco al usuario root Puedo establecer el propietario de la llave como root y ejecutar ssh como Root. Sin embargo, no quiero ejecutar ssh como root.

Estoy emitiendo el comando shell desde Automate que tiene esa opción. Aparentemente, es posible ejecutar el comando sin permisos de Root. Sin embargo, si añado el archivo de claves al ssh no puede acceder al archivo que es accesible sólo por root . Por lo tanto, me gustaría establecer el propietario en los permisos de archivo UNIX de la clave para el usuario de shell utilizado por Automate pero no sé cómo averiguar de quién se trata.

EDITAR:

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

Supongo que 10106 es el UID, pero ¿es un valor estático? Si es así, ¿podría añadir una línea a /etc/passwd utilizando adduser ¿comando desde busybox o Termux?

3voto

Jack Wade Puntos 231

Android hereda de Linux el concepto de shell que es el componente principal del proceso de inicio de sesión de Linux. Pero no existe el concepto de Linux console login en Android ( 1 ) porque arranca directamente en la GUI. Sin embargo, hace uso del Control de Acceso Discrecional (DAC) del kernel de Linux que se basa en UIDs / GIDs y en el modo de permiso. Cada aplicación instalada es considerada como un usuario *NIX y se le asigna un UID único en el momento de la instalación. Ver esta respuesta para obtener más detalles al respecto.
Puede obtener el UID de Automate aplicación desde el archivo /data/system/packages.list o ejecutando id -u desde la aplicación:

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

Ya que quieres un inicio de sesión remoto desde la máquina local usando un ssh binario (construido a partir del código fuente estándar de Linux) que debe ser ejecutado por Automate es decir, con el UID 10106, el key también debe ser propiedad del UID 10106. El único lugar en el dispositivo que es propiedad del UID 10106 es el directorio /data/data/com.llamalab.automate , por lo que debe establecerse como $HOME para ssh y donde el key debe colocarse en el directorio .ssh propiedad de 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

Crear archivo /etc/passwd con una sola línea: user:x:10106:10106::/data/data/com.llamalab.automate:/system/bin/sh donde user es cualquier nombre de usuario de su elección. También puede utilizar adduser :

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

Añade también -o StrictHostKeyChecking=no a ssh para que el nuevo servidor se añada a known_hosts sin la interacción del usuario.

Sin embargo, si el ssh binario está construido específicamente para Android para ser utilizado con una aplicación, debe tener su $HOME que ya está codificado y que no se puede cambiar con /etc/passwd . En este caso puedes probar algo como ssh -i <path/to/key> -o UserKnownHostsFile=<path/to/known_hosts> <user>@<IP> . Los permisos deben estar configurados y ambas rutas deben ser accesibles para la ejecución de la aplicación.

PS:

Tenga en cuenta que el UID 10106 debe ser miembro del grupo aid_inet (GID 3003) para ssh para poder establecer conexiones. Todas las aplicaciones con android.permission.INTERNET son miembros de este grupo. O puede añadir una línea a /etc/group : internet:x:3003:user . O usando addgroup :

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

Sin embargo, esto es útil sólo para los programas que realizan el inicio de sesión ( setgroups() ) como su , sshd etc.

Para más detalles sobre cómo Android carece del mecanismo de inicio de sesión de Linux, consulte esta respuesta .

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