Për çfarë është i aftë truri i një studenti që mëson rreth botës së kompjuterit?

Mirëdita.

Pasi mbarova së shkruari një skenar tjetër në Bash, kuptova se gjithçka duhet të ishte krejtësisht ndryshe, por gjithçka funksionoi. Unë dua t'ju tregoj se çfarë sharjesh dhe patericash kam shkruar për të zgjidhur problemin, por duke mos pasur ende një vagon njohurish. Me fjalë të tjera, një karikaturë e programimit.

Detyrë


Diçka u bë e nevojshme për:

  • Shfaqi shumë rima për fjalën, përveç katrorëve
  • Kryqëzoi rimat e shumta të dy fjalëve

Per cfare? Epo, kjo është ajo - dhe kjo është ajo.
Kush nuk e di, një rimë katrore (në gjuhën e zakonshme - një katror) janë dy fjalë, dy shkronjat e fundit të të cilave në drejtshkrim përkojnë, gjë që (shpesh, kjo është e vetmja gjë) i bën ato një rimë. Për shembull, trëndafilat janë të ngrirë; gomë - makinë. Përdorimi i katrorëve në versifikimin modern nuk miratohet veçanërisht nga njerëzit, për shkak të primitivitetit të tyre.

vendim


Më dukej se zgjidhja më e thjeshtë ishte të shkruante një skenar në Bash që përdor një gjenerator tashmë ekzistues të rimës - HOST, i cili kryesisht i zgjedh ato me konsonancë, dhe jo me drejtshkrim. Çfarë lloj HOST? Sepse nëse tregoni emrin e vërtetë të faqes, ata do të thonë se është një reklamë. Pse të mos vazhdoni ta përdorni? Së pari, megjithë avantazhin e tij për të zgjedhur vjersha bazuar në bashkëtingëllore, ai ende shpesh prodhon katrorë. Së dyti, duhet të mendoni ende me trurin tuaj, të kaloni kohë duke kaluar midis skedave dhe energji duke mësuar përmendësh fjalët e përsëritura në lista për të gjetur një rimë për dy fjalë.

Marrja e vjershave të forta

Çfarë di unë? Unë e di për shërbimin wget, e cila shkarkon faqen në URL-në e specifikuar. Mirë, le të ekzekutojmë kërkesën - marrim një faqe HTML në një skedar të emërtuar me një fjalë të rimuar. Për shembull, le të kërkojmë fjalën "këtu":

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

Por më duhet vetëm një listë fjalësh, si mund të shpëtoj nga gjithçka tjetër? Ne shikojmë dhe shohim që lista e fjalëve është e formatuar, sado e çuditshme të jetë, në formën e një liste dhe fjalët janë në etiketa . Epo, ne kemi një dobi të madhe. etje - le ta shkruajmë kështu:

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

Së pari, nga skedari word, zgjidhni rreshtat që përmbajnë etiketën — marrim një mori etiketash boshe dhe rreshtash me fjalë. Ne heqim vetë etiketën dhe mbylljen e tij - këtu përdoren simbolet e përqindjes në vend të prerjeve, sepse në vetë etiketën tashmë ka një prerje, pse? etje nuk te kupton pak. Dhe gjithçka është në rregull me interes. Ne heqim të gjitha hapësirat nga skedari, heqim linjat boshe. Voila - një listë e gatshme fjalësh.

Për të hequr fjalët që rimojnë duke përdorur shkronjat e fundit, zgjidhni dy shkronjat e fundit nga fjala origjinale dhe pastroni listën:

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

Ne shikojmë, përpiqemi - gjithçka funksionon ... pra, ku është lista për fjalën "luaj"? Dhe për fjalën "Unë po shkoj"? Skedari është bosh! Dhe kjo është e gjitha sepse këto fjalë janë folje dhe ne e dimë se çfarë u bëjnë atyre që rimojnë me folje. Rima e foljes është më e keqe se edhe rima katrore, sepse gjuha ruse ka më shumë folje, dhe të gjitha kanë të njëjtat mbaresa, prandaj nuk ishin në dosjen përfundimtare pas kontrollit të mbaresave.

Megjithatë, ne nuk po nxitojmë. Për secilën fjalë nuk ka vetëm rima, por edhe asonanca, të cilat ndonjëherë tingëllojnë shumë më mirë se rima - kjo është arsyeja pse ato janë asonanca (asonancë franceze, nga latinishtja assono - tingëlloj në harmoni).

Ne marrim asonanca

Këtu fillon argëtimi: asonancat shfaqen në një URL të veçantë, dhe në të njëjtën faqe, duke ekzekutuar një skript, duke dërguar një kërkesë HTTP dhe duke marrë një përgjigje. Si mund te them wget'A e shtypni butonin? Por në asnjë mënyrë. Mjerisht.

Duke vënë re që URL-ja në rresht po ndryshonte disi, kopjova atë që kishte pas kalimit në asonanca dhe e ngjita në një skedë të re të shfletuesit - u hapën vjersha të forta. Jo ashtu.

Në thelb, mendova, nuk duhet të ketë rëndësi për serverin nëse skripti që i dërgon kërkesën është ekzekutuar, ose nëse personi e shkruan atë me dorë. Kështu që? Kush e di, le të shkojmë ta kontrollojmë.

Ku të dërgoni? Çfarë të dërgoni? Kërkesa HTTP për IP-në e serverit, ka diçka si GET... pastaj ka diçka HTTP/1.1... Duhet të shohim se çfarë dërgon shfletuesi dhe ku. Instaloni Wireshark, shikoni trafikun:

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

