Cmd Stage
Résumé
- Nom interne :
CmdStage - Catégorie : Système
- But : Exécuter une commande shell sur l’appareil Android, avec gestion facultative des privilèges root.
- Type de tâche : Normale
Compatibilité
- Version AndroMate minimale :
1.1.0 - Version AndroMate maximale :
1.1.0 - Android minimum :
Android 13 (API 33) -
Android maximum testé :
Android 16 (API 36) -
Constructeurs supportés :
- ✅ Samsung (One UI 6.x / 7.x / 8.x)
- ✅ Google Pixel (Android Stock)
-
⚠️ Autres constructeurs : non testés ou partiellement supportés
-
Permissions nécessaires :
INTERNET(si la commande effectue un accès réseau)MANAGE_EXTERNAL_STORAGE(si la commande lit certains fichiers dans le mobile)- ⚠️ Root requis pour certaines commandes (selon la valeur de
root)
Description détaillée
La tâche Cmd Stage permet d’exécuter une commande shell directement sur l’appareil Android.
Elle est utilisée pour :
- Tester la connectivité réseau (
ping,curl,traceroute, etc.) - Collecter des informations système (CPU, mémoire, interfaces réseau, radio…)
- Modifier la configuration (si root :
ip,ifconfig,tc, etc.) - Automatiser des diagnostics techniques ou des actions système répétitives.
Détails d'implémentation
- Détection automatique du shell : Détecte les caractères spéciaux et les espaces pour décider si un shell est nécessaire
- Échappement des caractères : Échappe les guillemets et caractères spéciaux (
; | & < > * ( ) { } [ ]) - Timeout fixe : 5 minutes (300 secondes) maximum pour l'exécution
- Gestion du root : Utilise
su -cpour les commandes root, vérifie que l'appareil est rooté - Capture stdout/stderr : Les deux flux sont capturés séparément et concaténés
- Limite de taille : Maximum 10.000 caractères pour la sortie (les excédents sont tronqués)
- Nettoyage des ressources : Ferme proprement les flux et le processus en cas d'erreur
Paramètres d’entrée
| Paramètre | Type | Obligatoire | Valeurs possibles | Compatibilité Android | Compatibilité AndroMate | Défaut |
|---|---|---|---|---|---|---|
cmd_text |
String | Oui | Toute commande shell valide | Android 13 (API 33) → Android 16 (API 36) | 1.1.0 → 1.1.0 | — |
root |
Boolean | Non | true / false | Android 13 (API 33) → Android 16 (API 36) | 1.1.0 → 1.1.0 | false |
Paramètres de sortie
| Champ | Type | Condition de déclenchement | Compatibilité Android | Compatibilité AndroMate | Défaut |
|---|---|---|---|---|---|
cmd_result_output |
String | Si la commande principale réussit | Android 13 (API 33) → Android 16 (API 36) | 1.1.0 → 1.1.0 | <ANDROMATE_NULL_VALUE> |
cmd_error_output |
String | Si la commande principale échoue | Android 13 (API 33) → Android 16 (API 36) | 1.1.0 → 1.1.0 | <ANDROMATE_NULL_VALUE> |
Diagramme d'exécution
flowchart TD
Start([Démarrer CmdTask]) --> ResolveParams[🔄 Résoudre paramètres<br/>cmd_text, root]
ResolveParams --> CheckRoot{root = true?}
CheckRoot -->|Oui| ExecRoot[⚙️ Exécuter avec root<br/>su -c commande]
CheckRoot -->|Non| ExecCmd[⚙️ Exécuter commande<br/>sh -c commande]
ExecRoot --> ReadOutput[📤 Lire stdout et stderr<br/>Max 10000 caractères]
ExecCmd --> ReadOutput
ReadOutput --> CheckError{stderr present?}
CheckError -->|Oui| StoreError[💾 Stocker dans cmd_error_output<br/>Message d'erreur]
CheckError -->|Non| StoreSuccess[💾 Stocker dans cmd_result_output<br/>Sortie de la commande]
StoreError --> LogReport[📋 Logger rapport<br/>ReportSection]
StoreSuccess --> LogReport
LogReport --> Success([✅ Succès<br/>CmdTaskResult])
style Start fill:#e3f2fd
style Success fill:#c8e6c9
style ExecRoot fill:#f3e5f5
style ExecCmd fill:#f3e5f5
style ReadOutput fill:#fff9c4
style StoreError fill:#ffe0e0
style StoreSuccess fill:#e0f0e0
Comment ça fonctionne :
- Résoudre paramètres : Charge cmd_text et root depuis la configuration
- Vérifier root : Détermine si la commande doit être exécutée avec les privilèges root
- Exécuter commande : Lance via
/system/bin/sh -c(ousu -csi root=true) - Lire sortie : Capture stdout et stderr, limité à 10.000 caractères max
- Vérifier erreur : Si stderr n'est pas vide, capture le message d'erreur
- Stocker résultat : Stocke dans
cmd_result_output(succès) oucmd_error_output(erreur) - Logger : Enregistre le rapport d'exécution
- Résultat : Retourne CmdTaskResult (succès toujours, les erreurs sont dans les variables)
Note : Cette tâche ne lève PAS d'exception. Les erreurs sont capturées dans la variable cmd_error_output.
Messages d'erreur possibles
La tâche capture les messages d'erreur générés par la commande dans cmd_error_output. Ces messages proviennent de :
- Erreurs d'exécution (stderr du processus)
- Erreurs au niveau système (timeout processus, appareil non rooté, etc.)
Catégories de messages d'erreur
Erreurs réseau
| Message d'erreur | Cause | Exemple de commande |
|---|---|---|
Network is unreachable |
Pas de connectivité réseau | ping 8.8.8.8 |
Temporary failure in name resolution |
Échec résolution DNS | ping google.com |
Connection refused |
Port cible fermé | curl http://localhost:9999 |
Connection timeout |
Serveur n'répond pas | curl http://192.0.2.1 |
Operation timed out |
Latence réseau trop élevée | ping 8.8.8.8 -c 10 |
Erreurs système de fichiers
| Message d'erreur | Cause | Exemple de commande |
|---|---|---|
No such file or directory |
Fichier n'existe pas | cat /data/nonexistent.txt |
Permission denied |
Permissions insuffisantes | cat /root/private.txt (sans root) |
Is a directory |
Lecture d'un répertoire comme fichier | cat /data/ |
Device or resource busy |
Fichier/périphérique verrouillé | rm /data/locked_file |
Erreurs root/privilèges
| Message d'erreur | Cause | Exemple de commande |
|---|---|---|
Permission Denied (no rooted Device) |
root=true mais appareil non rooté | Toute commande avec root: true |
su: not found |
Binaire su non disponible | Commande root sur appareil non rooté |
Operation not permitted |
Action nécessite root | ip route add sans root |
Erreurs d'exécution
| Message d'erreur | Cause | Exemple de commande |
|---|---|---|
command not found |
Binaire/exécutable n'existe pas | iperf3 (non installé) |
Process timed out and was killed |
Timeout dépassé (300s) | Commande longue |
Exec error: ... |
IOException lors de l'exécution | Commande corrompue ou problème système |
Erreurs d'information système
| Message d'erreur | Cause | Exemple de commande |
|---|---|---|
cannot read ... |
Impossible accéder fichier système | cat /proc/cpuinfo (permission refusée) |
unknown option |
Argument commande invalide | ping --invalid-option |
Bad syntax |
Commande malformée | sh -c "echo unclosed |
Structure des messages d'erreur
Les messages d'erreur dans cmd_error_output suivent cette structure :
[Timestamp] [Error Type]: [Error Description]
Ligne 1 de la sortie stderr
Ligne 2 de la sortie stderr
... (max 10.000 caractères total)
Gestion des erreurs dans les workflows
Exemple 1 : Vérifier une erreur réseau
{
"CmdStage": [
{
"id": "1",
"title": "Tester réseau",
"cmd_text": "ping -c 1 8.8.8.8",
"root": false,
"cmd_result_output": "$PING_RESULT",
"cmd_error_output": "$PING_ERROR"
}
],
"Condition": [
{
"id": "2",
"condition": "$PING_ERROR contains 'unreachable'",
"then": "NetworkDownTask",
"else": "ContinueTask"
}
]
}
Exemple 2 : Réessayer avec root si permission refusée
{
"CmdStage": [
{
"id": "1",
"title": "Première tentative sans root",
"cmd_text": "cat /system/build.prop",
"root": false,
"cmd_result_output": "$BUILD_PROP",
"cmd_error_output": "$ERROR_1"
}
],
"Condition": [
{
"id": "2",
"condition": "$ERROR_1 contains 'Permission denied'",
"then": "RetryWithRootTask",
"else": "SuccessTask"
}
]
}
Caractères spéciaux et limites
Détection du shell
La tâche détecte automatiquement si un shell est nécessaire selon les conditions :
- La commande contient des espaces (ex:
ping -c 1 8.8.8.8) - La commande contient des caractères spéciaux :
;|&<>*(){}[]
Si l'une de ces conditions est vraie, la commande est exécutée via /system/bin/sh -c "commande".
Exemples
| Commande | Nécessite shell ? | Raison |
|---|---|---|
ping |
❌ Non | Pas d'espace, pas de caractères spéciaux |
ping -c 1 8.8.8.8 |
✅ Oui | Contient des espaces |
ping 8.8.8.8 \| grep |
✅ Oui | Contient le pipe \| |
curl http://example.com && echo ok |
✅ Oui | Contient && |
cat /data/file > /tmp/out |
✅ Oui | Contient > (redirection) |
Limites
| Limite | Valeur | Description |
|---|---|---|
| Timeout | 300 secondes (5 min) | Délai maximum avant terminaison du processus |
| Taille de sortie | 10.000 caractères | Maximum pour stdout + stderr combinés |
| Caractères échappés | " → \" |
Les guillemets sont échappés dans les commandes root |
Dépassement des limites
- Timeout dépassé : Le processus est tué et l'erreur
CMD_PROCESS_TIMEOUTest levée - Sortie trop grande : Le texte est tronqué avec
... output truncated ...ajouté à la fin
Détails des paramètres d’entrée
1. Paramètre d’entrée : cmd_text
La commande principale à exécuter sur l’appareil.
Exemple
Détails
- Exécutée via le shell Android (
/system/bin/sh). - Doit être compatible avec la version Android et les binaires disponibles sur le device.
- Sa sortie standard est transmise au
cmd_result_outputvia une variable andromate (ex.$RESULT).
2. Paramètre d’entrée : root
Indique si la commande doit être exécutée avec les privilèges root.
Exemple
Détails
- Si
root = true, la commande est généralement exécutée viasu -c "<cmd_text>". - Si l’appareil n’est pas rooté ou si
sun’est pas disponible, la tâche peut échouer. - À utiliser uniquement pour des actions nécessitant des permissions élevées (réseau bas niveau, fichiers système, etc.).
Détails des paramètres de sortie
3. Variable de résultat : cmd_error_output
cmd_error_output est une variable interne utilisée pour sauvegarder la sortie d’erreur (stderr) produite par la commande principale (cmd_text) lorsqu’elle échoue.
Exemple
Déclenchement
cmd_error_output est alimentée lorsque la commande principale :
- retourne un code de sortie ≠ 0,
- dépasse un timeout,
- ou lorsque la commande est introuvable ou non exécutable.
Dans tous ces cas, la sortie d’erreur (stderr) est copiée dans la variable.
Cas d’usage
- Sauvegarder l’erreur générée par une commande (ex :
ping,iperf,twamp,curl…) - Enregistrer des logs spécifiques (
logcat, traces internes…) - Transmettre l’erreur à un backend pour analyse ou monitoring
- Exploiter l’erreur dans une autre task (condition, fallback, rapport…)
4. Variable de résultat : cmd_result_output
cmd_result_output est une variable interne utilisée pour sauvegarder la sortie standard (stdout) produite par la commande exécutée dans la task.
Exemple
Détails
$RESULTcontient la sortie standard de la commande principale.- Le workflow peut :
- analyser la sortie,
- extraire une valeur (temps de réponse, code, état…),
- transformer ou normaliser le résultat,
- l’envoyer à un backend (via
curlouHttp request.).
Cas d’usage
- Envoi de métriques vers un serveur de collecte
- Chaine d’exécution de plusieurs commandes dépendantes