J'ai écrit ce script pour trouver tous les fichiers/répertoires auxquels $ WWWUSER a des permissions d'écriture. Au début, j'ai stocké les éléments correspondants restants dans un fichier temporaire. Je nouveau il doit y avoir un moyen sans utiliser de fichiers, c'est donc ma "solution". Cela fonctionne, mais c'est plutôt lent. Des conseils?Comment optimiser un script bash? (Trouver des fichiers, ignorer ceux sur la liste blanche, rapporter le reste)
Mise à jour: Sur une structure de répertoires contenant environ 7k répertoires et fichiers (30K ~ 8k) whitelistings le script prend environ 15 minutes ... (système de fichiers ext3, UW320 disque SCSI).
#!/usr/bin/env bash
# Checks the webroot for files owned by www daemon and
# writable at the same time. This is only needed by some files
# So we'll check with a whitelist
WWWROOT=/var/www
WWWUSER=www-data
WHITELIST=(/wp-content/uploads
/wp-content/cache
/sitemap.xml
)
OLDIFS=$IFS
IFS=$'\n'
LIST=($(find $WWWROOT -perm /u+w -user $WWWUSER -o -perm /g+w -group $WWWUSER))
IFS=$OLDIFS
arraycount=-1
whitelist_matches=0
for matchedentry in "${LIST[@]}"; do
arraycount=$(($arraycount+1))
for whitelistedentry in "${WHITELIST[@]}"; do
if [ $(echo $matchedentry | grep -c "$whitelistedentry") -gt 0 ]; then
unset LIST[$arraycount]
whitelist_matches=$(($whitelist_matches+1))
fi
done
LISTCOUNT=${#LIST[@]}
done
if [ $(echo $LISTCOUNT) -gt 0 ]; then
for item in "${LIST[@]}"; do
echo -e "$item\r"
done
echo "$LISTCOUNT items are writable by '$WWWUSER' ($whitelist_matches whitelisted)."
else
echo "No writable items found ($whitelist_matches whitelisted)."
fi
Est-il possible d'utiliser une application externe pour exécuter ceci, par ex. Perl? Il pourrait être raccourci et accélérer un peu en utilisant un hachage pour les références de la liste blanche. En utilisant un Shebang différent, il pourrait être le même. – 0xCAFEBABE
C'est possible oui, mais pas désiré. Mais je vais vérifier l'idée de TME, puis rechercher comment implémenter le vôtre. Merci! – weeheavy