Ubongo wa mwanafunzi anajifunza nini kuhusu ulimwengu wa kompyuta?

Siku njema.

Baada ya kumaliza kuandika maandishi mengine huko Bash, niligundua kuwa kila kitu kinapaswa kuwa tofauti kabisa, lakini kila kitu kilifanya kazi. Ninataka kukuonyesha ni uchafu gani na mikongojo niliyoandika ili kutatua shida, lakini bado sina gari la maarifa. Kwa maneno mengine, caricature ya programu.

Kazi


Kitu kilikuja kuwa muhimu:

  • Imeonyeshwa mashairi mengi ya neno, isipokuwa miraba
  • Alivuka mashairi mengi ya maneno mawili

Kwa ajili ya nini? Kweli, ndivyo - na ndivyo hivyo.
Nani hajui, wimbo wa mraba (kwa lugha ya kawaida - mraba) ni maneno mawili ambayo herufi mbili za mwisho katika tahajia zinapatana, ambayo (mara nyingi, hii ndio kitu pekee) huwafanya kuwa wimbo. Kwa mfano, roses ni baridi; tairi - gari. Utumiaji wa miraba katika uthibitishaji wa kisasa haujaidhinishwa haswa na watu, kwa sababu ya uasilia wao.

uamuzi


Ilionekana kwangu kuwa suluhisho rahisi zaidi lilikuwa kuandika hati katika Bash ambayo hutumia jenereta ya mashairi tayari - HOST, ambayo kimsingi huwachagua kwa konsonanti, na sio kwa tahajia. HOST ya aina gani? Kwa sababu ukionyesha jina halisi la tovuti, watasema kuwa ni tangazo. Kwa nini usiendelee kuitumia? Kwanza, licha ya faida yake ya kuchagua mashairi kulingana na konsonanti, bado mara nyingi hutoa miraba. Pili, bado unapaswa kufikiria na ubongo wako, kutumia muda kubadilisha kati ya vichupo, na nishati kukariri maneno yanayorudiwa katika orodha ili kupata wimbo wa maneno mawili.

Kupata mashairi yenye nguvu

Ninajua nini? Najua kuhusu matumizi wget, ambayo hupakua ukurasa katika URL iliyobainishwa. Sawa, wacha tutekeleze ombi - tunapata ukurasa wa HTML katika faili iliyopewa jina la neno lenye wimbo. Kwa mfano, hebu tutafute neno "hapa":

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

Lakini ninahitaji tu orodha ya maneno, ninawezaje kuondokana na kila kitu kingine? Tunaangalia na kuona kwamba orodha ya maneno imeundwa, haijalishi ni ya kushangaza jinsi gani, katika mfumo wa orodha, na maneno yako katika vitambulisho. . Kweli, tunayo matumizi mazuri. kiu - Wacha tuandike kama hii:

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

Kwanza, kutoka kwa faili ya neno, chagua mistari iliyo na lebo - tunapata rundo la vitambulisho tupu na mistari yenye maneno. Tunaondoa lebo yenyewe na ya kufunga - hapa alama za asilimia hutumiwa badala ya kufyeka kwa sababu kwenye lebo yenyewe. tayari kuna kufyeka, kwa nini? kiu sikuelewi hata kidogo. Na kila kitu ni sawa na riba. Tunaondoa nafasi zote kutoka kwa faili, ondoa mistari tupu. Voila - orodha tayari ya maneno.

Ili kuondoa maneno ambayo yana kibwagizo kwa kutumia herufi za mwisho, chagua herufi mbili za mwisho kutoka kwa neno asili na ufute orodha:

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

Tunaangalia, tunajaribu - kila kitu kinafanya kazi ... kwa hiyo, orodha ya neno "kucheza" iko wapi? Na kwa neno "naenda"? Faili ni tupu! Na hii yote ni kwa sababu maneno haya ni vitenzi, na tunajua wanachofanya kwa wale wanaoimba kwa vitenzi. Wimbo wa kitenzi ni mbaya zaidi kuliko hata utungo wa mraba, kwa sababu lugha ya Kirusi ina vitenzi vingi zaidi, na vyote vina miisho sawa, ndiyo sababu hawakuwa kwenye faili ya mwisho baada ya kuangalia miisho.

Walakini, hatuna haraka. Kwa kila neno hakuna mashairi tu, bali pia assonances, ambayo wakati mwingine husikika bora zaidi kuliko wimbo - ndiyo sababu ni assonances (assonance ya Kifaransa, kutoka kwa Kilatini assono - I sound in tune).

Tunapata assonances

Hapa ndipo furaha huanza: assonances huonekana kwenye URL tofauti, na kwenye ukurasa huo huo, kwa kutekeleza hati, kutuma ombi la HTTP na kupokea jibu. Ninawezaje kusema wget'Je, unabonyeza kitufe? Lakini hakuna njia. Cha kusikitisha.

Kugundua kuwa URL kwenye mstari ilikuwa ikibadilika kwa njia fulani, nilinakili kilichokuwa hapo baada ya kubadili assonances na kuibandika kwenye kichupo kipya cha kivinjari - mashairi yenye nguvu yalifunguliwa. Si hivyo.

Kimsingi, nilidhani, haijalishi kwa seva ikiwa hati inayoituma ombi inatekelezwa, au ikiwa mtu anaiandika kwa mkono. Kwa hiyo? Nani anajua, twende tukaangalie.

Wapi kutuma? Nini cha kutuma? Ombi la HTTP kwa IP ya seva, kuna kitu kama GET... halafu kuna kitu HTTP/1.1... Tunahitaji kuona ni nini kivinjari kinatuma na wapi. Sakinisha wireshark, angalia trafiki:

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... nini? Ndiyo, tuna HTTPS. Nini cha kufanya? Ungependa kuzindua shambulio la MITM kwako mwenyewe? Kwa kweli, mwathirika mwenyewe atatusaidia.

