Vad är hjärnan på en elev som lär sig om datorvärlden kapabel till?

God dag.

Efter att ha skrivit klart ytterligare ett manus i Bash insåg jag att allt borde vara helt annorlunda, men allt fungerade. Jag vill visa dig vilka oanständigheter och kryckor jag skrev för att lösa problemet, men jag har ännu inte en vagn av kunskap. Med andra ord en karikatyr av programmering.

Uppgift


Något blev nödvändigt för att:

  • Visade många rim för ordet, förutom rutor
  • Korsade de många rim av två ord

För vad? Tja, det är det - och det är det.
Vem vet inte, ett fyrkantigt rim (i vanligt språkbruk - en kvadrat) är två ord vars två sista bokstäver i stavningen sammanfaller, vilket (ofta är detta det enda) gör dem till ett rim. Till exempel är rosor frostiga; däck - bil. Användningen av rutor i modern versifiering är inte särskilt godkänd av människor, på grund av deras primitivitet.

beslutet


Det verkade för mig som att den enklaste lösningen var att skriva ett skript i Bash som använder en redan existerande rimgenerator - HOST, som i första hand väljer dem med konsonans och inte genom stavning. Vilken typ av VÄRD? För om du anger det riktiga namnet på sajten kommer de att säga att det är en annons. Varför inte fortsätta använda det? För det första, trots sin fördel med att välja rim baserade på konsonanser, producerar han fortfarande ofta kvadrater. För det andra måste du fortfarande tänka med din hjärna, lägga tid på att växla mellan flikar och energi att memorera upprepade ord i listor för att hitta ett rim för två ord.

Få starka ramsor

Vad vet jag? Jag vet om verktyget wget, som laddar ner sidan på den angivna webbadressen. Okej, låt oss köra begäran - vi får en HTML-sida i en fil som heter ett ord som rimmar. Låt oss till exempel söka efter ordet "här":

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

Men jag behöver bara en lista med ord, hur kan jag bli av med allt annat? Vi tittar och ser att listan med ord är formaterad, hur märklig den än kan vara, i form av en lista, och orden finns i taggar . Tja, vi har en stor nytta. törst - låt oss skriva ner det så här:

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

Välj först raderna som innehåller taggen från Word-filen — vi får ett gäng tomma taggar och rader med ord. Vi tar bort själva taggen och dess avslutande - här används procentsymboler istället för snedstreck eftersom i själva taggen det finns redan ett snedstreck, varför? törst förstår dig inte ett dugg. Och allt är bra med intresse. Vi tar bort alla blanksteg från filen, tar bort tomma rader. Voila - en färdig lista med ord.

För att ta bort ord som rimmar med de sista bokstäverna, välj de två sista bokstäverna från originalordet och rensa listan:

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

Vi tittar, vi försöker - allt fungerar... så var är listan för ordet "lek"? Och för ordet "jag går"? Filen är tom! Och allt detta beror på att dessa ord är verb, och vi vet vad de gör med dem som rimmar på verb. Verbrim är värre än till och med fyrkantsrim, eftersom det ryska språket har flest verb, och alla har samma ändelser, varför de inte fanns i den slutliga filen efter att ha kontrollerat ändelserna.

Vi har dock ingen brådska. För varje ord finns det inte bara rim, utan också assonanser, som ibland låter mycket bättre än rim - det är därför de är assonanser (fransk assonans, från latin assono - jag låter i melodi).

Vi får assonanser

Det är här det roliga börjar: assonanser visas på en separat URL, och på samma sida, genom att köra ett skript, skicka en HTTP-förfrågan och ta emot ett svar. Hur kan jag säga wget'Trycker du på knappen? Men inget sätt. Tyvärr.

När jag märkte att webbadressen i raden på något sätt förändrades, kopierade jag det som fanns där efter att ha bytt till assonanser och klistrade in det i en ny webbläsarflik - starka ramsor öppnade upp. Inte det.

I grund och botten, tänkte jag, borde det inte spela någon roll för servern om skriptet som skickar begäran exekveras eller om personen skriver det för hand. Så? Vem vet, låt oss kolla upp det.

Vart ska man skicka? Vad ska jag skicka? HTTP-förfrågan till serverns IP, det finns något som GET... då finns det något HTTP/1.1... Vi måste se vad webbläsaren skickar och vart. Installera wireshark, titta på trafiken:

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

