Доброго времени суток! Собственно вопрос в названии. Цель - подобие прокси сервера на bash (ну или python... предпочтительно bash). И вырезать ряд строк из web страниц на лету. По шаблону (или правилам скрипта) разумеется. Спасибо заранее!
Вот наткнулся на кое-что: Код (Bash): #!/bin/sh -e if [ $# != 3 ] then echo "usage: $0 <src-port> <dst-host> <dst-port>" exit 0 fi TMP=`mktemp -d` BACK=$TMP/pipe.back SENT=$TMP/pipe.sent RCVD=$TMP/pipe.rcvd trap 'rm -rf "$TMP"' EXIT mkfifo -m 0600 "$BACK" "$SENT" "$RCVD" sed 's/^/ => /' <"$SENT" & sed 's/^/<= /' <"$RCVD" & nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" но пока не ясно как <dst-host> и <dst-port> подучать не при запуске вот такого вида(с выводом при подключении браузера): Код (Bash): igor@debian-i:~/coding/bash/proxy$ ./tcp-proxy.sh 8080 www.google.com 80 => GET http://127.0.0.1:8080/ HTTP/1.1 => Host: 127.0.0.1:8080 => Proxy-Connection: keep-alive => User-Agent: Mozilla/5.0 (X11; Linux i686) KHTML/4.8.4 (like Gecko) Konqueror/4.8 => Accept: text/html, text/*;q=0.9, image/jpeg;q=0.9, image/png;q=0.9, image/*;q=0.9, */*;q=0.8 => Accept-Encoding: gzip, deflate, x-gzip, x-deflate => Accept-Charset: utf-8,*;q=0.5 => Accept-Language: en-US,en;q=0.9 => <= HTTP/1.1 301 Moved Permanently <= Location: http://www.google.com:8080/ <= Content-Type: text/html; charset=UTF-8 <= Date: Sun, 01 Oct 2017 09:25:47 GMT <= Expires: Tue, 31 Oct 2017 09:25:47 GMT <= Cache-Control: public, max-age=2592000 <= Server: gws <= Content-Length: 224 <= X-XSS-Protection: 1; mode=block <= X-Frame-Options: SAMEORIGIN <= <= <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <= <TITLE>301 Moved</TITLE></HEAD><BODY> <= <H1>301 Moved</H1> <= The document has moved <= <A HREF="http://www.google.com:8080/">here</A>. <= </BODY></HTML> => GET http://127.0.0.1:8080/ HTTP/1.1 => Host: 127.0.0.1:8080 => Proxy-Connection: keep-alive => User-Agent: Mozilla/5.0 (X11; Linux i686) KHTML/4.8.4 (like Gecko) Konqueror/4.8 => Accept: text/html, text/*;q=0.9, image/jpeg;q=0.9, image/png;q=0.9, image/*;q=0.9, */*;q=0.8 => Accept-Encoding: gzip, deflate, x-gzip, x-deflate => Accept-Charset: utf-8,*;q=0.5 => Accept-Language: en-US,en;q=0.9 => <= HTTP/1.1 301 Moved Permanently <= Location: http://www.google.com:8080/ <= Content-Type: text/html; charset=UTF-8 <= Date: Sun, 01 Oct 2017 09:25:53 GMT <= Expires: Tue, 31 Oct 2017 09:25:53 GMT <= Cache-Control: public, max-age=2592000 <= Server: gws <= Content-Length: 224 <= X-XSS-Protection: 1; mode=block <= X-Frame-Options: SAMEORIGIN <= <= <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <= <TITLE>301 Moved</TITLE></HEAD><BODY> <= <H1>301 Moved</H1> <= The document has moved <= <A HREF="http://www.google.com:8080/">here</A>. <= </BODY></HTML> а получать эти параметры из запроса браузера: Код (Bash): => GET http://127.0.0.1:8080/ HTTP/1.1 => Host: 127.0.0.1:8080 => Proxy-Connection: keep-alive => User-Agent: Mozilla/5.0 (X11; Linux i686) KHTML/4.8.4 (like Gecko) Konqueror/4.8 => Accept: text/html, text/*;q=0.9, image/jpeg;q=0.9, image/png;q=0.9, image/*;q=0.9, */*;q=0.8 => Accept-Encoding: gzip, deflate, x-gzip, x-deflate => Accept-Charset: utf-8,*;q=0.5 => Accept-Language: en-US,en;q=0.9 Заранее Спасибо!
Берем любимый http прокси и ищем к нему соответствующий плагин. А на баше городить - себе жизнь усложнять.
Вообще-то утилита NetCat работает... испытал ряд примеров. И как прокси все прходит, правда на других примерах. Вопрос только в том, что в браузере набираем адрес и... в парметрах скрипта тоже надо указывать тот же адрес. Хотелось бы его получать из запроса браузера. Протестировал и такое: Код (Bash): #рабочий цикл function _fp1() { ((loop = 1)) while( ((loop > 0)) ) do echo "--test--" sleep 1 done } _fp1 & скрипт... точнее его одна функция продолжает работать и после выхода из скрипта - а это GOOD! и такая конструкция в тени: Код (Bash): sed 's/^/ => /' <"$SENT" & sed 's/^/<= /' <"$RCVD" & Очень понравилась - фильтрация потоков на лету. Пробую. Хотя Squid поставил, но не разобрался. А вообще хочу запустить на moxa или вообще роутере. В BASH универсально с программной точки зрения. Не даром же скачал и скомпилировал NC для moxa: https://www.moxa.ru/forum/index.php?/topic/25195-skazka-pro-nc-ili-kak-ego-ne-khvatalo/
Это не "работает как прокси". У прокси свой протокол, который решает эти проблемы, и писать его на баше - пустая трата времнеи.
Спорить никак не могу но вот: Только запускал так : Код (Bash): /tcp-proxy.sh 8080 www.google.ru 80 Браузер в свою очередь настроен на работу через прокси на локальной машине с портом 8080. Тоесть сделан один запрос и получен ответ. После чего скрипт завершил работу - он не цикличен, а просто пример. Понимаю, что это не прокси... будь у меня опыт с применением Squid и удачные результаты компиляции его из исходников для иных чем малина и ПК устройств... наверное и не трогал эту тему. По идее браузер должен послать и остальные запросы, если бы скрипт был доведён до ума.
Кстати вот посмотрите: Код (Bash): => GET http://www.google.ru/xjs/_/js/k=xjs.hp.en_US.xSVID3UgLuQ.O/m=sb_he,d/am=ABg/rt=j/d=1/t=zcms/rs=ACT90oEh2y26dtPEPoBVHRkD1LLulBcgmg HTTP/1.1 Это была попытка браузера послать очередной запрос после того как в скрипте сделаны изменения: Код (Bash): (( work = 1)) while( ((work == 1)) ) do nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" done вместо этого: Код (Bash): nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK" вот только параметры $2 и $3 изменить было некому в цикле потому, как они заданы