|
"Кодим в Bash!" Гребенников Роман ака voy Xakep, номер #055, стр. 055-064-3 mkdir $HOME/$SCRDIR # то делаем ее fi while test "$ok" = "0"; do num=$((1+$num)) if [ ! -f $HOME/$SCRDIR/screen$num.bmp ]; then import -window root $HOME/$SCRDIR/screen$num.bmp ok=1 fi done Если ты пробовал кодить, то в этой программке сможешь разобраться и без моих комментариев. Что она делает: 1) создает папку screens, если ее нет. 2) смотрит, какие файлы там есть (screen1, screen2, ...), и пишет скриншот так, чтобы ничего случайно не переписать, т.е. под новым именем. Преимущество использования import перед gimp'ом в том, что первый способен хватать даже окна эмуляторов, тогда как второй все время на них ругается. [Полезное: cgi-сканер] До каких только извращений не дойдешь, изучая Bash! Можно было бы, конечно, придумать более обыденную вещь, но надо же соответствовать хакерской тематике журнала ;). Работа с сетью в Bash реализована на высоком уровне, т.е. шуршать кучами сокетов тебе не придется. Потребуются кое-какие утилиты: например, netcat (есть во всех BSD, а вот в линуксе - не везде, поэтому флаг тебе в руки и поисковик под хвост). Сначала у меня возникла идея утереть всем носы и сочинить многопоточный сканер, ведь я же заслуженный извращенец РФ. Но, сделав первые наброски, я увидел, что код с многопоточностью по размеру переваливает за два килобайта, так что придется терпеть и пользоваться простым сканером всего лишь с одним потоком. Единственный плюс этой программы – ее размер всего 410 байт (его, конечно, можно было бы сократить до 342 байт за счет названий переменных, но тогда код потеряет читабельность): (0)#!/bin/sh (1)num=1 (2)ok=1 (3)count=1 (4)for vuln in $(<cgi.db); do (5)bug[num]=$vuln (6)for i in `echo -e "HEAD $bug[num]} HTTP/1.0 \n\n"|nc $1 80`; do (7)if test $(($count>3)) = 1; then break; fi (8)if test "$(echo $i|grep OK)" != ""; then result=1; fi (9)count=$(($count+1)) (A)done (B)count=1 (C)if test "$result" = "1" then echo [200] ${bug[num]}; echo ${bug[num]}>>cgi.out; result=1 (D)else echo [404] ${bug[num}; fi (E)num=$(($num+1)) (F)done Примечание: циферки в скобочках - номера строк, они к коду Bash никакого отношения не имеют, а написаны здесь просто для удобства. Все вылизано, но, скорее всего, ни фига не понятно. Давай разбираться. Наверняка тебя заинтересовали циклы, которые я использовал в коде: так вот, в Bash они не совсем такие, как, например, в паскале или в Cи. Строка 'for vuln in $(<cgi.db)` с каждым шагом цикла засовывает новую строку из файла cgi.db в переменную vuln. Если тебе вдруг приспичило сделать обычный цикл, то используй while (тут уж в синтаксисе ничего нового нет). В шестой строчке обрати внимание на апострофы: они там обратные, т.е. мы попеременно суем в $i отдельные слова, разделенные пробелами в выводе веб-сервера после отправки запроса. В седьмой строчке мы выходим из цикла после третьего слова: обычно результат запроса (200 или 404) находится именно в этом промежутке. [Конец] Ну вот, как видишь, не одними Сями и Перлом живут юниксоиды, есть вещи попроще и повеселее, на которых накодить что-нибудь свое для личного использования сможет даже перевозбужденный пятиклассник. Да, у языка много нюансов, знание которых приходит со временем, практикой и познавательным чтением сообщений об ошибках, о которых радостным повизгиванием сообщает тебе интерпретатор. Ошибки - они есть всегда, как бы ты ни старался отловить их все. Я лично в своем cgi-сканере уже перед отправкой статьи редактору выловил маленький и неприметный баг, за который запросто мог бы впоследствии получить по голове. Удачи тебе в изучении Bash, ну, а в случае знакомства с граблями - мыль. |