За шта је способан мозак ученика да учи о компјутерском свету?

Добар дан.

Након што сам завршио писање још једног сценарија у Басху, схватио сам да би све требало да буде потпуно другачије, али све је функционисало. Желим да вам покажем које сам опсцености и штаке написао да бих решио проблем, а да још немам вагон знања. Другим речима, карикатура програмирања.

Задатак


Нешто је постало неопходно за:

  • Приказано много рима за реч, осим квадратића
  • Укрстио многе риме две речи

За шта? Па, то је то - и то је то.
Ко не зна, квадратна рима (у народном говору - квадрат) су две речи чија се последња два слова у правопису поклапају, што их (често је то једино) чини римом. На пример, руже су мразне; гума - аутомобил. Употреба квадрата у савременој версификацији људи није нарочито одобравана, због њихове примитивности.

одлука


Чинило ми се да је најједноставније решење написати скрипту у Басху која користи већ постојећи генератор риме – ХОСТ, који их првенствено бира по сазвучју, а не по правопису. Какав ХОСТ? Јер ако наведете прави назив сајта, рећи ће да је то реклама. Зашто не наставите да га користите? Прво, упркос својој предности одабира риме на основу сазвучја, он и даље често производи квадрате. Друго, и даље морате да размишљате својим мозгом, трошите време на пребацивање између картица и енергију памтећи речи које се понављају на листама да бисте пронашли риму за две речи.

Добивање јаких рима

Шта ја знам? Знам за помоћ вгет, који преузима страницу на наведеној УРЛ адреси. У реду, хајде да извршимо захтев - добијамо ХТМЛ страницу у датотеци са именом која се римује. На пример, хајде да потражимо реч „овде“:

wget https://HOST/rifma/здесь

Али треба ми само списак речи, како да се отарасим свега осталог? Гледамо и видимо да је листа речи форматирана, ма колико чудна била, у облику листе, а речи су у ознакама . Па, имамо одличну помоћ. жеђ - хајде да то запишемо овако:

cat $word | grep '<li>' | sed -e "s%<li>%%" | sed -e "s%</li>%%" | sed -e "s/ //g" | sed -e "/^$/d" 1> $word

Прво, из датотеке речи изаберите редове који садрже ознаку — добијамо гомилу празних ознака и редова са речима. Уклањамо саму ознаку и њену завршну ознаку - овде се користе симболи процента уместо косих црта јер у самој ознаци већ постоји коса црта, зашто? жеђ не разуме те мало. И све је у реду са каматама. Уклањамо све размаке из датотеке, уклањамо празне редове. Воила - готова листа речи.

Да бисте уклонили речи које се римују користећи последња слова, изаберите последња два слова из оригиналне речи и обришите листу:

