[chmod] Set-Uid (résolu)

Applications, problèmes de configuration réseau
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

[chmod] Set-Uid (résolu)

Message par AchilleFraisse »

Bonjour,
J'ai un programme qui nécessite d'être lancé en root, car il modifie le contenu dans fichier root. Je l'éxécute donc comme ça :

Code : Tout sélectionner

sudo ./mon_programme
Afin que je puisse le modifier en tant qu'utilisateur normal, je fais :

Code : Tout sélectionner

sudo chown root:root mon_programme
sudo chmod u+s mon_programme
Et quand je tape :

Code : Tout sélectionner

./mon_programme
il me dit encore qu'il faut que je soit root. Bizzare, non ?
Dernière modification par AchilleFraisse le ven. 19 août 2016, 18:46, modifié 1 fois.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17632
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [chmod] Set-Uid

Message par benjarobin »

Bonjour, si c'est un script c'est normal...
Par contre je n'ai pas vraiment compris pourquoi tu avais besoin des droits root. Ton programme fait quoi concrètement ?
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [chmod] Set-Uid

Message par AchilleFraisse »

A...
Oui, c'est un script bash.

Et du coup, je fais comment ?
Je veux modifier la valeur de /sys/class/leds/asus::kbd_backlight/brightness en tant qu'utilisateur normal, donc sans passer par root et sans modifier les droits et le propriétaire du fichier brigtness.
C'est un script pour modifier le rétro-éclairage de mon clavier.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17632
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [chmod] Set-Uid

Message par benjarobin »

Pourquoi tu ne veux pas modifier les droits de ce fichier ? Ce serait plus sécurisé que de faire un bête programme setuid (à moins de faire correctement les choses). Bref, si tu veux le faire, il faut le faire en C
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
avi3000
Chu Ko Nu
Messages : 405
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [chmod] Set-Uid

Message par avi3000 »

Achille a posé cette question dans un autre sujet.

Je lui ai donné la solution propre avec udev qui évite les bidouillages inutiles en root.

viewtopic.php?f=15&t=18268&p=154788&sid ... ac#p154788
Je suis sur devuan avec sysvinit et kbwm
AchilleFraisse
Elfe
Messages : 623
Inscription : dim. 27 avr. 2014, 09:32

Re: [chmod] Set-Uid

Message par AchilleFraisse »

Ok, merci
avi3000
Chu Ko Nu
Messages : 405
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [chmod] Set-Uid (résolu)

Message par avi3000 »

Le programme C qui fait ce que tu veux sans le paquet upower.

la compile => gcc asus-kbd-brightness.c -o asus-kbd-brightness -std=gnu99 -Wall -s
les capabilities => sudo setcap cap_setuid+ep asus-kbd-brightness

c'est cadeau.

asus-kbd-brightness.c

Code : Tout sélectionner

#define APPNAME         "asus-kbd-brightness"
#define BRIGHTNESS_FILE "/sys/class/leds/asus::kbd_backlight/brightness"
#define USAGE       "---------------------------------------------------------------\n" \
                    "                                                               \n" \
                    "                        "APPNAME"                              \n" \
                    "          gère la luminosité du clavier des netbooks Asus      \n" \
                    "                                                               \n" \
                    "           "APPNAME" [dDuU0123]                                \n" \
                    "                                                               \n" \
                    "   modus operandi :                                            \n" \
                    "       controle le paramètre de luminosité                     \n" \
                    "       met à jour le fichier                                   \n" \
                    "           "BRIGHTNESS_FILE"                                   \n" \
                    "                                                               \n" \
                    "   testé et fonctionnel sur l'ux31a, avec 4 niveaux de         \n" \
                    "   luminosité.                                                 \n" \
                    "   Avec des niveaux supplémentaires de luminosité il faut      \n" \
                    "   modifier les tests de switch ( argv[1][0] )                 \n" \
                    "                                                               \n" \
                    "---------------------------------------------------------------\n" \

/*  capabilities :  cap_setuid+ep */
/*  gcc asus-kbd-brightness.c -o asus-kbd-brightness -std=gnu99 -Wall -s  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>

#define CHECK_ACCESS(fn, mode) \
if ( access(fn, mode) != 0 ) { \
    printf("%s, mode %u\n", fn, mode); \
    perror("\t"); \
    exit(EXIT_FAILURE); \
}

#define     PRINT_USAGE { \
    fprintf(stderr, USAGE); \
    exit(1); \
}

static char read_brightness_file() { 
    FILE* file; 
    char c = '\0';

    if ( (file = fopen(BRIGHTNESS_FILE, "r")) ) {  
        c = fgetc(file); 
        fclose(file);
    } 
    return c; 
}

static char write_brightness_file(char level) { 
    FILE* file; 

    if ( (file = fopen(BRIGHTNESS_FILE, "w")) ) {  
        fputc(level, file); 
        fclose(file);
        return level;
    } 
    printf("fopen(BRIGHTNESS_FILE, w)\n");
    perror("\t"); \
    return 0; 
}

int main(int argc, char *argv[]) {
    if ( argc != 2 ) {
        PRINT_USAGE
    }
 
    setuid(0);
    CHECK_ACCESS(BRIGHTNESS_FILE, W_OK) 

    switch ( argv[1][0] ) {
        case 'D' :;
        case 'd' : write_brightness_file(read_brightness_file() - '\1'); break;
        case 'U' :;
        case 'u' : write_brightness_file(read_brightness_file() + '\1'); break;
        case '0' :;
        case '1' :;
        case '2' :;
        case '3' : write_brightness_file(argv[1][0]); break;
        default : PRINT_USAGE
    }

    return 0;
}
Je suis sur devuan avec sysvinit et kbwm
Répondre