Affichage des résultats 1 à 4 sur 4

Discussion: creer et executer un script sur l'archos même

  1. #1
    Nouvel Archosien
    Date d'inscription
    août 2009
    Âge
    24
    Messages
    2
    Je possède : archos 605 wifi

    Executer une commande sur l'archos

    Salut.
    En surfant la semaine dernière, j'ai trouvé le hack de l'archos, c'est super, merci aux gars qui ont trouvé ça.
    Mais en cherchant j'ai pas trouvé de moyen d'exécuter une commande sur l'archos même, pas par ssh, si j'ai loupé quelque chose indiquez-le moi.

    EDIT : j'ai changer de façon de faire, avant je créais un fichier avec Texteditor, et un fichier bash l'exécutait si le fichier existe, ma nouvelle méthode est plus pratique, par contre on voit pas les messages d'erreurs... si vous avez une idée pour y remédier je vous écoute ;)



    Principe :
    Le principe est de lancer un mini-serveur web sur l'archos, qui envoit un formulaire et qui exécute la commande qu'on lui soumet à la racine.

    Défauts :

    • Les messages d'erreurs ne sont pas affichés
    • On ne peut pas lancer des commandes "interactives", comme nano, ssh ...


    Installation :

    • Avoir installé le hack GTF3




    • modifier hack.sh et rajouter cette ligne à la fin :

    Code:
    /mnt/data/nohup /mnt/data/Serveur/serveur >/dev/null 2>&1 &
    • Faire le hack GTF3 pour lancer le serveur


    • Aller sur "localhost" avec opéra, écrire sa commande (on peut en exécuter plusieurs avec ";") et appuyer sur "exécuter", le résultat s'affiche dans le bas de la page. (mais s'il y a une erreur elle n'est pas affichée)


    Le zip contient une page html, le serveur et un programme urldecode compilés pour l'archos. Voici les sources, merci de me prévenir si vous les modifiez et de partagez vos modifications pour qu'elles profitent à tout le monde.

    serveur.c
    Code:
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close(s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define PORT 80
    
    int client(SOCKET csock);
    
    int main(void)
    {
        /* Socket et contexte d'adressage du serveur */
        SOCKADDR_IN sin;
        SOCKET sock;
        socklen_t recsize = sizeof(sin);
    
        /* Socket et contexte d'adressage du client */
        SOCKADDR_IN csin;
        SOCKET csock;
        socklen_t crecsize = sizeof(csin);
    
        int sock_err, continuer = 1;
    
        chdir("/mnt/data/Serveur");
    
        /* Création d'une socket */
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
        /* Si la socket est valide */
        if(sock != INVALID_SOCKET)
        {
            printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);
    
            /* Configuration */
            sin.sin_addr.s_addr = htonl(INADDR_ANY);  /* Adresse IP automatique */
            sin.sin_family = AF_INET;                 /* Protocole familial (IP) */
            sin.sin_port = htons(PORT);               /* Listage du port */
            sock_err = bind(sock, (SOCKADDR*)&sin, recsize);
    
            /* Si la socket fonctionne */
            if(sock_err != SOCKET_ERROR)
            {
                /* Démarrage du listage (mode server) */
                sock_err = listen(sock, 5);
                printf("Listage du port %d...\n", PORT);
    
                /* Si la socket fonctionne */
                if(sock_err != SOCKET_ERROR)
                {
                    printf("Patientez pendant que les clients se connecte sur le port %d...\n", PORT);
                    while(continuer)
                    {
                        csock = accept(sock, (SOCKADDR*)&csin, &crecsize); // NOUVEAU CLIENT :
                        printf("client\n");
                        continuer = client(csock);
                        shutdown(csock, 2);
                        closesocket(csock);
                    }
                }
                else
                    perror("listen");
            }
            else
                perror("bind");
    
            /////////// inutile :
    
            /* Fermeture de la socket serveur */
            printf("Fermeture de la socket serveur\n");
            closesocket(sock);
            printf("Fermeture du serveur terminée\n");
        }
        else
            perror("socket");
    
        return EXIT_SUCCESS;
    }
    
    int urldecode(char *out, const char *in) // char out[2048]
    {
        char cmd[2048] = "echo \"";
        strcat(cmd, in);
        strcat(cmd, "\" | ./urldecode");
        out[0] = '\0';
        FILE* f = popen (cmd, "r");
        if(f == NULL)
            return 0;
    
        if(fgets(out, 2048, f) == NULL) // ne recupere que la premiere ligne expres
        {
            fclose(f);
            return 0;
        }
        return 1;
    }
    
    int executer(char *out, char* commande) // char out[2048]
    {
        char buffer[2048];
        FILE* f = popen (commande, "r");
        if(f == NULL)
            return 0;
    
        while(fgets(buffer, 2048, f) != NULL)
        {
            if(strlen(buffer) < 2048-strlen(out)) // pas de depassement de memoire
            strcat(out, buffer);
        }
        return 1;
    }
    
    void echaper_guillement(char *out, const char *in)
    {
        int i, j = 0, l = strlen(in);
        for(i = 0; i < l; i++)
        {
            if(in[i] == '"')
            {
                out[j] = '\\';
                j++;
            }
            out[j] = in[i];
            j++;
        }
        out[j] = '\0';
    }
    
    int client(SOCKET csock)
    {
        char buffer[2048];
        char *tmp;
        int nbre_octet;
        FILE *file = NULL;
        char commande[2048] = {'\0'}, reponse[2048] = {'\0'}, commande_ech[2048];
    
        nbre_octet = recv(csock, buffer, sizeof(buffer), 0);
        if(nbre_octet != -1)
        {
            buffer[nbre_octet] = '\0';
            // cherche si elle existe la commande
            tmp = strstr(buffer, "cmd=");
            if(tmp != NULL)
            {
                tmp+=4;
    
                if(!urldecode(commande, tmp))
                    printf("ERR1");
    
                chdir("/");
                if(!executer(reponse, commande))
                    printf("ERR2");
                chdir("/mnt/data/Serveur");
            }
    
            // envoi le fichier html en remplacant {CMD} par la commande et {RSP} par la reponse
            file = fopen("client.html", "r");
            if(file == NULL)
                send(csock, "impossible d'ouvrir client.html !", sizeof("impossible d'ouvrir client.html !"), 0);
            else
            {
                while (fgets(buffer, 2048, file) != NULL)
                {
                    tmp = strstr(buffer, "{CMD}");
                    if(tmp != NULL)
                    {
                        // envoi le debut de la ligne
                        *tmp = '\0';
                        send(csock, buffer, strlen(buffer)*sizeof(char), 0);
                        // puis la commande
                        if(commande[0] != '\0')
                        {
                            echaper_guillement(commande_ech, commande);
                            send(csock, commande_ech, strlen(commande_ech)*sizeof(char)-1, 0); // -1 pour enlever \n
                        }
                        // puis la fin de la ligne
                        tmp += 5;
                        send(csock, tmp, strlen(tmp)*sizeof(char), 0);
                    }
                    else // idem avec la reponse
                    {
                        tmp = strstr(buffer, "{RSP}");
                        if(tmp != NULL)
                        {
                            // envoi le debut de la ligne
                            *tmp = '\0';
                            send(csock, buffer, strlen(buffer)*sizeof(char), 0);
                            // puis la reponse
                            send(csock, reponse, strlen(reponse)*sizeof(char), 0);
                            // puis la fin de la ligne
                            tmp += 5;
                            send(csock, tmp, strlen(tmp)*sizeof(char), 0);
                        }
                        else // si aucun des deux on envoit la ligne
                            send(csock, buffer, strlen(buffer)*sizeof(char), 0);
                    }
                }
            }
        }
        return 1;
    }
    urldecode.c : http://www.icosaedro.it/apache/urldecode.c

    client.html
    Code HTML:
    <form method="post">
    commande : <input type="submit" value="executer" /><br />
    <input type="text" name="cmd" id="cmd" value="{CMD}" /><br />
    (taille max reponse et commande 2048o)<br />
    <input type="button" onclick="document.getElementById('cmd').value='';" value="effacer la commande" />
    </form>
    reponse :
    <hr />
    <pre>{RSP}<pre>
    Voilà, merci de faire part de vos réactions.
    Vidji.

  2. #2
    Archosien amateur Avatar de hedamilt
    Date d'inscription
    mars 2010
    Âge
    23
    Messages
    66
    de souvenir on pouvais ouvrir un ssion ssh et tout marchit super bien, je reactive mon hacl demain, je test le tout et je te dis.
    windows, c'est comme les prostituées: tu paye cher et t'a plein d'emmerdes!
    linux c'est comme les femmes: une fois que tu t'y ai habitué, c'est genial et gratuit!

  3. #3
    Nouvel Archosien
    Date d'inscription
    août 2009
    Âge
    24
    Messages
    2
    Je possède : archos 605 wifi
    Ouais, ça marche même mieux mais le but ici est de pouvoir lancer une commande depuis l'archos, sans intervention d'un pc via le wifi. A moins qu'on puisse se connecter depuis l'archos, auquel cas ça m'intéresse !

  4. #4
    Archosien amateur Avatar de hedamilt
    Date d'inscription
    mars 2010
    Âge
    23
    Messages
    66
    euh je vois pas l'interet de vouloir lancer les commandes depuis l'archos je trouve ça plus lent de taper avec le claviet tactile pour ssh c'est hyper simple
    tu active le hack gft3, connecte l'archos au wifi, depuis un terminal tu tape ceci: ssh -l root addresse.ip.de.ton.archos
    windows, c'est comme les prostituées: tu paye cher et t'a plein d'emmerdes!
    linux c'est comme les femmes: une fois que tu t'y ai habitué, c'est genial et gratuit!

Informations de la discussion

Utilisateur(s) sur cette discussion

Il y a actuellement 1 utilisateur(s) naviguant sur cette discussion. (0 utilisateur(s) et 1 invité(s))

Discussions similaires

  1. Peut on créer une section Tuto Sur le 7 HT? ....
    Par taz71_fr dans le forum A propos du forum
    Réponses: 1
    Dernier message: 14/06/2010, 18:54:26
  2. Ouvrir deux pages internet en meme temps sur archos 5
    Par felix larrouy dans le forum Gen 6
    Réponses: 8
    Dernier message: 19/02/2010, 19:51:07
  3. Est-ce possible d'avoir 2 TV+ sur le même réseau ?
    Par matbkk dans le forum Autres produits
    Réponses: 2
    Dernier message: 13/05/2009, 05:22:31
  4. la même qu'avec l'archos 605 ??
    Par jide dans le forum Gen 6
    Réponses: 4
    Dernier message: 18/10/2008, 14:20:42
  5. Réponses: 17
    Dernier message: 26/11/2007, 17:59:28

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •