ڪمپيوٽر جي دنيا بابت سکڻ واري شاگرد جو دماغ ڇا جي قابل آهي؟

توهان جو ڏينهن سٺو گذري.

بش ۾ هڪ ٻيو اسڪرپٽ لکڻ کان پوء، مون محسوس ڪيو ته هر شيء بلڪل مختلف هجڻ گهرجي، پر هر شيء ڪم ڪيو. مان توهان کي ڏيکارڻ چاهيان ٿو ته مون هن مسئلي کي حل ڪرڻ لاءِ ڪهڙيون بي حيائي ۽ ڪچيون ڳالهيون لکيون آهن، پر اڃا تائين علم جي ويگن نه آهي. ٻين لفظن ۾، پروگرامنگ جو هڪ ڪارٽون.

مقصد


ڪجھ ضروري ٿي ويو:

  • لفظ لاءِ ڪيترائي قافيا ڏيکاريا، سواءِ چوڪن کان
  • ٻن لفظن جي ڪيترن ئي قافين کي پار ڪيو

ڇا جي لاءِ؟ خير، اهو آهي - ۽ اهو ئي آهي.
ڪير نه ٿو ڄاڻي، چورس نظم (عام اصطلاح ۾ - چورس) ٻه لفظ آهن جن جي اسپيلنگ ۾ آخري ٻه اکر هڪجهڙائي رکن ٿا، جيڪي (اڪثر ڪري، اها ئي شيء آهي) انهن کي هڪ شاعر بڻائي ٿو. مثال طور، گلاب frosty آهن; ٽائر- ڪار. جديد تصنيف ۾ چوڪن جو استعمال خاص طور تي ماڻهن طرفان منظور نه ڪيو ويو آهي، انهن جي ابتدائيت جي ڪري.

فيصلو


اهو مون کي لڳي رهيو آهي ته آسان حل اهو هو ته بش ۾ هڪ اسڪرپٽ لکجي جيڪا اڳ ۾ ئي موجود rhyme جنريٽر - HOST استعمال ڪري، جيڪو بنيادي طور تي انهن جي چونڊ ڪنسننس ذريعي ڪري ٿو، نه ڪي اسپيلنگ جي ذريعي. ڪهڙي قسم جو HOST؟ ڇاڪاڻ ته جيڪڏهن توهان سائيٽ جو اصل نالو ظاهر ڪندا، اهي چوندا ته اهو هڪ اشتهار آهي. ڇو نه ان کي استعمال ڪرڻ جاري رکو؟ پهرين ڳالهه ته، هن جي فائدي جي باوجود ته هو قافين جي بنياد تي نظمن جي چونڊ ڪري ٿو، پر هو اڃا به اڪثر اسڪوائر ٺاهي ٿو. ٻيو، توهان کي اڃا تائين پنهنجي دماغ سان سوچڻو آهي، ٽيب جي وچ ۾ مٽائڻ ۾ وقت گذارڻو آهي، ۽ ٻن لفظن لاءِ هڪ نظم ڳولڻ لاءِ لسٽن ۾ بار بار لفظن کي ياد ڪرڻ ۾ توانائي.

مضبوط نظمون حاصل ڪرڻ

مان ڇا ڄاڻان؟ مان افاديت جي باري ۾ ڄاڻان ٿو وهن، جيڪو صفحي کي مخصوص URL تي ڊائون لوڊ ڪري ٿو. ٺيڪ آهي، اچو ته درخواست تي عمل ڪريون - اسان هڪ فائيل ۾ هڪ HTML صفحو حاصل ڪندا آهيون جنهن جو نالو هڪ rhyming لفظ سان آهي. مثال طور، اچو ته لفظ ”هتي“ ڳولهيون:

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

پر مون کي رڳو لفظن جي فهرست جي ضرورت آهي، مان ڪيئن حاصل ڪري سگهان ٿو باقي سڀ ڪجهه؟ اسان ڏسون ٿا ته لفظن جي لسٽ فارميٽ ٿيل آهي، چاهي اها ڪيتري به عجيب نه هجي، فهرست جي صورت ۾، ۽ لفظ ٽيگ ۾ آهن. . خير، اسان وٽ وڏي افاديت آهي. سي - اچو ته ان کي هن طرح لکون:

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

