Menu

Problème droits root et divers [Résolu]

Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
-
Bonjour bonne année à la communauté,

J'ai un script shell que je dois exécuter en root (à cause de la commande ufw) :

#! /bin/bash

COUNTER=0
fichier=/var/www/parefeu/ip_address.txt

# on crée une boucle infinie
while [ $COUNTER -eq 0 ]; do

# on vérifie si le fichier est vide ou pas
# methode alternative : test -s $fichier || continue
# methode alternative : grep ":" $fichier || continue
cat $fichier | grep ":" || continue

# on lit les infos dans le fichier texte
IFS=':' read -r adresse port <$1

# on crée une nouvelle règle
ufw allow in proto tcp from $adresse to any port $port

# on réinitialise le fichier texte
truncate -s 0 $fichier

# on recharge le pare-feu
ufw reload

done


1) Si j'exécute le script manuellement (./ufw_conf.sh) depuis /root ça fonctionne, la création d'une nouvelle règle ufw fonctionne.

2) Si j'exécute le script depuis le crontab root (@reboot /root/ufw_conf.sh) le script est bien démarré :
root@sd-18936:~# ps aux | grep "ufw"
root       695  0.0  0.0   4340   720 ?        Ss   11:25   0:00 /bin/sh -c /root/ufw_conf.sh
root       710  0.1  0.0  13400  3208 ?        S    11:25   0:02 /bin/bash /root/ufw_conf.sh
root     18941  0.0  0.0  12756  2104 pts/0    S+   12:08   0:00 grep ufw

mais il ne fonctionne pas (il ne crée pas de nouvelle règle ufw).

3) Si j'exécute le script depuis un utilisateur normal (/home/utilisateur/ufw_conf.sh) avec les droits root (permission spéciale u+s) le script démarre mais ne fonctionne pas.

Voilà la question : pourquoi dans le cas n°2 et n°3 ça ne fonctionne pas comme attendu ?

Je suis sur Debian "Jessie"


Configuration: Win 7 Pro SP1 64bits
Athlon X4 750K Quad Core
8 Go DDR3 1866 Mhz



“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Afficher la suite 

Votre réponse

4 réponses

Messages postés
1878
Date d'inscription
mercredi 21 août 2002
Statut
Contributeur
Dernière intervention
7 janvier 2019
133
0
Merci
root a accès à /var/www ?

Sinon ajoute root au group www-data
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
oui root a accès à /var/www puisque ça fonctionne si je lance le script manuellement (cas n°1)
cs_PaTaTe
Messages postés
1878
Date d'inscription
mercredi 21 août 2002
Statut
Contributeur
Dernière intervention
7 janvier 2019
133 -
Il peut avoir les droits d'exécution mais pas d'écriture ^^
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Ok j'ai rajouté root au groupe www-data, je vais tester.
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Non ça ne marche pas toujours pas via crontab.
Commenter la réponse de cs_PaTaTe
Messages postés
36089
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
23 janvier 2019
5723
0
Merci
Salut,

Moi ce qui me gène dans le résultat de ton
ps aux | grep "ufw"
c'est
/bin/sh -c /root/ufw_conf.sh
;-\

Ton fichier est exécuté 2 fois (
/bin/bash /root/ufw_conf.sh
) ;-\

La 2nd fois c'est le shell bash qui l'exécute (comme dans le shebang (
#! /bin/bash
) de ton script).

