Nous nous étions quittés, lors de la partie 2 de cette série d’articles, par
J’entends déjà les plus exigeants me faire remarquer que ce serait quand même plus simple d’activer ce script par son icône présente sur la grille des applis du Jolla … Et ils ont assez raison …
Mais c’est déjà une autre histoire, racontée par un geek, pleine de hacks et de scripts … Et qui nous emmène encore plus loin ( Mc Bin, Chat qu’Expire) !
Alors il est grand temps de s’en occuper !
SDAction, la commande invoquée en touchant l’écran, que même on va tout faire soi-même pour que ça marche, même quand ça veut pas !
1-1 Qu’implémenter ?
De manière intuitive, que pourrait-on souhaiter voir ?
- Une icone qui montre le status de la microSD (présent, monté, démonté, absent),
- une icone qui nous propose de démonter ou remonter cette microSD.
Cela nous impose quand même de gérer 6 icones pour 2 emplacements de la grille des applications … Comme monter ou démonter est quelque peu redondant avec présent ou absent, il apparaît plus simple de ne garder qu’un emplacement sur la grille, pour lui associer 3 icones :
soit monté-> à démonter,
Icone associée à un script SDUMnt.sh qui ressemblerait à ça :
#!/bin/sh SD.sh umount
Soit démonté->à monter
Icone associée à un script SDMnt.sh qui ressemblerait à ça :
#!/bin/sh SD.sh mount
On pourrait même ajouter : pas de µSD
Icone associée à un script SDMnt.sh qui ressemblerait à ça :
#!/bin/sh SD.sh mount
1-2 Comment faire ?
À la louche, avec 2 scripts et 3 icones, il doit être possible de boucler le projet. Il ne reste qu’à s’inspirer du tuto « Comment sont gérées les icones et leurs applis par l’UI de Sailfish » pour réaliser une manipulation semblable : switch des scripts et des icones.
Mais pour savoir où on en est, il faudrait que SD.sh nous retourne des codes « erreur » comme par exemple
- Si mount
- 0 : OK
- 1 : pas OK rien fait
- 2 : pas OK pas de µSD
- Si umount
- 0 : OK
- 1 : pas OK reste des répertoires montés
- 2 : pas OK pas de µSD
Et donc modifier le script SD.sh en conséquence avec des
exit 0 , exit 1 ou exit 2 et aussi return 0 , return 1 et return 2
au bon moment.
1-3 Alors ces scripts ?
Sans pour autant tester tous les cas de figure (voyez ça comme vos exercices personnels), il est possible d’insérer des tests et sortir des codes erreurs dans la nouvelle version du script SD.sh :
#!/bin/sh CMD=$1 SD=/dev/mmcblk1p1 ERR=0 set -- `/sbin/blkid -c /dev/null -o export $SD | grep UUID= | tr '=' ' '` UUID=$2 [ -z $UUID ] && CMD='Nodev' function Mount { lSDCARD=$1 err=0 mount | grep -q mmcblk1p1 [ $? -eq 1 ] && /usr/sbin/mount-sd.sh add mmcblk1p1 # pose des problèmes en mode desktop df -h | grep -q $lSDCARD [ $? -eq 0 ] && { mount -o bind $lSDCARD /home/nemo/SD64 [ $? -ne 0 ] && err=1 mount -o bind $lSDCARD /data/sdcard/SD64 [ $? -ne 0 ] && err=1 } return $err } function UMount { lSDM=$1 lUUID=$2 err=0 MTList=`awk -v SDM=$lSDM -v UUID=$lUUID' BEGIN {LISTE=""} $0 ~ SDM && $0 !~ UUID { LISTE=($2" "LISTE) } END { print LISTE} ' /etc/mtab` for DIR in $MTList do umount $DIR [ $? -ne 0 ] && err=1 done return $err } case "$CMD" in Nodev) ERR=2 ;; '') ERR=3 ;; mount) Mount /media/sdcard/$UUID ERR=$? ;; umount) UMount $SD $UUID ERR=$? ;; *) ERR=1 ;; esac exit $ERR
Dès lors, les deux scripts (SDMnt.sh et SDUMnt.sh) qui effectueront les opérations seront complétés pour réaliser les switchs des icones et des scripts ; il peuvent être écrits de la sorte :
SDMnt.sh
#!/bin/sh SD.sh mount case $? in 0) cp /usr/share/SD/SDMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png cp /usr/share/SD/SDUMnt.sh /usr/share/SD/SDAction.sh ;; 1) cp /usr/share/SD/SDUMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png cp /usr/share/SD/SDMnt.sh /usr/share/SD/SDAction.sh ;; 2) cp /usr/share/SD/SDNO.png /usr/share/icons/hicolor/86x86/apps/SDAction.png cp /usr/share/SD/SDMnt /usr/share/SD/SDAction.sh ;; esac
et SDUMnt.sh
#!/bin/sh SD.sh umount case $? in 0) cp /usr/share/SD/SDUMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png cp /usr/share/SD/SDMnt.sh /usr/share/SD/SDAction.sh ;; 1) cp /usr/share/SD/SDMnt.png /usr/share/icons/hicolor/86x86/apps/SDAction.png cp /usr/share/SD/SDUMnt.sh /usr/share/SD/SDAction.sh ;; 2) cp /usr/share/SD/SDNO.png /usr/share/icons/hicolor/86x86/apps/SDAction.png cp /usr/share/SD/SDMnt.sh /usr/share/SD/SDAction.sh ;; esac
Attention à ne pas oublier le fichier .desktop correspondant : SDAction.desktop
[Desktop Entry] Version=1.0 Name=SDAction (un)mount Type=Application Comment=Show System Processes Terminal=true Exec="/usr/share/SD/SDAction.sh" Icon=SDAction Categories=ConsoleOnly;System; GenericName=mount SDcard
1-4 Vérifications
Petit test pour s’assurer que ça marche, à partir de ma linux box :
> scp -r SD nemo@jolla.chez.moi:SD64/devel password: xxxxxxx SD/SD.sh 100% 1102 1.1KB/s 00:00 SD/SDAction.desktop 100% 223 0.2KB/s 00:00 SD/SDAction.png 100% 16KB 16.4KB/s 00:00 SD/SDAction.sh 100% 478 0.5KB/s 00:00 SD/SDMnt.png 100% 6856 6.7KB/s 00:00 SD/SDMnt.sh 100% 476 0.5KB/s 00:00 SD/SDUMnt.png 100% 7632 7.5KB/s 00:00 SD/SDUMnt.sh 100% 478 0.5KB/s 00:00 SD/SDno.png 100% 16KB 16.4KB/s 00:00 > ssh nemo@jolla.chez.moi password: xxxxxxxxx > devel-su password: xxxxxxxxx # cp -rf ~SD64/devel/SD /usr/share # cd /usr/share/SD # ./SD.sh mount ; echo $? 0 # ./SD.sh umount ; echo $? 0 # ./SDMnt.sh ; echo $? 0 # diff ./SDUMnt.sh ./SDAction.sh # # ./SDUMnt.sh ; echo $? 0 # diff ./SDMnt.sh ./SDAction.sh #
Et d’ailleurs votre petite icone change au gré des instructions ./SDMnt.sh \ ./SDUMnt.sh.
Alors, Intéractif ? C’est pour quand
2-1 cela ne serait-il pas déjà opérationnel ?
Bref tout se passe très bien . Il ne reste plus qu’à « toucher » l’icone sur l’écran pour vérifier (et passer à autre chose) …
Caramba ! Encore Raté ! Maudit machin ! Et oui, ça ne marche pas ! Mais ce n’est guère étonnant, rappelez vous, quand nemo tente de monter ou démonter un file-system :
> umount /data/sdcard/SD64 umount: /data/sdcard/SD64: umount failed: Operation not permitted
Cette limitation reste d’actualité ! Alors ne peut on rien faire ?
2-2 Si un gros trous de sécurité ,
En activant le BIT SETUID ROOT ! Car si un programme est enregistré avec le suid ou guid à root, logiquement toutes les commandes exécutées via le script le seront sous l’autorité de root !
2-3 élevons les droits du script
Pour executer un shell « harbour-filetug« , rangé dans « /tmp » avec les droits de root, il suffit de compiler ce programme « commeroot.c » écrit en C:
#include #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { setuid( 0 ); system( "/tmp/harbour-filetug" ); return 0; }
Et de lui activer le bit setuid root
# sudo chmod 4755 commroot
Alors certes, seul root peut exécuter cette commande. Mais une fois fait il faudra bien faire attention à qui s’en sert, car à partir de maintenant, n’importe quel usager peut exécuter /tmp/harbour-filetug avec les droits de root … Si en plus /tmp/harbour-filetug n’est pas bien protégé en écriture, alors n’importe qui peut changer le contenu du script et faire ce qu’il veut sur la machine … Et ça, c’est bien pire que de croiser les effluves !
Les droits de commroot seront réglés en
# chown root:root commroot : ainsi seul root peut intervenir dessus # chmod 4550 commroot : ainsi même avec le setuid root, personne ne peut le modifier
les droits de harbour-filetug seront réglé en
# chown root:root harbour-filetug # chmod 550 harbour-filetug
Le but étant d’empêcher qu’un utilisateur lambda, et même nemo, ne puisse modifier le script et le programme qui élève ses droits.
2-4 j’ai pas de compilateur !
Seulement voilà, on a toujours pas eu de tuto sur la compilation croisée et pas grand monde ne doit avoir GCC d’installé sur son Jolla … Alors que faire ? Trouver un programme qui ferait déjà un truc similaire ! Pardi ! Vous allez me rétorquer que c’est peine perdue, que nous sommes entre gens raisonnables et que plus personne n’ose encore utiliser cette ‘astuce’ pour lancer un script avec les droits de root pour l’utilisateur nemo !
Plus personne ? Et bien ça c’est ce que l’on croit toujours avant de tomber dessus. Comptez sur l’inconséquence des autres ! Fouillez les stores ! Vous trouverez finalement chez open repos un paquet bigrement intrigant : StartAsRoot for Filetug. Que contient-il ? :
# wget https://openrepos.net/sites/default/files/packages/365/filetugroot-0.2-2.armv7hl.rpm # rpm -qp --list ./filetugroot-0.2-2.armv7hl.rpm /usr/share/applications/harbour-filetug-root.desktop /usr/share/icons/hicolor/86x86/apps/harbour-filetug-root.png /usr/share/openrepos-Filetugroot/start-root
Avec les instructions strings et file, intéressons nous à ce start-root, qui à le mérite d’être explicite :
# file start-root start-root: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=295c67c897dc29fbfaf695f5cb5822ebec3aed35, not stripped # strings start-root /lib/ld-linux-armhf.so.3 __gmon_start__ libc.so.6 setuid abort system __libc_start_main GLIBC_2.4 /usr/bin/harbour-filetug
Ce qui a aussi le mérite d’être clair : ce programme exécute harbour-filetug (un file browser) avec les permissions de root (bande de cinglés) !!! Et on devine ce qui nous reste à faire :
2-5 un petit hack maison
Pour échanger le nom du programme, qui est appelé, par le nôtre. Mais c’est un binaire ! vi ou nano risquent de râler gravement ! Pour éditer du binaire, un petit hexedit fait l’affaire
# cp start-root SDAction # hexedit SDAction
Et sous hexedit, /usr/bin/harbour-filetug est remplacé, au caractère prèt, par /usr/share/SD/SDAction.sh ;
Effectivement, mon expression fait un caractère de plus que celle qui est remplacée, mais comme elle est suivie de quelques 00, tant qu’on tape dedans, ce n’est pas grave.
Pour ceux qui n’ont pas hexedit sous la main, un petit sed suffira (mais toujours garder en mémoire que c’est au caractère prêt, lors de l’écriture de l’expression rationnelle) :
# sed 's/usr\/bin\/harbour-filetug./usr\/share\/SD\/SDAction.sh/' start-root >sdaction
Vérifions quand même :
# ls -l start-root sdaction SDAction -rwxr-xr-x 1 bandix400 bandix400 5423 avril 18 03:01 sdaction* -rwxr-xr-x 1 bandix400 bandix400 5423 avril 18 02:44 SDAction* -rwxr-xr-x 1 bandix400 bandix400 5423 févr. 19 11:31 start-root* # md5sum start-root sdaction SDAction df5c93f54e57f68aca1965c569efd0bf start-root bc0f56be475df6811e4f99a78a426c61 sdaction bc0f56be475df6811e4f99a78a426c61 SDAction
On voit très bien que si les 3 fichiers ont la même taille, le MD5sum de start-root est différent des 2 autres ; sdaction étant obtenu avec sed et SDAction avec hexedit, on constate qu’ils sont identiques … Mais fonctionnent-ils après cette agression ? Copions (ma linuxbox)SDAction dans (mon Jolla)/usr/share/SD, mettons les bons droits et testons en tant que « nemo » :
#chmod 4550 SDAction # ls -l SDAction -r-sr-x--- 1 root root 5423 Apr 18 03:10 SDAction # exit # ./SDAction # ./SDAction # ./SDAction # ./SDAction
À chaque fois l’icone change, et un « df -h » me montre que les répertoires sont « bindés » ou « dé-bindés ».
Maintenant il faut mettre à jour le .desktop, tel que la ligne
Exec= »/usr/share/SD/SDAction.sh »
soit modifiée en
Exec= »/usr/share/SD/SDAction »
Et le tour est joué !
Voila c’est fini !
reste une question qui désormais nous taraude : si utiliser « commeroot.c » est à grandement déconseiller, existe-t-il une solution Bien sûr, quil en existe une et vous l’utilisez très souvent :
Il suffit qu’un pop-up s’affiche et vous demande votre mot de passe ; le programme verifie que vous avez bien le droit d’exécuter l’action et si c’est le cas, s’exécute, par exemple GKSUDO … Mais ça, c’est carrément une autre série d’articles 🙂
Maintenant il se peut que cette série vous pose plus de problèmes qu’elle n’en a résolus ; venez sur les charmes insoupçonnés des µSD ; venez nous raconter jusqu’où c’est allé, trop ou pas assez loin. De plus, cette tri-tuto-rie vous a permis d’aborder de nombreux aspects de l’environnement de SailfishOS, et donc de Linux, que ce soit les scripts, les commandes avancées du shell (awk, sed, set, function, case, etc), sa grammaire (test, boucles, vatriables, opérations scalaires), ses limites, sa sécurité … Alors si ce sont plutôt les scripts ou la programmation qui vous interpellent, alors n’hésitez pas à qui est là.
Autrement si vous souhaitez carrément exécuter Android de la carte SD et libérer cette palce … Y-a moyen … Mais sous unix il n’existe pas de problèmes qu’une bonne in-direction ne puisse résoudre (y-a-toujours moyen) 😉 .
bandix400
Je suis passionné de génétique, d’informatique, de mécanique, et je m’arrête là car je manque déjà de temps pour tout faire ; autrement j’y rajouterais volontiers l’électronique, la musique, l’aquariophilie, le graphisme, le jeu Vidéo (simulation de conduite/FPS) et du ju-jitsu traditionnel.
Les derniers articles par bandix400 (tout voir)
- SonyX’2, le retour de la vengeance du fils caché … - 27 janvier 2018
- SFOS, mais en VO - 31 octobre 2017
- Sony’X, où Sailfish X sur Xperia X - 3 octobre 2017