• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Script arbeitet manuell, per cronjob nicht

Herakles

Profifragensteller
Themenstarter #1
Moin!

Ich möchte gern einen installierten dnsmasq auf meinem Router (OpenBSD 5.3 i386) dazu nutzen, bekannte Werbe- und Malwareseiten auszusperren, also bei DNS-Anfrage ins Leere laufen zu lassen. Die c't hatte neulich einen interessanten Artikel zu dem Thema und auch das "pihole"-Projekt sollte dem Einen oder Anderen geläufig sein.

Nun habe ich mir ein Script aus meherern Internetseiten zusammengesucht, in dem via curl Blacklist-Listen heruntergeladen werden und anschließend in eine Datei abgespeichert werden, die dnsmasq als Teil seiner Konfiguration anziehen soll.

Mein Problem ist nun, dass ich das Script via cronjob einmal pro Tag laufen lassen möchte. Zum besseren Verständnis habe ich dafür eine eigene Zeile in der crontab geschrieben, die das Script startet:

Code:
# crontab -e
(...)
0      3      *       *       *       /usr/local/bin/generate_dnsmasq_blocklist.sh
Das Script selbst hat folgende Rechte:

Code:
# ls -l /usr/local/bin/generate_dnsmasq_blocklist.sh
-rwxrwxrwx  1 herakles  wheel  2995 Aug  3 12:47 /usr/local/bin/generate_dnsmasq_blocklist.sh
Starte ich das Script händisch auf der Konsole, macht es, was es soll: Es lädt die Listen herunter und speichert sie in einer Datei ab. Wenn ich das aber per conjob machen lasse, ist die Zieldatei im Anschluss einfach leer. Ich kann mir nicht erklären, wieso das so ist.

Hier der obere Teil des Scripts, den ich einfach mal mit einem "exit(0)" abgeschnitten habe, einfach um besser debuggen zu können und Fehlerquellen auszuschließen:

Code:
#!/bin/sh
# Modified Pi-hole script to generate a generic hosts file
# for use with dnsmasq's addn-hosts configuration
# original : https://github.com/jacobsalmela/pi-hole/blob/master/gravity-adv.sh

# The Pi-hole now blocks over 120,000 ad domains
# Address to send ads to (the RPi)
redirectIP="127.0.0.1"

outlist='/etc/dnsmasq.adblock.conf'
tempoutlist="$outlist.tmp"

tempoutlist='/tmp/out'

#echo "Getting yoyo ad list..." # Approximately 2452 domains at the time of writing
curl -s -d mimetype=plaintext -d hostformat=unixhosts http://pgl.yoyo.org/adservers/serverlist.php? | sort > $tempoutlist
exit 0
echo "Getting winhelp2002 ad list..." # 12985 domains
curl -s http://winhelp2002.mvps.org/hosts.txt | grep -v "#" | grep -v "127.0.0.1" | sed '/^$/d' | sed 's/\ /\\ /g' | awk '{print $2}' | sort >> $tempoutlist
echo "Getting adaway ad list..." # 445 domains
curl -s https://adaway.org/hosts.txt | grep -v "#" | grep -v "::1" | sed '/^$/d' | sed 's/\ /\\ /g' | awk '{print $2}' | grep -v '^\\' | grep -v '\\$' | sort >> $tempoutlist
echo "Getting hosts-file ad list..." # 28050 domains
curl -s http://hosts-file.net/.%5Cad_servers.txt | grep -v "#" | grep -v "::1" | sed '/^$/d' | sed 's/\ /\\ /g' | awk '{print $2}' | grep -v '^\\' | grep -v '\\$' | sort >> $tempoutlist
echo "Getting malwaredomainlist ad list..." # 1352 domains
curl -s http://www.malwaredomainlist.com/hostslist/hosts.txt | grep -v "#" | sed '/^$/d' | sed 's/\ /\\ /g' | awk '{print $3}' | grep -v '^\\' | grep -v '\\$' | sort >> $tempoutlist
echo "Getting adblock.gjtech ad list..." # 696 domains
curl -s http://adblock.gjtech.net/?format=unix-hosts | grep -v "#" | sed '/^$/d' | sed 's/\ /\\ /g' | awk '{print $2}' | grep -v '^\\' | grep -v '\\$' | sort >> $tempoutlist
echo "Getting someone who cares ad list..." # 10600
curl -s http://someonewhocares.org/hosts/hosts | grep -v "#" | sed '/^$/d' | sed 's/\ /\\ /g' | grep -v '^\\' | grep -v '\\$' | awk '{print $2}' | grep -v '^\\' | grep -v '\\$' | sort >> $tempoutlist
echo "Getting Mother of All Ad Blocks list..." # 102168 domains!! Thanks Kacy
curl -s -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' -e http://forum.xda-developers.com/ http://adblock.mahakala.is/ | grep -v "#" | awk '{print $2}' | sort >> $tempoutlist

# Sort the aggregated results and remove any duplicates
# Remove entries from the whitelist file if it exists at the root of the current user's home folder
echo "Removing duplicates and formatting the list of domains..."
        cat $tempoutlist | sed $'s/\r$//' | sort | uniq | sed '/^$/d' | awk -v "IP=$redirectIP" '{sub(/\r$/,""); print "address=/"$0"/"IP}' > $outlist
# Count how many domains/whitelists were added so it can be displayed to the user
numberOfAdsBlocked=$(cat $outlist | wc -l | sed 's/^[ \t]*//')
echo "$numberOfAdsBlocked ad domains blocked."

/etc/rc.d/dnsmasq restart
logger "fertig"
Der untere Teil mit 'logger "fertig"' wird so natürlich nie erreicht, das ist ein Überbleibsel aus meinen Tests, um das Script zum Laufen zu bringen. Lasse ich das Script manuell von der Konsole laufen, füllt sich die Datei "/tmp/out" mit Inhalt. Mache ich selbiges per conjob, bleibt die Datei "/tmp/out" leer.

Hat jemand eine Idee, was ich hier falsch mache?

Herzliche Grüße
Herakles
 

bsd4me

Well-Known Member
#3
Der Pfad ist nur auf /usr/bin:/bin oder ähnlich gesetzt - es fehlt z.B. /usr/local/bin für curl. Erweitere PATH im Script :) Ich denke, dass wird helfen :)
VG Norbert
 

KobRheTilla

used register
#6
Hi,

ist zwar OT aber dennoch der Hinweis.

Wenn du keine Single-User-Maschine betreibst, würde ich die Rechte ein wenig enger gestalten.
Da ein Systemdienst am Ende neu gestartet wird, nehme ich an, dass das Skript im Kontext root ausgeführt wird. In diesem Fall sollte das Skript root gehören und keine Schreibrechte für niedrig privilegierte Benutzer haben. Schon gar nicht für world.

Rob