我一直在绞尽脑汁,最后才决定在这里问这个问题。我是 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。
答案1
我的解决方案是:
/bin/bash 复制代码
for IP in $(wget -O - http://www.ipdeny.com/ipblocks/data/countries/$1.zone)
do
ipset add blacklist $IP
done
您发送的输入参数在哪里$1
,即:“it”。这基本上允许您确定要阻止哪个区域。
如果您想禁止很多区域,这没有用,我建议将您想要阻止的所有区域添加到一个文件中,然后使用循环读取它for
:
/区域到区块:
it
es
au
命令行:
for zone in $(cat zones_to_block); do ./block_zones $zone; done
答案2
假设您有 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):