Компьютер әлемі туралы білім алатын оқушының миы не істей алады?

Қайырлы күн.

Bash тілінде басқа сценарий жазуды аяқтағаннан кейін мен бәрі мүлдем басқаша болуы керек екенін түсіндім, бірақ бәрі жұмыс істеді. Әлі бір вагон білімі жоқ мәселені шешу үшін қандай қара сөздер мен балдақтарды жазғанымды көрсеткім келеді. Басқаша айтқанда, бағдарламалау карикатурасы.

Мақсаты


Бір нәрсе қажет болды:

  • Шаршыдан басқа сөздің көптеген рифмалары көрсетілді
  • Екі сөздің көптеген рифмаларын кесіп өтті

Не үшін? Міне, солай - және солай.
Кім білмейді, шаршы рифма (жалпы тілде - шаршы) емледегі соңғы екі әріп сәйкес келетін екі сөз (көбінесе бұл жалғыз нәрсе) оларды рифмаға айналдырады. Мысалы, раушандар аязды; шина - машина. Заманауи верификацияда квадраттарды қолдану, олардың қарабайырлығына байланысты адамдар әсіресе мақұлдамайды.

шешім


Менің ойымша, ең қарапайым шешім Bash тілінде бұрыннан бар рифма генераторын - HOST қолданатын сценарий жазу болып көрінді, ол оларды ең алдымен емле бойынша емес, үндестік бойынша таңдайды. Қандай HOST? Өйткені сайттың шын атын көрсетсең, жарнама дейді. Неліктен оны пайдалануды жалғастырмасқа? Біріншіден, үндестіктерге негізделген рифмаларды таңдаудың артықшылығына қарамастан, ол әлі де жиі квадраттар шығарады. Екіншіден, сіз әлі де миыңызбен ойлануыңыз керек, қойындылар арасында ауысуға уақыт бөлуіңіз керек және екі сөзге рифма табу үшін тізімдердегі қайталанатын сөздерді есте сақтауға күш салуыңыз керек.

Күшті рифмаларды алу

Мен не білемін? Мен утилита туралы білемін wget, ол көрсетілген URL мекенжайындағы бетті жүктейді. Жарайды, сұранысты орындайық - біз рифмалық сөзбен аталатын файлдағы HTML бетін аламыз. Мысалы, «мұнда» сөзін іздеп көрейік:

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

Бірақ маған сөздердің тізімі ғана керек, қалғандарының бәрінен қалай құтылуға болады? Қарап тұрамыз, сөздердің тізімі қанша оғаш болса да, тізім түрінде пішімделген, ал сөздер тегтерде орналасқан. . Бізде тамаша утилита бар. sed - оны былай жазайық:

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

Алдымен, сөздік файлдан тегті қамтитын жолдарды таңдаңыз — біз бос тегтер мен сөздері бар жолдарды аламыз. Біз тегтің өзін және оның жабылуын алып тастаймыз - мұнда қиғаш сызықтардың орнына пайыздық белгілер пайдаланылады, өйткені тегтің өзінде қазірдің өзінде қиғаш сызық бар, неге? sed сені аздап түсінбейді. Ал қызығушылықпен бәрі жақсы. Біз файлдан барлық бос орындарды алып тастаймыз, бос жолдарды алып тастаймыз. Voila - сөздердің дайын тізімі.

Соңғы әріптерді пайдаланып рифмалық сөздерді алып тастау үшін түпнұсқа сөзден соңғы екі әріпті таңдап, тізімді тазалаңыз:

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

Қараймыз, тырысамыз - бәрі жұмыс істейді... сонда «ойын» сөзінің тізімі қайда? Ал «мен барамын» деген сөз үшін бе? Файл бос! Мұның бәрі бұл сөздердің етістік болғандықтан және біз олардың етістіктермен рифмаластарға не істейтінін білеміз. Етістіктің рифмасы тіпті шаршы рифмадан да нашар, өйткені орыс тілінде етістіктердің көпшілігі бар және олардың барлығында бірдей жалғаулар бар, сондықтан олар жалғауларды тексергеннен кейін соңғы файлда болмады.

Дегенмен, біз асықпаймыз. Әрбір сөзге тек рифмалар ғана емес, сонымен қатар ассонанстар да бар, олар кейде рифмадан әлдеқайда жақсы естіледі - сондықтан олар ассонанс болып табылады (французша ассонанс, латын тілінен assono - мен үйлесімді дыбыстаймын).

Біз ассонанстарды аламыз

Мұнда қызық басталады: ассонанстар бөлек URL мекенжайында және сценарийді орындау, HTTP сұрауын жіберу және жауап алу арқылы бір бетте пайда болады. Қалай айтсам болады wget«Сіз түймені басасыз ба? Бірақ амал жоқ. Өкінішке орай.

Жолдағы URL мекенжайының қандай да бір түрде өзгеріп жатқанын байқадым, мен ассонанстарға ауысқаннан кейін бар нәрсені көшіріп, оны жаңа браузер қойындысына қойдым - күшті рифмалар ашылды. Бұл емес.

Шындығында, мен серверге сұрау жіберетін сценарийдің орындалғаны немесе адам оны қолмен тергені маңызды емес деп ойладым. Сонымен? Кім біледі, барып тексеріп көрейік.

Қайда жіберу керек? Не жіберу керек? IP серверіне HTTP сұрауы, GET сияқты нәрсе бар... содан кейін HTTP/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Ó.