پهرين، لفظ فائل مان، ٽيگ تي مشتمل لائينون چونڊيو - اسان لفظن سان گڏ خالي ٽيگ ۽ لائينون حاصل ڪندا آهيون. اسان ٽيگ پاڻ کي هٽايو ۽ ان جي بند ٿيڻ واري هڪ - هتي سليش جي بدران سيڪڙو علامتون استعمال ڪيون ويون آهن ڇاڪاڻ ته ٽيگ ۾ ئي اتي اڳ ۾ ئي هڪ سليش آهي، ڇو؟ سي توهان کي ڪجھ به نه ٿو سمجهي. ۽ سڀ ڪجھ ٺيڪ آهي دلچسپي سان. اسان فائل مان سڀني اسپيس کي هٽايو، خالي لائينون هٽائي ڇڏيو. Voila - لفظن جي هڪ تيار ڪيل فهرست.

انهن لفظن کي ختم ڪرڻ لاءِ جيڪي آخري اکر استعمال ڪري ڳائي رهيا آهن، اصل لفظ مان آخري ٻه اکر چونڊيو ۽ فهرست صاف ڪريو:

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

اسان ڏسون ٿا، ڪوشش ڪريون ٿا - سڀ ڪجھ ڪم ڪري ٿو... پوءِ، لفظ ”راند“ جي فهرست ڪٿي آھي؟ ۽ لفظ "مان وڃان ٿو" لاء؟ فائل خالي آهي! ۽ اهو سڀ ڪجهه ان ڪري آهي جو اهي لفظ فعل آهن، ۽ اسان ڄاڻون ٿا ته اهي انهن کي ڇا ڪندا آهن جيڪي فعل سان ڳنڍيندا آهن. فعل قافيا چورس قافيا کان به بدتر آهي، ڇاڪاڻ ته روسي ٻوليءَ ۾ سڀ کان وڌيڪ فعل آهن، ۽ انهن سڀني جي پڇاڙي ساڳي آهي، جنهن ڪري پڇاڙيءَ جي چڪاس ڪرڻ کان پوءِ اهي آخري فائيل ۾ نه هئا.

بهرحال، اسان کي ڪا به جلدي ناهي. هر لفظ لاءِ نه رڳو نظم آهن، پر آواز پڻ آهن، جيڪي ڪڏهن ڪڏهن شاعريءَ کان گهڻو بهتر لڳندا آهن - ان ڪري اهي آواز آهن (فرانسيسي اسونانس، لاطيني اسونو کان - مان هموار آواز).

اسان کي صوتيات ملي ٿي

هي اهو آهي جتي مزو شروع ٿئي ٿو: assonances هڪ الڳ URL تي ظاهر ٿيندا آهن، ۽ ساڳئي صفحي تي، هڪ اسڪرپٽ تي عمل ڪندي، هڪ HTTP درخواست موڪلڻ ۽ جواب حاصل ڪندي. مان ڪيئن ٿو چئي سگهان وهن”ڇا تون بٽڻ دٻائيندينءَ؟ پر ڪو به رستو نه. افسوس سان.

اهو محسوس ڪندي ته لائن ۾ URL ڪنهن نه ڪنهن طرح تبديل ٿي رهيو هو، مون نقل ڪيو ته اتي ڇا هو ان کي تبديل ڪرڻ کان پوءِ assonances ۽ ان کي نئين برائوزر جي ٽيب ۾ پيسٽ ڪيو - مضبوط نظمون کليل آهن. اهو نه.

لازمي طور تي، مون سوچيو، اهو سرور ڏانهن ڌيان نه ڏيڻ گهرجي ته ڇا اسڪرپٽ ان کي موڪلڻ جي درخواست تي عمل ڪيو وڃي، يا ڇا اهو شخص هٿ سان ٽائيپ ڪري ٿو. سو؟ ڪير ڄاڻي، اچو ته ان کي چيڪ ڪريون.