Hm... çfarë? Oh po, ne kemi HTTPS. Çfarë duhet bërë? Nisni një sulm MITM ndaj vetes? Idealisht, vetë viktima do të na ndihmojë.

Në përgjithësi, pasi vendosa të shfletoj shfletuesin, më në fund gjeta vetë kërkesën dhe adresuesin. Shko:

Dialog me terminalin

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.

Hej. Hehehe. Në të vërtetë, kjo është ajo që prisja kur dërgoja një kërkesë të zhveshur HTTP në një port HTTPS. A duhet të kodojmë tani? E gjithë kjo bujë me çelësat RSA, pastaj me SHA256. Pse, ka OpenSSL për gjëra të tilla. Epo, ne tashmë e dimë se çfarë të bëjmë, ne thjesht do të heqim fillimisht fushat Referer dhe Cookie - mendoj se ato nuk do të ndikojnë shumë në çështje:

Dialog me terminalin

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

Për çfarë është i aftë truri i një studenti që mëson rreth botës së kompjuterit?

Çfarë është kjo, sharje në server? Epo, të paktën më janë përgjigjur 200 OK, që do të thotë se cookies dhe referuesi nuk ndikojnë asgjë. Kompresimi është gzip, por kur kopjoni, karakteret ASCII kopjohen. Pikërisht, ju mund të hiqni vijën Prano-kodimi. Gjithçka është në rregull - marrim një dokument HTML, tani me asonanca. Por këtu janë dy pyetje: si të ekzekutoni OpenSSL dhe të transferoni të dhëna në të duke përdorur një skript? Dhe si ta lexojmë daljen nëse pas marrjes së përgjigjes mbetemi, si të thuash, në një "guaskë" OpenSSL? Nëse mund të gjeni diçka me të dytën, por me të parën...

Është mirë që ka Habrku kam lexuar për shërbimin pres, i cili automatizon procesin e ndërveprimit me programet që presin ndërveprim njerëzor. Të kesh një ekip është edhe më tërheqës autopritje, duke gjeneruar pres skenar i bazuar në veprimet tuaja. Epo, ne e nisim atë, bëjmë të gjitha këto dhe këtu është skenari i përfunduar. Vetëm ai është shumë i madh, dhe gjithçka sepse OpenSSL shfaq certifikatat, çelësat dhe pres pret rezultatin e gjithë kësaj. A kemi nevojë për këtë? Nr. Ne heqim të gjithë kërkesën e parë, duke lënë vetëm ndërprerjen e rreshtit të fundit 'r'. Ne gjithashtu heqim nga kërkesa jonë fushat User-Agent dhe Accept - ato nuk ndikojnë asgjë. Pra, le të fillojmë. Skripti u ekzekutua, por ku është dokumenti i çmuar HTML? Pres e hëngri. Për ta bërë atë të pështyjë, duhet të vendosni:

set results $expect_out(buffer)

para përfundimit të skenarit - kështu do të shkruhet dalja e ekzekutuesit pres'om komanda dhe shfaqet në ekran. Në përmbledhje, diçka si kjo:

pres një skenar

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

Por kjo nuk është e gjitha! Siç mund ta shihni, në të gjithë shembujt URL-ja e kërkesës ishte statike, por është URL-ja që është përgjegjëse për cilën fjalë do të shoqërohet me asonanca. Dhe kështu rezulton se ne do të kërkojmë vazhdimisht fjalën "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" në ASCII ose "këtu" në UTF-8. Çfarë duhet bërë? Sigurisht, thjesht krijoni një skenar të ri çdo herë, miq! Jo më autopritje'Oh, dhe me ndihmën humbas, sepse Në të renë tonë nuk ndryshon asgjë përveç fjalës. Dhe rroftë problemi i ri: si mund ta përkthejmë me inteligjencë një fjalë nga cirilik në formatin URL? Nuk ka asgjë të veçantë as për terminalin. Epo, është në rregull, ne mund ta bëjmë atë, apo jo? Mund:

Shikoni çfarë mund të bëj!

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

Në total, ne kemi një skript që konverton një fjalë në tekst ASCII, duke gjeneruar një skrip tjetër që kërkon një faqe faqeje me asonanca nga serveri nëpërmjet OpenSSL. Dhe më pas ne ridrejtojmë daljen e skriptit të fundit në një skedar dhe, në mënyrën e vjetër, e kalojmë atë përmes "filtra" katrorë shtesë dhe shkruajini ato në skedar.

Kryqëzimi i shumë. Fundi

Në fakt, kjo është pikërisht ajo që shkakton më pak probleme. Ne kryejmë procedurat e mësipërme për dy fjalë, më pas nga dy listat krahasojmë secilën fjalë me secilën dhe nëse gjendet një përputhje, e nxjerrim atë. Tani kemi një skript që merr dy fjalë si hyrje dhe shfaq një listë fjalësh që rimojnë me të dyja, madje duke marrë parasysh asonancat, dhe e gjithë kjo pa kaluar manualisht midis katër skedave dhe duke kujtuar fjalët "me sy" - të gjitha të mbledhura, të llogaritura për dhe fshihet automatikisht. E mrekullueshme.

Qëllimi i këtij botimi ishte të tregonte se nëse një personi ka nevojë për diçka, ai do ta bëjë atë gjithsesi. Shumë i paefektshëm, i shtrembër, i mërzitur, por do të funksionojë.

Burimi: www.habr.com

Shto një koment