0

I've been burning my brains out before finally decided to ask it here. I'm new in linux/bash scripting. So there goes my question:

I'm using this little script in order to block certain countries from accessing my server (It's a little webserver on debian)

#!/bin/bash
TERM='xterm'
#
for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/countries/**country.zone**) ; do
    ipset add blacklist $IP
done

the thing is that i don't wanna re-edit the script every time i want to block another country (change the country.zone) there are like 238 country zones that i can choose from. My question being - How can I make a script that show's me the entire list of zones and asks and me to choose one or more (ex: cn.zone) that will download and adding it to ipset.

I know it's much easier to add the ones that i don't want to block and block the rest I know i can select multiple zones at once {1.zone, 2.zone, 3.zone}.

Basically i want a script that will show me all the zones (like in a table) choose one (or more) from there and then the script will download the selected zone/s and adds them to ipset.

1
  • Zenity has a nice GUI selector that you could use for this I believe
    – IT_User
    Apr 14, 2016 at 13:34

2 Answers 2

1

My solution would be:

!/bin/bash

for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/countries/$1.zone) 
do 
  ipset add blacklist $IP
done

Where $1 is a parameter you send as input, i.e: "it". This basically allows you to determine which zone to block.

As this is not usefull if you want to ban a lot of zones, I would suggest to add all zones you want to block to a file and then read it with a for loop:

/zones_to_block:

it
es
au

CLI:

for zone in $(cat zones_to_block); do ./block_zones $zone; done
0

Assumes you have GNU grep:

url=http://www.ipdeny.com/ipblocks/data/countries
allzones=( $(wget -qO- "$url" | grep -oP 'href="\K[^"]+\.zone') )

PS3="enter a number (^C to quit): "
select zone in "${allzones[@]}"; do
    if [[ $zone == *.zone ]]; then
        for IP in $(wget -qO- "$url/$zone"); do
            ipset add blacklist "$IP"
        done
    fi
done

With a terminal 80 columns wide, we see this:

 1) ad.zone    49) cv.zone   97) im.zone  145) ms.zone  193) sl.zone
 2) ae.zone    50) cw.zone   98) in.zone  146) mt.zone  194) sm.zone
 3) af.zone    51) cy.zone   99) io.zone  147) mu.zone  195) sn.zone
 4) ag.zone    52) cz.zone  100) iq.zone  148) mv.zone  196) so.zone
 5) ai.zone    53) de.zone  101) ir.zone  149) mw.zone  197) sr.zone
 6) al.zone    54) dj.zone  102) is.zone  150) mx.zone  198) ss.zone
 7) am.zone    55) dk.zone  103) it.zone  151) my.zone  199) st.zone
 8) ao.zone    56) dm.zone  104) je.zone  152) mz.zone  200) sv.zone
 9) ap.zone    57) do.zone  105) jm.zone  153) na.zone  201) sx.zone
10) ar.zone    58) dz.zone  106) jo.zone  154) nc.zone  202) sy.zone
11) as.zone    59) ec.zone  107) jp.zone  155) ne.zone  203) sz.zone
12) at.zone    60) ee.zone  108) ke.zone  156) nf.zone  204) tc.zone
13) au.zone    61) eg.zone  109) kg.zone  157) ng.zone  205) td.zone
14) aw.zone    62) er.zone  110) kh.zone  158) ni.zone  206) tg.zone
15) az.zone    63) es.zone  111) ki.zone  159) nl.zone  207) th.zone
16) ba.zone    64) et.zone  112) km.zone  160) no.zone  208) tj.zone
17) bb.zone    65) eu.zone  113) kn.zone  161) np.zone  209) tk.zone
18) bd.zone    66) fi.zone  114) kp.zone  162) nr.zone  210) tl.zone
19) be.zone    67) fj.zone  115) kr.zone  163) nu.zone  211) tm.zone
20) bf.zone    68) fm.zone  116) kw.zone  164) nz.zone  212) tn.zone
21) bg.zone    69) fo.zone  117) ky.zone  165) om.zone  213) to.zone
22) bh.zone    70) fr.zone  118) kz.zone  166) pa.zone  214) tr.zone
23) bi.zone    71) ga.zone  119) la.zone  167) pe.zone  215) tt.zone
24) bj.zone    72) gb.zone  120) lb.zone  168) pf.zone  216) tv.zone
25) bl.zone    73) gd.zone  121) lc.zone  169) pg.zone  217) tw.zone
26) bm.zone    74) ge.zone  122) li.zone  170) ph.zone  218) tz.zone
27) bn.zone    75) gf.zone  123) lk.zone  171) pk.zone  219) ua.zone
28) bo.zone    76) gg.zone  124) lr.zone  172) pl.zone  220) ug.zone
29) bq.zone    77) gh.zone  125) ls.zone  173) pm.zone  221) us.zone
30) br.zone    78) gi.zone  126) lt.zone  174) pr.zone  222) uy.zone
31) bs.zone    79) gl.zone  127) lu.zone  175) ps.zone  223) uz.zone
32) bt.zone    80) gm.zone  128) lv.zone  176) pt.zone  224) va.zone
33) bw.zone    81) gn.zone  129) ly.zone  177) pw.zone  225) vc.zone
34) by.zone    82) gp.zone  130) ma.zone  178) py.zone  226) ve.zone
35) bz.zone    83) gq.zone  131) mc.zone  179) qa.zone  227) vg.zone
36) ca.zone    84) gr.zone  132) md.zone  180) re.zone  228) vi.zone
37) cd.zone    85) gt.zone  133) me.zone  181) ro.zone  229) vn.zone
38) cf.zone    86) gu.zone  134) mf.zone  182) rs.zone  230) vu.zone
39) cg.zone    87) gw.zone  135) mg.zone  183) ru.zone  231) wf.zone
40) ch.zone    88) gy.zone  136) mh.zone  184) rw.zone  232) ws.zone
41) ci.zone    89) hk.zone  137) mk.zone  185) sa.zone  233) ye.zone
42) ck.zone    90) hn.zone  138) ml.zone  186) sb.zone  234) yt.zone
43) cl.zone    91) hr.zone  139) mm.zone  187) sc.zone  235) za.zone
44) cm.zone    92) ht.zone  140) mn.zone  188) sd.zone  236) zm.zone
45) cn.zone    93) hu.zone  141) mo.zone  189) se.zone  237) zw.zone
46) co.zone    94) id.zone  142) mp.zone  190) sg.zone
47) cr.zone    95) ie.zone  143) mq.zone  191) si.zone
48) cu.zone    96) il.zone  144) mr.zone  192) sk.zone
enter a number (^C to quit): 
1
  • Thanks a lot Glenn, this is exactly what i wanted. Ive been doing it with 237 $options :))).. thanks again Apr 15, 2016 at 7:33

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .