具有多个(超过100个)select选项的脚本

最后决定在这里问问题之前,我一直在竭尽全力。 我是新的Linux / Bash脚本。 所以有我的问题:

我正在使用这个小脚本来阻止某些国家访问我的服务器(这是一个debian的小webserver)

#!/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个国家地区,我可以select。 我的问题是 – 我怎样才能做一个脚本,显示我的整个区域列表,并要求我select一个或多个(例如:cn.zone),将下载并添加到ipset。

我知道添加那些我不想阻止和阻止其他的我更容易,我知道我可以一次select多个区域{1.zone,2.zone,3.zone}。

基本上我想要一个脚本来显示所有区域(如表格),从那里select一个(或更多),然后脚本将下载选定的区域并将它们添加到ipset中。

我的解决scheme是:

!/斌/庆典

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

$1是您input的参数,即:“it”。 这基本上允许你确定哪个区域被阻塞。

因为如果你想禁止很多区域的话,这不是有用的,所以我build议你把所有要阻塞的区域添加到一个文件中,然后用for循环读取它:

/ zones_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列宽的terminal,我们可以看到:

  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):