squad=${word:((${#word}-2)):2}
cat $word | sed -e "/.$squad$/d" 1> $word

Гледамо, покушавамо - све ради... па, где је списак за реч "игра"? А за реч „идем“? Фајл је празан! А то је све зато што су ове речи глаголи, а знамо шта раде онима који се римују са глаголима. Глаголска рима је гора од чак и четвртасте риме, јер руски језик има највише глагола, а сви имају исте завршетке, због чега нису били у коначном фајлу након провере завршетака.

Међутим, никуда нам се не жури. За сваку реч постоје не само риме, већ и асонанце, које понекад звуче много боље од риме - зато су то асонанце (француски ассонанце, од латинског ассоно - звучим у хармонији).

Добијамо асонанце

Овде забава почиње: асонанце се појављују на засебном УРЛ-у и на истој страници, извршавањем скрипте, слањем ХТТП захтева и примањем одговора. Како да кажем вгет'Да ли притиснете дугме? Али нема шансе. Нажалост.

Приметивши да се УРЛ у реду некако мења, прекопирао сам оно што је тамо било након преласка на асонанце и налепио у нову картицу претраживача – отвориле су се јаке риме. Не то.

У суштини, помислио сам, серверу не би требало да буде важно да ли се извршава скрипта која му шаље захтев или га особа укуца руком. Тако? Ко зна, хајде да проверимо.

Где послати? Шта послати? ХТТП захтев према ИП серверу, постоји нешто као ГЕТ... онда постоји нешто ХТТП/1.1... Морамо да видимо шта претраживач шаље и где. Инсталирај Виресхарк, погледајте саобраћај:

0040 37 5d a3 84 27 e7 fb 13 6d 93 ed cd 56 04 9d 82 7]£.'çû.m.íÍV...
0050 32 7c fb 67 46 71 dd 36 4d 42 3d f3 62 1b e0 ad 2|ûgFqÝ6MB=ób.à.
0060 ef 87 be 05 6a f9 e1 01 41 fc 25 5b c0 77 d3 94 ï.¾.jùá.Aü%[ÀwÓ.

Шта? О да, имамо ХТТПС. Шта да радим? Покренути МИТМ напад на себе? У идеалном случају, сама жртва ће нам помоћи.

Генерално, одлучивши да сурфујем претраживачем, коначно сам пронашао сам захтев и примаоца. Иди:

Дијалог са терминалом

telnet IP PORT
Trying IP...
Connected to IP.
Escape character is '^]'.
GET /rifma/%D0%BC%D0%B0%D1%82%D1%8C?mode=block&type=asn HTTP/1.1
Host: HOST
Accept-Language: en-US,en;q=0.5
X-Requested-With: XMLHttpRequest
Connection: close

HTTP/1.1 400 Bad Request
Server: nginx/1.8.0
Date: Sun, 03 Nov 2019 20:06:59 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 270
Connection: close

<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.8.0</center>
</body>
</html>
Connection closed by foreign host.

Хеј. Хехехе. Заиста, то је оно што сам очекивао када сам слао голи ХТТП захтев на ХТТПС порт. Да ли сада да шифрујемо? Сва ова гужва са РСА кључевима, затим са СХА256. Зашто, постоји ОпенССЛ за такве ствари. Па, већ знамо шта да радимо, прво ћемо уклонити поља Реферер и Цоокие - мислим да неће много утицати на ствар:

Дијалог са терминалом

openssl s_client -connect IP:PORT
{Всякие ключи, сертификаты}
GET /rifma/%D0%B7%D0%B4%D0%B5%D1%81%D1%8C?mode=block&type=asn HTTP/1.1
Host: HOST
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/javascript,text/html,application/xml,text/xml,*/*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
X-Requested-With: XMLHttpRequest
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Status: 200 OK
Date: Sun, 03 Nov 2019 20:34:33 GMT
Set-Cookie: COOKIE
X-Powered-By: Phusion Passenger 5.0.16
Server: nginx/1.8.0 + Phusion Passenger 5.0.16
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: block-all-mixed-content
Content-Encoding: gzip

За шта је способан мозак ученика да учи о компјутерском свету?

Шта је ово, псовање на серверу? Па, бар су ми одговорили 200 ОК, што значи да колачићи и реферер не утичу ни на шта. Компресија је гзип, али при копирању се копирају АСЦИИ карактери. Тачно, можете уклонити линију Прихвати-кодирање. Све је у реду - добијамо ХТМЛ документ, сада са асонанцама. Али ево два питања: како покренути ОпенССЛ и пренети податке на њега помоћу скрипте? А како прочитати излаз ако након пријема одговора останемо, такорећи, у ОпенССЛ „љусци“? Ако можете нешто да смислите са другим, али са првим...

Добро је да постоји Һабргде сам читао о корисности очекивати, који аутоматизује процес интеракције са програмима који очекују интеракцију људи. Имати тим је још привлачније аутоекпецт, генерисање очекивати скрипту засновану на вашим акцијама. Па, покрећемо га, радимо све ово и ево готовог сценарија. Само је он веома огроман, и све зато ОпенССЛ приказује сертификате, кључеве и очекивати чека исход свега овога. Да ли нам треба ово? Не. Уклањамо цео први упит, остављајући само последњи прелом реда 'р'. Такође уклањамо поља Усер-Агент и Аццепт из нашег захтева - она ​​не утичу ни на шта. Дакле, хајде да покренемо. Скрипта је извршена, али где је драгоцени ХТМЛ документ? Очекивати појео је то. Да бисте га натерали да испљуне, треба да ставите:

set results $expect_out(buffer)

пре краја скрипте - овако ће бити написан излаз извршне датотеке очекивати'ом и приказан на екрану. Укратко, нешто овако:

очекујте скрипту

#!/usr/bin/expect -f

set timeout -1
spawn openssl s_client -connect IP:PORT
match_max 100000
expect -exact "
---r
"
send -- "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1rHost: HOSTrAccept-Language: en-US,en;q=0.5rX-Requested-With: XMLHttpRequestrConnection: close"
expect -exact "GET /rifma/%d0%b7%d0%b4%d0%b5%d1%81%d1%8c?mode=block&type=asn HTTP/1.1r
Host: HOSTr
Accept-Language: en-US,en;q=0.5r
X-Requested-With: XMLHttpRequestr
Connection: close"
send -- "r"
set results $expect_out(buffer)
expect -exact "r
"
send -- "r"
expect eof

Али то није све! Као што видите, у свим примерима УРЛ захтева је био статичан, али је УРЛ тај који је одговоран за то која реч ће бити повезана са асонанцама. И тако се испоставило да ћемо стално тражити реч „%д0%б7%д0%б4%д0%б5%д1%81%д1%8ц“ у АСЦИИ или „овде“ у УТФ-8. Шта да радим? Наравно, једноставно генеришите нову скрипту сваки пут, пријатељи! Не више аутоекпецт„Ох, и уз помоћ одјек, јер У нашем новом се ништа не мења осим речи. И живео нови проблем: како можемо интелигентно превести реч са ћирилице у УРЛ формат? Нема ништа посебно ни за терминал. Па, у реду је, можемо то, зар не? Моћи:

Види шта могу да урадим!

function furl {
furl=$(echo "$word" | sed 's:А:%d0%90:g;s:Б:%d0%91:g;s:В:%d0%92:g;s:Г:%d0%93:g;s:Д:%d0%94:g;s:Е:%d0%95:g;s:Ж:%d0%96:g;s:З:%d0%97:g;s:И:%d0%98:g;s:Й:%d0%99:g;s:К:%d0%9a:g;s:Л:%d0%9b:g;s:М:%d0%9c:g;s:Н:%d0%9d:g;s:О:%d0%9e:g;s:П:%d0%9f:g;s:Р:%d0%a0:g;s:С:%d0%a1:g;s:Т:%d0%a2:g;s:У:%d0%a3:g;s:Ф:%d0%a4:g;s:Х:%d0%a5:g;s:Ц:%d0%a6:g;s:Ч:%d0%a7:g;s:Ш:%d0%a8:g;s:Щ:%d0%a9:g;s:Ъ:%d0%aa:g;s:Ы:%d0%ab:g;s:Ь:%d0%ac:g;s:Э:%d0%ad:g;s:Ю:%d0%ae:g;s:Я:%d0%af:g;s:а:%d0%b0:g;s:б:%d0%b1:g;s:в:%d0%b2:g;s:г:%d0%b3:g;s:д:%d0%b4:g;s:е:%d0%b5:g;s:ж:%d0%b6:g;s:з:%d0%b7:g;s:и:%d0%b8:g;s:й:%d0%b9:g;s:к:%d0%ba:g;s:л:%d0%bb:g;s:м:%d0%bc:g;s:н:%d0%bd:g;s:о:%d0%be:g;s:п:%d0%bf:g;s:р:%d1%80:g;s:с:%d1%81:g;s:т:%d1%82:g;s:у:%d1%83:g;s:ф:%d1%84:g;s:х:%d1%85:g;s:ц:%d1%86:g;s:ч:%d1%87:g;s:ш:%d1%88:g;s:щ:%d1%89:g;s:ъ:%d1%8a:g;s:ы:%d1%8b:g;s:ь:%d1%8c:g;s:э:%d1%8d:g;s:ю:%d1%8e:g;s:я:%d1%8f:g;s:ё:%d1%91:g;s:Ё:%d0%81:g')}

Укупно имамо скрипту која конвертује реч у АСЦИИ текст, генеришући другу скрипту која захтева страницу сајта са асонанцама са сервера преко ОпенССЛ-а. А онда преусмеравамо излаз последње скрипте у датотеку и, на старински начин, пропуштамо је "филтери" додатне квадрате и запишите их у датотеку.

Пресек многих. Суштина

У ствари, то је оно што узрокује најмање проблема. Изводимо горње процедуре за две речи, затим са две листе упоређујемо сваку реч са сваком и ако се пронађе подударање, исписујемо га. Сада имамо скрипту која узима две речи као улаз и приказује листу речи које се римују са обе, па чак и узимајући у обзир асонанце, и све то без ручног пребацивања између четири картице и памћења речи „на око“ – то је све прикупљено, обрачунава се и аутоматски одбацује. Предивна.

Сврха ове публикације је била да покаже да ако човеку нешто треба, он ће то ипак учинити. Веома неефикасно, криво, језиво, али ће успети.

Извор: ввв.хабр.цом

Додај коментар