ڪٿي موڪلڻ لاء؟ ڇا موڪلڻ لاء؟ سرور 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 اهڙين شين لاء. خير، اسان اڳ ۾ ئي ڄاڻون ٿا ته ڇا ڪجي، اسان صرف ريفرر ۽ ڪوڪي فيلڊ کي هٽائينداسين - منهنجو خيال آهي ته اهي معاملي تي گهڻو اثر نه ڪندا:

ٽرمينل سان گفتگو

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 جواب ڏنو، جنهن جو مطلب آهي ته ڪوڪيز ۽ ريفرر ڪجهه به متاثر نه ڪندا آهن. ڪمپريشن 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 آهي جيڪو ذميوار آهي جنهن جو لفظ assonances سان لاڳاپيل هوندو. ۽ پوءِ اهو ظاهر ٿئي ٿو ته اسان مسلسل ڳولا ڪنداسين لفظ “%d0%b7%d0%b4%d0%b5%d1%81%d1%8c” ASCII ۾ يا “هتي” UTF-8 ۾. ڇا ڪجي؟ يقينا، صرف هر وقت هڪ نئين اسڪرپٽ ٺاهيو، دوستو! هاڻي نه خودڪار توقع'او، ۽ مدد سان گونج ڪريو، ڇاڪاڻ ته اسان جي نئين ۾، لفظ کان سواء ٻيو ڪجهه به تبديل نٿو ڪري. ۽ نئين مسئلي کي ڊگھو رهو: اسان ڪيئن سمجھائي سگھون ٿا سيريلڪ مان ھڪڙو لفظ 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')}

مجموعي طور تي، اسان وٽ هڪ اسڪرپٽ آهي جيڪو هڪ لفظ کي ASCII متن ۾ تبديل ڪري ٿو، هڪ ٻيو اسڪرپٽ ٺاهي ٿو جيڪو سرور کان اوپن ايس ايس ايل ذريعي ايسوسينس سان سائيٽ جي صفحي جي درخواست ڪري ٿو. ۽ پوءِ اسان آخري اسڪرپٽ جي آئوٽ کي هڪ فائل ڏانهن ريڊائريڪٽ ڪريون ٿا ۽، پراڻي طريقي سان، ان کي پاس ڪريون ٿا. "فلٽر" اضافي اسڪوائر ۽ فائل ۾ لکو.

Пересечение множеств. Итог

دراصل، اهو ئي آهي جيڪو گهٽ ۾ گهٽ مسئلا پيدا ڪري ٿو. اسان مٿي ڏنل طريقيڪار کي ٻن لفظن لاءِ ڪريون ٿا، پوءِ ٻن لسٽن مان اسان ھر ھڪ لفظ کي ھر ھڪ سان ڀيٽيون ٿا ۽ جيڪڏھن ڪو ملندو آھي ته ان کي ٻاھر ڪڍون ٿا. ھاڻي اسان وٽ ھڪڙو اسڪرپٽ آھي جيڪو ٻن لفظن کي انپٽ طور وٺي ٿو ۽ لفظن جي ھڪڙي فهرست ڏيکاري ٿو جيڪي ٻنھي سان ڳنڍجن ٿا، ۽ حتي جي حساب سان، ۽ اھو سڀ ڪجھ دستي طور تي چار ٽيب جي وچ ۾ تبديل ڪرڻ ۽ لفظن کي ياد رکڻ کان سواء "اکين سان" - سڀ گڏ ڪيل، حساب ڪتاب لاء ۽ خودڪار طور تي رد ڪيو ويو. عجيب.

هن پبليڪيشن جو مقصد اهو هو ته جيڪڏهن ڪنهن ماڻهوءَ کي ڪنهن شيءِ جي ضرورت آهي ته هو ان کي هر طرح سان پورو ڪندو. تمام بي اثر، ڪڙي، چريو، پر اهو ڪم ڪندو.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو