X'inhu l-moħħ ta' student li jitgħallem dwar id-dinja tal-kompjuter?

Jum tajba.

Wara li spiċċajt nikteb kitba oħra f'Bash, indunajt li kollox għandu jkun kompletament differenti, iżda kollox ħadem. Irrid nuruk x'oxxenitajiet u krozzi ktibt sabiex insolvi l-problema, iżda għad m'għandix vagun ta' għarfien. Fi kliem ieħor, karikatura tal-ipprogrammar.

Kompitu


Xi ħaġa saret meħtieġa biex:

  • Uri ħafna rimi għall-kelma, ħlief għall-kwadri
  • Qsam il-ħafna rimi ta’ żewġ kelmiet

Għalxiex? Ukoll, dak hu - u dak hu.
Min ma jafx, rima kwadra (fil-lingwaġġ komuni - kwadru) hija żewġ kelmiet li l-aħħar żewġ ittri tagħhom fl-ortografija jikkoinċidu, li (ħafna drabi, din hija l-unika ħaġa) tagħmilhom rima. Pereżempju, il-ward huwa ġlata; tire - karozza. L-użu ta 'kwadri fil-versifikazzjoni moderna mhuwiex partikolarment approvat min-nies, minħabba l-primitività tagħhom.

deċiżjoni


Deherli li l-aktar soluzzjoni sempliċi kienet li tikteb skript f'Bash li juża ġeneratur tar-rima diġà eżistenti - HOST, li primarjament jagħżelhom b'konsonanza, u mhux bl-ortografija. X'tip ta' HOST? Għax jekk tindika l-isem reali tas-sit, jgħidu li huwa reklam. Għaliex ma tkomplix tużaha? L-ewwelnett, minkejja l-vantaġġ tiegħu li jagħżel r-rimi bbażati fuq il-konsonanzi, xorta spiss jipproduċi kwadri. It-tieni, għad trid taħseb b'moħħok, tqatta' ħin taqleb bejn tabs, u enerġija timmemorizza kliem ripetut f'listi biex issib rima għal żewġ kelmiet.

Jkollna rimi qawwija

X'naf? Naf dwar l-utilità Wget, li tniżżel il-paġna fil-URL speċifikat. Tajjeb, ejja tesegwixxi t-talba - aħna nġibu paġna HTML f'fajl msemmi b'kelma rima. Pereżempju, ejja nfittxu l-kelma "hawn":

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

Imma għandi bżonn biss lista ta’ kliem, kif nista’ neħles minn kull ħaġa oħra? Inħarsu u naraw li l-lista ta’ kliem tkun ifformattjata, tkun kemm tkun stramba, f’forma ta’ lista, u l-kliem ikun f’tags . Ukoll, għandna utilità kbira. għatx - ejja niktbuha hekk:

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

L-ewwel, aħna nagħżlu linji mill-fajl tal-kelma li fihom it-tikketta - aħna nġibu mazz ta 'tikketti vojta u linji bil-kliem. Inneħħu t-tikketta nnifisha u l-waħda tal-għeluq tagħha - hawn is-simboli fil-mija jintużaw minflok is-slashes għaliex it-tikketta nfisha diġà għandha slash, u għalhekk għatx ma jifhimx daqsxejn. U kollox tajjeb bl-imgħax. Aħna neħħi l-ispazji kollha mill-fajl, neħħi l-linji vojta. Voila - lista lesta ta 'kliem.

Sabiex tneħħi kliem li jirrima billi tuża l-aħħar ittri, agħżel l-aħħar żewġ ittri mill-kelma oriġinali u neħħi l-lista:

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

Inħarsu, nippruvaw - kollox jaħdem... allura, fejn hi l-lista għall-kelma "play"? U għall-kelma "jien"? Il-fajl huwa vojt! U dan kollu għax dan il-kliem hu verbi, u nafu x’jagħmlu lil min jirrima bil-verbi. Ir-rima tal-verb hija agħar minn anke rima kwadra, minħabba li l-lingwa Russa għandha l-aktar verbi, u kollha kemm huma għandhom l-istess truf, u huwa għalhekk li ma kinux fil-fajl finali wara li ċċekkjaw it-truf.

Madankollu, m'għandniex għaġla. Għal kull kelma ma jkunx hemm biss rimi, iżda wkoll assonanzi, li kultant jinstemgħu ħafna aħjar mir-rima - għalhekk huma assonanzi (assonanza bil-Franċiż, mil-Latin assono - I sound in harmony).

Ikollna assonanzi

Dan huwa fejn jibda l-gost: l-assonanzi jidhru f'URL separat, u fl-istess paġna, billi tesegwixxi script, tibgħat talba HTTP u tirċievi tweġiba. Kif nista’ ngħid Wget‘Tagħfas buttuna? Imma bl-ebda mod. Sfortunatament.

Innotajt li l-URL fil-linja kienet b'xi mod qed tinbidel, ikkupjajt dak li kien hemm wara li qlibt għall-assonanzi u għamiltu f'tab ġdida tal-browser - rhymes qawwija fetħu. Mhux hekk.

Essenzjalment, ħsibt, m'għandux jimpurtah lis-server jekk l-iskrittura li tibgħatlu t-talba hijiex esegwita, jew jekk il-persuna ttajpjaha bl-idejn. Allura? Min jaf, ejja niċċekkjawha.

Fejn tibgħat? X'għandek tibgħat? It-talba HTTP lill-IP tas-server, hemm xi ħaġa bħal GET... allura hemm xi ħaġa HTTP/1.1... Għandna bżonn naraw x'jibgħat il-browser u fejn. Installa wireshark, ħares lejn it-traffiku:

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Ó.