Öh va? Åh ja, vi har HTTPS. Vad ska man göra? Inleda en MITM-attack på dig själv? Helst ska offret själv hjälpa oss.

I allmänhet, efter att ha bestämt mig för att surfa i webbläsaren, hittade jag äntligen själva begäran och adressaten. Gå:

Dialog med terminalen

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.

Hallå. Hehehe. Det var faktiskt vad jag förväntade mig när jag skickade en blott HTTP-förfrågan till en HTTPS-port. Ska vi kryptera nu? Allt detta krångel med RSA-nycklar, sedan med SHA256. Varför, det finns OpenSSL för sådana saker. Tja, vi vet redan vad vi ska göra, vi tar bara bort referens- och cookiefälten först - jag tror att de inte kommer att påverka saken särskilt mycket:

Dialog med terminalen

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

Vad är hjärnan på en elev som lär sig om datorvärlden kapabel till?

Vad är det här, svära på servern? Jo, de svarade mig i alla fall 200 OK, vilket betyder att cookies och hänvisaren inte påverkar någonting. Komprimeringen är gzip, men vid kopiering kopieras ASCII-tecken. Precis, du kan ta bort linjen Acceptera-kodning. Allt är bra - vi får ett HTML-dokument, nu med assonanser. Men här är två frågor: hur kör man OpenSSL och överför data till det med ett skript? Och hur läser man utdata om vi efter att ha mottagit svaret förblir, så att säga, i ett OpenSSL "skal"? Om du kan komma på något med den andra, men med den första...

Det är bra att det finns Habrdär jag läste om verktyget förvänta, som automatiserar processen att interagera med program som förväntar sig mänsklig interaktion. Att ha ett lag är ännu mer attraktivt autoförvänta, genererar förvänta skript baserat på dina handlingar. Tja, vi lanserar det, gör allt detta och här är det färdiga manuset. Bara han är väldigt stor, och allt därför OpenSSL visar certifikat, nycklar och förvänta väntar på resultatet av allt detta. Behöver vi detta? Nej. Vi tar bort hela den första prompten och lämnar bara den sista radbrytningen 'r'. Vi tar också bort fälten User-Agent och Acceptera från vår begäran - de påverkar ingenting. Så, låt oss starta. Skriptet kördes, men var är det värdefulla HTML-dokumentet? Förvänta åt det. För att få honom att spotta ut det måste du sätta:

set results $expect_out(buffer)

före slutet av skriptet - så här kommer utdata från den körbara filen att skrivas förväntaom kommandot och visas på skärmen. Sammanfattningsvis något i stil med detta:

förvänta dig ett manus

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

Men det är inte allt! Som du kan se var begäran URL statisk i alla exempel, men det är URL:en som är ansvarig för vilket ord som kommer att associeras med assonanser. Och så visar det sig att vi ständigt kommer att söka efter ordet "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" i ASCII eller "här" i UTF-8. Vad ska man göra? Naturligtvis, skapa bara ett nytt manus varje gång, vänner! Inte längre autoförvänta'Åh, och med hjälp missar, därför att I vår nya förändras ingenting förutom ordet. Och länge leve det nya problemet: hur kan vi intelligent översätta ett ord från kyrilliska till URL-format? Det finns inget speciellt för terminalen heller. Tja, det är okej, vi kan göra det, eller hur? Burk:

Titta vad jag kan göra!

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

Totalt har vi ett skript som konverterar ett ord till ASCII-text, vilket genererar ett annat skript som begär en webbplatssida med assonanser från servern via OpenSSL. Och sedan omdirigerar vi utdata från det sista skriptet till en fil och på gammaldags sätt skickar vi igenom det "filter" extra rutor och skriv dem till filen.

Skärning av många. Slutsats

Egentligen är det just detta som orsakar minst problem. Vi utför ovanstående procedurer för två ord, sedan från de två listorna jämför vi varje ord med var och en och om en matchning hittas matar vi ut det. Nu har vi ett skript som tar två ord som input och visar en lista med ord som rimmar på båda, och även med hänsyn till assonanser, och allt detta utan att manuellt växla mellan fyra flikar och komma ihåg ord "med ögat" - allt samlat, räknat för och kasseras automatiskt. Underbar.

Syftet med denna publikation var att visa att om en person behöver något så kommer han att göra det ändå. Väldigt ineffektivt, snett, läskigt, men det kommer att fungera.

Källa: will.com

Lägg en kommentar