Kwa ujumla, baada ya kuamua kuvinjari kivinjari, hatimaye nilipata ombi yenyewe na mpokeaji. Nenda:

Mazungumzo na 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.

Habari. Hehehe. Kwa kweli, ndivyo nilivyotarajia wakati wa kutuma ombi tupu la HTTP kwenye bandari ya HTTPS. Je, tusimbe kwa njia fiche sasa? Mzozo huu wote na funguo za RSA, kisha na SHA256. Kwa nini, kuna OpenSSL kwa vitu kama hivyo. Kweli, tayari tunajua la kufanya, tutaondoa tu sehemu za Rejea na Vidakuzi kwanza - nadhani hazitaathiri suala hilo sana:

Mazungumzo na 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

Ubongo wa mwanafunzi anajifunza nini kuhusu ulimwengu wa kompyuta?

Hii ni nini, kuapa kwenye seva? Kweli, angalau walinijibu 200 sawa, ambayo inamaanisha kuwa vidakuzi na kielekezaji haziathiri chochote. Mfinyazo ni gzip, lakini wakati wa kunakili, herufi za ASCII zinanakiliwa. Hasa, unaweza kuondoa mstari Kubali-usimbaji. Kila kitu kiko sawa - tunapata hati ya HTML, sasa na assonances. Lakini hapa kuna maswali mawili: jinsi ya kuendesha OpenSSL na kuhamisha data kwake kwa kutumia hati? Na jinsi ya kusoma matokeo ikiwa baada ya kupokea jibu tunabaki, kama ilivyokuwa, kwenye "ganda" la OpenSSL? Ikiwa unaweza kupata kitu na cha pili, lakini cha kwanza ...

Ni vizuri kuwa ipo Habrambapo nilisoma juu ya matumizi kutarajia, ambayo hubadilisha mchakato wa kuingiliana na programu zinazotarajia mwingiliano wa kibinadamu. Kuwa na timu kunavutia zaidi kutarajia, kuzalisha kutarajia script kulingana na matendo yako. Kweli, tunazindua, fanya haya yote na hapa kuna hati iliyokamilishwa. Ni yeye tu ni mkubwa sana, na yote kwa sababu OpenSSL huonyesha vyeti, funguo, na kutarajia inasubiri matokeo ya haya yote. Je, tunahitaji hili? Hapana. Tunaondoa kidokezo kizima cha kwanza, tukiacha tu kivunja mstari wa mwisho 'r'. Pia tunaondoa Ajenti wa Mtumiaji na Kubali sehemu kutoka kwa ombi letu - haziathiri chochote. Kwa hiyo, tuzindue. Hati hiyo ilitekelezwa, lakini iko wapi hati iliyothaminiwa ya HTML? Anatarajia alikula. Ili kumfanya aitemee mate, unahitaji kuweka:

set results $expect_out(buffer)

kabla ya mwisho wa hati - hii ndio jinsi matokeo ya kutekelezwa yataandikwa kutarajia'om amri na kuonyeshwa kwenye skrini. Kwa muhtasari, kitu kama hiki:

expect'a hati

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

Lakini si hivyo tu! Kama unavyoona, katika mifano yote URL ya ombi ilikuwa tuli, lakini ni URL ambayo inawajibika kwa neno gani litahusishwa na assonances. Na kwa hivyo inakuwa kwamba tutaendelea kutafuta neno "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" katika ASCII au "hapa" katika UTF-8. Nini cha kufanya? Bila shaka, toa tu hati mpya kila wakati, marafiki! Sivyo tena kutarajia'oh, na kwa msaada miss ya, kwa sababu Katika mpya yetu, hakuna kinachobadilika isipokuwa neno. Na tatizo jipya liishi kwa muda mrefu: tunawezaje kutafsiri neno kwa akili kutoka kwa Cyrillic hadi umbizo la URL? Hakuna kitu maalum kwa terminal pia. Kweli, ni sawa, tunaweza kuifanya, sivyo? Inaweza:

Angalia ninachoweza kufanya!

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

Kwa jumla, tuna hati inayobadilisha neno kuwa maandishi ya ASCII, na kutengeneza hati nyingine ambayo inaomba ukurasa wa tovuti wenye sauti kutoka kwa seva kupitia OpenSSL. Na kisha tunaelekeza pato la hati ya mwisho kwa faili na, kwa njia ya zamani, ipitishe "vichujio" mraba wa ziada na uandike kwa faili.

Makutano ya wengi. Mstari wa chini

Kwa kweli, hii ndio hasa husababisha shida ndogo. Tunafanya taratibu zilizo hapo juu kwa maneno mawili, kisha kutoka kwa orodha mbili tunalinganisha kila neno na kila moja na ikiwa mechi inapatikana, tunatoa. Sasa tunayo maandishi ambayo huchukua maneno mawili kama pembejeo na kuonyesha orodha ya maneno ambayo yana wimbo na wote wawili, na hata kwa kuzingatia assonances, na yote haya bila kubadilisha kati ya tabo nne na kukumbuka maneno "kwa jicho" - yote yamekusanywa, yamehesabiwa. kwa na kutupwa moja kwa moja. Ajabu.

Kusudi la kichapo hiki lilikuwa kuonyesha kwamba ikiwa mtu anahitaji kitu, atakifanya hata hivyo. Haifai sana, iliyopotoka, ya kutisha, lakini itafanya kazi.

Chanzo: mapenzi.com

Kuongeza maoni