Мм... не? Иә, бізде HTTPS бар. Не істеу? Өзіңізге MITM шабуылын бастаңыз ба? Ең дұрысы, бізге жәбірленушінің өзі көмектеседі.

Жалпы, браузерді шарлауды ұйғарып, мен сұраудың өзін және адресатты таптым. Бару:

Терминалмен диалог

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.

Эй. Хехе. Шынында да, HTTPS портына жалаң HTTP сұрауын жіберген кезде мен күткен нәрсе болды. Енді шифрлауымыз керек пе? Мұның бәрі RSA пернелерімен, содан кейін SHA256 көмегімен. Неге, бар OpenSSL осындай заттар үшін. Біз не істеу керектігін білеміз, алдымен Referer және Cookie өрістерін алып тастаймыз - олар мәселеге көп әсер етпейді деп ойлаймын:

Терминалмен диалог

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 OK деп жауап берді, яғни cookie файлдары мен сілтеме беруші ештеңеге әсер етпейді. Қысу - gzip, бірақ көшіру кезінде ASCII таңбалары көшіріледі. Дәл, сіз сызықты алып тастай аласыз Қабылдау-кодтау. Барлығы жақсы - біз HTML құжатын аламыз, енді ассонанстар бар. Бірақ мұнда екі сұрақ бар: OpenSSL-ді қалай іске қосуға және оған сценарий арқылы деректерді тасымалдауға болады? Жауапты алғаннан кейін біз OpenSSL «қабығында» қалатын болсақ, нәтижені қалай оқуға болады? Егер сіз екіншісімен бірдеңе ойлап тапсаңыз, бірақ бірінші ...

Бар болғаны жақсы Хабаронда мен утилита туралы оқыдым күтеді, ол адамның әрекеттесуін күтетін бағдарламалармен өзара әрекеттесу процесін автоматтандырады. Команданың болуы одан да тартымды автоматты күту, жасау күтеді әрекеттеріңізге негізделген сценарий. Ал, біз оны іске қосамыз, мұның бәрін жасаймыз және міне, дайын сценарий. Тек ол өте үлкен, және барлық себебі OpenSSL сертификаттарды, кілттерді және көрсетеді күтеді осының барлығының нәтижесін күтеді. Бұл бізге керек пе? Жоқ. Біз барлық бірінші шақыруды алып тастаймыз, тек соңғы жол үзілімі «r» қалдырамыз. Сондай-ақ біз сұрауымыздан «Пайдаланушы-агент» және «Қабылдау» өрістерін алып тастаймыз - олар ештеңеге әсер етпейді. Сонымен, іске қосайық. Сценарий орындалды, бірақ құнды HTML құжаты қайда? күту жеді. Оны түкіру үшін сізге мыналарды қою керек:

set results $expect_out(buffer)

сценарийдің соңына дейін - орындалатын файлдың шығысы осылай жазылады күтеді'om пәрмені және экранда көрсетіледі. Қорытындылай келе, келесідей нәрсе:

сценарий күтеді

#!/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

Бірақ бұл бәрі емес! Көріп отырғаныңыздай, барлық мысалдарда сұрау URL мекенжайы тұрақты болды, бірақ бұл URL мекенжайы қай сөздің ассонанстармен байланыстырылатынына жауапты. Сонымен, біз ASCII-де «%d0%b7%d0%b4%d0%b5%d1%81%d1%8c» немесе UTF-8-де «мұнда» сөзін үнемі іздейтініміз белгілі болды. Не істеу? Әрине, әр жолы жаңа сценарий жасаңыз, достар! Бұдан көп емес автоматты күту'О, және көмегімен Echo, өйткені Біздің жаңада сөзден басқа ештеңе өзгермейді. Жаңа мәселе аман болсын: кириллицадан алынған сөзді URL форматына қалай интеллектуалды түрде аударуға болады? Терминал үшін де ерекше ештеңе жоқ. Жарайды, біз мұны істей аламыз, солай ма? Істей алады:

Мен не істей алатынымды қараңыз!

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')}

Барлығында бізде OpenSSL арқылы серверден ассонанстары бар сайт бетін сұрайтын басқа сценарий жасайтын сөзді ASCII мәтініне түрлендіретін сценарий бар. Содан кейін біз соңғы сценарийдің шығысын файлға қайта бағыттаймыз және оны ескі әдіспен өткіземіз. «сүзгілер» қосымша квадраттар және оларды файлға жазыңыз.

Көптің қиылысы. Төменгі сызық

Шын мәнінде, бұл ең аз проблемаларды тудыратын нәрсе. Жоғарыда көрсетілген процедураларды екі сөзге орындаймыз, содан кейін екі тізімнен әрбір сөзді әрқайсысымен салыстырамыз және сәйкестік табылса, оны шығарамыз. Енді бізде екі сөзді кіріс ретінде қабылдайтын және екеуімен де үндесетін сөздердің тізімін көрсететін сценарий бар, тіпті ассонанстарды ескере отырып, және мұның бәрі төрт қойындыны қолмен ауыстырмай және «көзбен» сөздерді есте сақтамай - барлығы жиналды, есепке алынды. үшін және автоматты түрде жойылады. Керемет.

Бұл басылымның мақсаты адамға бірдеңе керек болса, оны бәрібір орындайтынын көрсету болды. Өте тиімсіз, қисық, қорқынышты, бірақ ол жұмыс істейді.

Ақпарат көзі: www.habr.com

пікір қалдыру