Я выжег себе мозги, прежде чем наконец решил спросить об этом здесь. Я новичок в сценариях linux / bash. Итак, мой вопрос:
Я использую этот небольшой скрипт, чтобы заблокировать доступ определенных стран к моему серверу (это небольшой веб-сервер на 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
Дело в том, что я не хочу повторно редактировать сценарий каждый раз, когда я хочу заблокировать другую страну (изменить country.zone), существует около 238 страновых зон, из которых я могу выбирать. У меня вопрос: как я могу создать сценарий, который показывает мне весь список зон и просит меня выбрать одну или несколько (например, cn.zone), которые будут загружать и добавлять их в ipset.
Я знаю, что намного проще добавить те, которые я не хочу блокировать, и заблокировать остальные. Я знаю, что могу выбрать сразу несколько зон {1.zone, 2.zone, 3.zone}.
В основном мне нужен скрипт, который покажет мне все зоны (например, в таблице), выберите одну (или несколько) оттуда, а затем скрипт загрузит выбранную зону / зоны и добавит их в ipset.
Мое решение было бы:
for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/countries/$1.zone)
do
ipset add blacklist $IP
done
куда $1
- это параметр, который вы отправляете в качестве входных данных, то есть «оно». Это в основном позволяет вам определить, какую зону блокировать.
Поскольку это бесполезно, если вы хотите запретить много зон, я бы предложил добавить все зоны, которые вы хотите заблокировать, в файл, а затем прочитать его с помощью for
цикл:
/ zone_to_block:
it
es
au
CLI:
for zone in $(cat zones_to_block); do ./block_zones $zone; done
Предполагается, что у вас есть 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
С клеммой шириной 80 столбцов мы видим следующее:
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):