La 1ère fois c'est le shell sh qui l'exécute, faisant fi du shebang et comme
/bin/sh
est un lien symbolique vers
/bin/dash
, peut-être y-a-t-il des erreurs de syntaxe ;-(

À vérifier…
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Salut, je comprend le problème mais comment corriger cela ?
zipe31
Messages postés
36089
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
23 janvier 2019
5723 -
J'y pense… crontab n'a pas d'environnement, donc, essaie soit de charger l'environnement root en début de script (sourcer le.bashrc de root (
source /root/.bashrc
)), soit de donner le chemin absolu de toutes tes commandes dans ton script.
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
source /root/.bashrc n' a rien donné de plus, par contre j'ai mis les chemins absolus de chaque commande de mon script et on dirait que ça fonctionne, merci beaucoup.

Je continue les tests ...
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Tout a l'air ok, je passe le sujet en "résolu".

Merci à tous pour votre aide.

A bientôt.
Commenter la réponse de zipe31
Messages postés
17587
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
21 janvier 2019
5980
0
Merci
hello
pour récupérer les messages et erreurs du cron, ajouter à la ligne dans crontab
.... > /tmp/log 2>&1

avec les droits root (permission spéciale u+s) le script démarre mais ne fonctionne pas.
beaucoup de systèmes empêchent les scripts suid root pour des questions de sécurité, essayer
sudo ufw_conf.sh
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Slt, dommage Setuid est plus pratique que sudo, pas besoin de rentrer de mot de passe.
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
J'ai rajouté > /tmp/log 2>&1 à ma tâche cron, merci pour l'astuce.
Commenter la réponse de dubcek
Messages postés
47
Date d'inscription
jeudi 13 décembre 2018
Dernière intervention
24 janvier 2019
3
0
Merci
salut,

je vais le dire crûment, sans vouloir te blesser, ton script est merdique.

pourquoi la variable COUNTER (qui devrait être écrite en minuscule : par convention seules les variables d'environnement doivent être tout en majuscules) n'est-elle en aucun cas incrémentée ?
pourquoi utiliser
cat
, alors que
grep
sait lire des fichiers ?
pourquoi
read
lit-il un fichier (
$1
) qui n'est pas donné en argument au script ?
pourquoi
truncate
plutôt que
rm
, ou un simple écrasement par redirection ?
lEprofSonDkon
Messages postés
47
Date d'inscription
jeudi 13 décembre 2018
Dernière intervention
24 janvier 2019
3 > barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
-
1- une boucle infinie s'écrit
while true; do...; done

n'existe-t-il vraiment pas une condition qui doit faire quitter le script.
pourquoi n'est-il pas plutôt inscrit dans une crontab ? sans boucle infinie, donc.
même un petit script qui s'exécute en permanence finit par consommer beaucoup de ressources.
2- c'est un UUOC.
3- ok
4-
>fichier_à_écraser
, c'est aussi simple que ça.
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
1- non il n'y a aucune condition qui doit faire quitter le script, le script est lancé au démarrage via une crontab.
2- je m'en doutais, d'ailleurs c'est déjà corrigé ;)
4- excellent, même pas besoin d'un petit echo devant la redirection ?
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Voilà la version actuelle :

#! /bin/sh

fichier=/var/www/parefeu/ip_address.txt

# on crée une boucle infinie
while true; do

# on ralentit la boucle
/bin/sleep 1

# on vérifie si le fichier est vide ou pas
# /usr/bin/test -s $fichier || continue
/bin/grep ":" || continue

# on lit les infos dans le fichier texte
IFS=':' read -r adresse port <$fichier

# on crée une nouvelle règle
/usr/sbin/ufw allow in proto tcp from $adresse to any port $port

# on réinitialise le fichier texte
>$fichier

# on recharge le pare-feu
/usr/sbin/ufw reload

done

Si tu vois d'autres choses, fais-moi signe.
lEprofSonDkon
Messages postés
47
Date d'inscription
jeudi 13 décembre 2018
Dernière intervention
24 janvier 2019
3 > barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
-
#!/bin/sh                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                          
fichier=/var/www/parefeu/ip_address.txt                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                          
while true                                                                                                                                                                                                                                                                
do                                                                                                                                                                                                                                                                        
    if test -s "$fichier"                                                                                                                                                                                                                                                 
    then                                                                                                                                                                                                                                                                  
        IFS=':' read -r adresse port <"$fichier"                                                                                                                                                                                                                          
        /usr/sbin/ufw allow in proto tcp from "$adresse" to any port "$port"                                                                                                                                                                                              
        >"$fichier"                                                                                                                                                                                                                                                       
        /usr/sbin/ufw reload                                                                                                                                                                                                                                              
    fi                                                                                                                                                                                                                                                                    
    sleep 1                                                                                                                                                                                                                                                               
done
barnabe0057
Messages postés
12154
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
12 janvier 2019
2346 -
Ok merci.

Demain boulot donc maintenant dodo, bonne nuit !
Commenter la réponse de lEprofSonDkon