Um... xiex? Oh iva, għandna HTTPS. X'tagħmel? Tniedi attakk MITM fuqek innifsek? Idealment, il-vittma nnifisha tgħinna.

B'mod ġenerali, wara li ddeċidejt li tisserfja l-browser, fl-aħħar sibt it-talba nfisha u d-destinatarju. Mur:

Djalogu mat-terminal

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.

Ħej. Hehehe. Tabilħaqq, dan huwa dak li stennejt meta nibgħat talba HTTP vojta lejn port HTTPS. Għandna nikkriptaw issa? Dan it-taħwid kollu biċ-ċwievet RSA, imbagħad bi SHA256. Għaliex, hemm OpenSSL għal affarijiet bħal dawn. Ukoll, aħna diġà nafu x'għandna nagħmlu, l-ewwel se nneħħu l-oqsma tar-Referer u tal-Cookie - naħseb li mhux se jaffettwaw ħafna l-kwistjoni:

Djalogu mat-terminal

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

X'inhu l-moħħ ta' student li jitgħallem dwar id-dinja tal-kompjuter?

X'inhu dan, swearing fuq is-server? Tajjeb, mill-inqas wieġbuni 200 OK, li jfisser li l-cookies u r-referrer ma jaffettwaw xejn. Il-kompressjoni hija gzip, iżda meta tikkopja, il-karattri ASCII jiġu kkupjati. Eżattament, tista 'tneħħi l-linja Aċċetta-kodifikazzjoni. Kollox tajjeb - niksbu dokument HTML, issa b'assonanzi. Imma hawn żewġ mistoqsijiet: kif tħaddem OpenSSL u tittrasferixxi d-dejta lejha billi tuża skript? U kif taqra l-output jekk wara li nirċievu r-rispons nibqgħu, kif inhi, f'"qoxra" OpenSSL? Jekk tista’ toħroġ b’xi ħaġa bit-tieni, imma bl-ewwel...

Tajjeb li hemm Habrfejn naqra dwar l-utilità jistennew, li awtomatizza l-proċess ta 'interazzjoni ma' programmi li jistennew interazzjoni umana. Li jkollok tim huwa saħansitra aktar attraenti tistenna awtomatikament, jiġġenera jistennew skript ibbażat fuq l-azzjonijiet tiegħek. Ukoll, innieduha, nagħmlu dan kollu u hawn l-iskrittura lest. Biss hu enormi ħafna, u kollox għaliex OpenSSL juri ċertifikati, ċwievet, u jistennew jistenna l-output ta 'dan kollu. Għandna bżonn dan? Nru. Inneħħu l-ewwel pront kollu, u nħallu biss l-aħħar waqfa tal-linja 'r'. Aħna nneħħu wkoll l-oqsma Utent-Agent u Aċċetta mit-talba tagħna - ma jaffettwaw xejn. Allura, ejja tniedi. L-iskrittura ġiet esegwita, imma fejn jinsab id-dokument HTML għażiż? Jistennew ateha. Biex iġiegħlu bżiq, għandek bżonn tpoġġi:

set results $expect_out(buffer)

qabel it-tmiem tal-iskrittura - dan huwa kif l-output tal-eżekutibbli se jinkiteb jistennew‘om kmand u murija fuq l-iskrin. Fil-qosor, xi ħaġa bħal din:

jistennew skript

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

Imma dan mhux kollox! Kif tistgħu taraw, fl-eżempji kollha l-URL tat-talba kien statiku, iżda huwa l-URL li huwa responsabbli għal liema kelma se tkun assoċjata ma 'assonanzi. U għalhekk jirriżulta li se nfittxu kontinwament il-kelma "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" f'ASCII jew "hawn" f'UTF-8. X'tagħmel? Naturalment, sempliċement iġġenera skript ġdid kull darba, ħbieb! Mhux iktar tistenna awtomatikament'om, u bl-għajnuna miss, għax Fil-ġdid tagħna, xejn ma jinbidel ħlief il-kelma. U ħajja l-problema l-ġdida: kif nistgħu nittraduċu b'mod intelliġenti kelma miċ-Ċirilliku f'format URL? M'hemm xejn speċjali għat-terminal lanqas. Tajjeb, nistgħu nagħmluh, hux? Jista':

Ara x’nista’ nagħmel!

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

B'kollox, għandna skript li jikkonverti kelma f'test ASCII, li jiġġenera skript ieħor li jitlob paġna tas-sit b'assonanzi mis-server permezz ta 'OpenSSL. U mbagħad nidderieġu mill-ġdid l-output ta 'l-aħħar skript għal fajl u, fl-antik, ngħadduh "filtri" kwadri żejda u iktebhom fil-fajl.

Intersezzjoni ta 'ħafna. Bottom line

Fil-fatt, dan huwa eżattament dak li jikkawża l-inqas problemi. Aħna nwettqu l-proċeduri ta 'hawn fuq għal żewġ kelmiet, imbagħad miż-żewġ listi nqabblu kull kelma ma' kull waħda u jekk tinstab taqbila, noħorġuha. Issa għandna skript li jieħu żewġ kelmiet bħala input u juri lista ta’ kliem li jirrima mat-tnejn, u anke b’kont meħud tal-assonanzi, u dan kollu mingħajr ma naqleb manwalment bejn erba’ tabs u ftakar kliem “bil-għajn” - kollha miġbura, ikkontabilizzat. għal u mormija awtomatikament. Sabiħ.

L-iskop ta’ din il-pubblikazzjoni kien li turi li jekk persuna teħtieġ xi ħaġa, tagħmilha xorta waħda. Ineffettiv ħafna, mgħawweġ, creepy, iżda se taħdem.

Sors: www.habr.com

Żid kumment