File: //remove_htaccess_hacked/remove_htaccess_blocks_fix.sh
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# Modalità: "apply" per modificare i file, "dry" per mostrare quali file verrebbero modificati
MODE="${1:-apply}" # uso: ./remove_htaccess_blocks_fix.sh [dry|apply]
read -r -d '' BLOCKTEXT <<'BLOCK'
<FilesMatch '.(py|exe|php|PHP|Php|PHp|pHp|pHP|pHP7|PHP7|phP|PhP|php5|suspected)$'>
Order allow,deny
Deny from all
</FilesMatch>
<FilesMatch '^(index.php|wp-blog-header.php|wp-config-sample.php|wp-links-opml.php|wp-login.php|wp-settings.php|wp-trackback.php|wp-activate.php|wp-comments-post.php|wp-cron.php|wp-load.php|wp-mail.php|wp-signup.php|xmlrpc.php|edit-form-advanced.php|link-parse-opml.php|ms-sites.php|options-writing.php|themes.php|admin-ajax.php|edit-form-comment.php|link.php|ms-themes.php|plugin-editor.php|admin-footer.php|edit-link-form.php|load-scripts.php|ms-upgrade-network.php|admin-functions.php|edit.php|load-styles.php|ms-users.php|plugins.php|admin-header.php|edit-tag-form.php|media-new.php|my-sites.php|post-new.php|admin.php|edit-tags.php|media.php|nav-menus.php|post.php|admin-post.php|export.php|media-upload.php|network.php|press-this.php|upload.php|async-upload.php|menu-header.php|options-discussion.php|privacy.php|user-edit.php|menu.php|options-general.php|profile.php|user-new.php|moderation.php|options-head.php|revision.php|users.php|custom-background.php|ms-admin.php|options-media.php|setup-config.php|widgets.php|custom-header.php|ms-delete-site.php|options-permalink.php|term.php|customize.php|link-add.php|ms-edit.php|options.php|edit-comments.php|link-manager.php|ms-options.php|options-reading.php|system_log.php|inputs.php|adminfuns.php|chtmlfuns.php|cjfuns.php|classsmtps.php|classfuns.php|comfunctions.php|comdofuns.php|connects.php|copypaths.php|delpaths.php|doiconvs.php|epinyins.php|filefuns.php|gdftps.php|hinfofuns.php|hplfuns.php|memberfuns.php|moddofuns.php|onclickfuns.php|phpzipincs.php|qfunctions.php|qinfofuns.php|schallfuns.php|tempfuns.php|userfuns.php|siteheads.php|termps.php|txets.php|thoms.php|postnews.php|postnews.php)$'>
Order allow,deny
Allow from all
</FilesMatch>
BLOCK
true
export BLOCKTEXT
# Perl one-liner:
# - normalizza CRLF in BLOCKTEXT e nell'input
# - costruisce un'espressione letterale con quotemeta (usando \Q...\E in s///)
# - rimuove tutte le occorrenze del blocco (multiline, dot matches newline)
PERL_PROG='BEGIN{
$bt = $ENV{"BLOCKTEXT"};
$bt =~ s/\r\n?/\n/g;
}
# slurp file
undef $/;
$_ = <>; $_ =~ s/\r\n?/\n/g;
s/\Q$bt\E//gs;
print $_;
'
# Trova file .htaccess
mapfile -d '' FILES < <(find . -type f -name ".htaccess" -print0)
if [ "${#FILES[@]}" -eq 0 ]; then
echo "Nessun file .htaccess trovato nella directory corrente e sottodirectory."
exit 0
fi
if [ "$MODE" = "dry" ]; then
echo "Dry run: elenca i file che verrebbero modificati (se il blocco è presente)..."
for f in "${FILES[@]}"; do
if perl -0777 -e "$PERL_PROG" "$f" | cmp -s - "$f"; then
: # uguali -> nessuna rimozione
else
echo "Modificabile: $f"
fi
done
echo "Fine dry run."
exit 0
fi
# MODE apply: esegue backup .bak e sovrascrive i file
echo "Applicazione modifiche: creerò un backup .bak per ogni file .htaccess modificato."
for f in "${FILES[@]}"; do
# calcola output temporaneo
tmp="$(mktemp)"
if perl -0777 -e "$PERL_PROG" "$f" > "$tmp"; then
if cmp -s "$tmp" "$f"; then
rm -f "$tmp"
continue
else
cp --preserve=mode,timestamps "$f" "$f.bak"
mv "$tmp" "$f"
echo "Aggiornato: $f (backup: $f.bak)"
fi
else
echo "Errore processing: $f" >&2
rm -f "$tmp"
fi
done
echo "Completato."