Назад | Перейти на главную страницу

скрипт с несколькими (более 100) вариантами выбора

Я выжег себе мозги, прежде чем наконец решил спросить об этом здесь. Я новичок в сценариях 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.

Мое решение было бы:

! / bin / bash

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