کمپیوٹر کی دنیا کے بارے میں سیکھنے والے طالب علم کا دماغ کیا کرنے کی صلاحیت رکھتا ہے؟

دن اچھا ہو.

باش میں ایک اور سکرپٹ لکھنے کے بعد، میں نے محسوس کیا کہ سب کچھ بالکل مختلف ہونا چاہئے، لیکن سب کچھ کام کرتا ہے. میں آپ کو دکھانا چاہتا ہوں کہ مسئلہ حل کرنے کے لیے میں نے کون سی فحاشی اور بیساکھی لکھی ہے، لیکن ابھی تک علم کی گاڑی نہیں ہے۔ دوسرے لفظوں میں، پروگرامنگ کا ایک کاریکچر۔

ٹاسک


کچھ ضروری ہو گیا:

  • اسکوائر کے علاوہ لفظ کے لیے بہت سی نظمیں دکھائیں۔
  • دو لفظوں کی بہت سی نظموں کو عبور کیا۔

کس لیے؟ ٹھیک ہے، یہ ہے - اور یہ ہے.
کون نہیں جانتا، ایک مربع شاعری (عام زبان میں - ایک مربع) دو ایسے الفاظ ہیں جن کے ہجے کے آخری دو حروف ایک دوسرے سے ملتے ہیں، جو (اکثر یہ واحد چیز ہے) انہیں شاعری بنا دیتے ہیں۔ مثال کے طور پر، گلاب ٹھنڈے ہوتے ہیں۔ ٹائر - گاڑی جدید تصدیق میں چوکوں کا استعمال خاص طور پر لوگوں کی طرف سے منظور نہیں ہے، ان کی قدیمیت کی وجہ سے۔

حل


مجھے ایسا لگتا تھا کہ سب سے آسان حل باش میں ایک اسکرپٹ لکھنا تھا جو پہلے سے موجود رائم جنریٹر - HOST کا استعمال کرتا ہے، جو بنیادی طور پر ان کا انتخاب ہجے کے ذریعہ نہیں کرتا ہے۔ کس قسم کا HOST؟ کیونکہ اگر آپ سائٹ کا اصل نام بتاتے ہیں تو وہ کہیں گے کہ یہ اشتہار ہے۔ کیوں نہ اس کا استعمال جاری رکھیں؟ سب سے پہلے، کنونانس کی بنیاد پر نظموں کو منتخب کرنے کے اپنے فائدے کے باوجود، وہ اب بھی اکثر مربع تیار کرتا ہے۔ دوم، آپ کو اب بھی اپنے دماغ کے ساتھ سوچنا ہوگا، ٹیبز کے درمیان سوئچ کرنے میں وقت گزارنا ہوگا، اور دو الفاظ کے لیے شاعری تلاش کرنے کے لیے فہرستوں میں بار بار الفاظ کو یاد کرنے میں توانائی حاصل کرنی ہوگی۔

مضبوط نظمیں حاصل کرنا

مجھے کیا معلوم؟ میں افادیت کے بارے میں جانتا ہوں۔ wget، جو مخصوص URL پر صفحہ کو ڈاؤن لوڈ کرتا ہے۔ ٹھیک ہے، آئیے درخواست پر عمل کرتے ہیں - ہمیں ایک فائل میں ایک HTML صفحہ ملتا ہے جس کا نام شاعرانہ لفظ کے ساتھ ہے۔ مثال کے طور پر، آئیے لفظ "یہاں" تلاش کریں:

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

ہم دیکھتے ہیں، ہم کوشش کرتے ہیں - سب کچھ کام کرتا ہے... تو، لفظ "کھیل" کی فہرست کہاں ہے؟ اور لفظ "میں جا رہا ہوں" کے لیے؟ فائل خالی ہے! اور یہ سب اس لیے ہے کہ یہ الفاظ فعل ہیں، اور ہم جانتے ہیں کہ وہ ان لوگوں کے ساتھ کیا کرتے ہیں جو فعل کے ساتھ شاعری کرتے ہیں۔ فعل کی شاعری مربع شاعری سے بھی بدتر ہے، کیونکہ روسی زبان میں سب سے زیادہ فعل ہوتے ہیں، اور ان سب کے اختتام ایک جیسے ہوتے ہیں، یہی وجہ ہے کہ آخر کو چیک کرنے کے بعد وہ فائنل فائل میں نہیں تھے۔

تاہم، ہمیں کوئی جلدی نہیں ہے۔ ہر لفظ کے لیے نہ صرف نظمیں ہیں، بلکہ ہم آہنگی بھی ہیں، جو بعض اوقات شاعری سے کہیں زیادہ بہتر لگتی ہیں - اسی لیے وہ ہم آہنگی ہیں (فرانسیسی اسسوننس، لاطینی اسونو سے - میں ہم آہنگی میں آواز دیتا ہوں)۔

ہمیں ہم آہنگی ملتی ہے۔

یہیں سے مزہ شروع ہوتا ہے: ہم آہنگی ایک الگ یو آر ایل پر ظاہر ہوتی ہے، اور اسی صفحہ پر، اسکرپٹ پر عمل کرکے، HTTP درخواست بھیج کر اور جواب موصول ہوتا ہے۔ میں کیسے کہہ سکتا ہوں wget'کیا آپ بٹن دباتے ہیں؟ لیکن کوئی راستہ نہیں۔ افسوس کی بات ہے۔

یہ دیکھتے ہوئے کہ لائن میں یو آر ایل کسی نہ کسی طرح تبدیل ہو رہا تھا، میں نے جو کچھ تھا اس کو ہم آہنگی میں تبدیل کرنے کے بعد کاپی کیا اور اسے ایک نئے براؤزر ٹیب میں چسپاں کر دیا - مضبوط نظمیں کھل گئیں۔ ایسا نہیں۔

بنیادی طور پر، میں نے سوچا، سرور کو اس سے کوئی فرق نہیں پڑتا کہ آیا اسے درخواست بھیجنے والے اسکرپٹ پر عمل کیا جاتا ہے، یا آیا وہ شخص اسے ہاتھ سے ٹائپ کرتا ہے۔ تو؟ کون جانتا ہے، آئیے اسے چیک کرتے ہیں۔

کہاں بھیجنا ہے؟ کیا بھیجنا ہے؟ سرور 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.

ارے Hehehe. درحقیقت، HTTPS پورٹ پر ننگی HTTP درخواست بھیجتے وقت میں نے یہی توقع کی تھی۔ کیا ہمیں اب انکرپٹ کرنا چاہیے؟ یہ تمام ہنگامہ آر ایس اے کیز کے ساتھ، پھر SHA256 کے ساتھ۔ کیوں، وہاں ہے اوپن ایس ایس ایل ایسی چیزوں کے لیے. ٹھیک ہے، ہم پہلے ہی جانتے ہیں کہ کیا کرنا ہے، ہم پہلے صرف ریفرر اور کوکی فیلڈز کو ہٹا دیں گے - مجھے لگتا ہے کہ وہ اس معاملے کو زیادہ متاثر نہیں کریں گے:

ٹرمینل کے ساتھ مکالمہ

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 دستاویز ملتی ہے، اب ہم آہنگی کے ساتھ۔ لیکن یہاں دو سوالات ہیں: اوپن ایس ایس ایل کو کیسے چلایا جائے اور اسکرپٹ کا استعمال کرتے ہوئے اس میں ڈیٹا کیسے منتقل کیا جائے؟ اور اگر جواب موصول ہونے کے بعد ہم اوپن ایس ایس ایل "شیل" میں رہتے ہیں تو آؤٹ پٹ کو کیسے پڑھیں؟ اگر آپ دوسرے کے ساتھ کچھ لے سکتے ہیں، لیکن پہلے کے ساتھ...

یہ اچھی بات ہے کہ وہاں ہے۔ حبرجہاں میں نے افادیت کے بارے میں پڑھا۔ توقع ہے، جو ان پروگراموں کے ساتھ تعامل کے عمل کو خودکار کرتا ہے جو انسانی تعامل کی توقع کرتے ہیں۔ ٹیم کا ہونا اور بھی پرکشش ہے۔ خودکار توقع، پیدا کرنا توقع ہے آپ کے اعمال پر مبنی اسکرپٹ۔ ٹھیک ہے، ہم اسے لانچ کرتے ہیں، یہ سب کرتے ہیں اور یہ ہے مکمل اسکرپٹ۔ صرف وہ بہت بڑا ہے، اور سب کی وجہ سے اوپن ایس ایس ایل سرٹیفکیٹ، چابیاں، اور دکھاتا ہے توقع ہے اس سب کی پیداوار کا انتظار ہے. کیا ہمیں اس کی ضرورت ہے؟ نہیں. ہم صرف آخری لائن بریک 'r' کو چھوڑ کر پورے پہلے پرامپٹ کو ہٹا دیتے ہیں۔ ہم اپنی درخواست سے User-Agent اور Accept فیلڈز کو بھی ہٹاتے ہیں - وہ کسی چیز پر اثر انداز نہیں ہوتے ہیں۔ تو، چلو لانچ کرتے ہیں۔ اسکرپٹ کو عمل میں لایا گیا تھا، لیکن قیمتی 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 ہے جو اس کے لیے ذمہ دار ہے کہ کس لفظ کو ہم آہنگی کے ساتھ منسلک کیا جائے گا۔ اور اس طرح یہ پتہ چلتا ہے کہ ہم ASCII میں لفظ "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" یا UTF-8 میں "یہاں" تلاش کریں گے۔ کیا کرنا ہے؟ یقینا، ہر بار بس ایک نیا اسکرپٹ تیار کریں، دوستو! اب اور نہیں خودکار توقع'اوہ، اور مدد کے ساتھ یاد آتی ہےکیونکہ ہمارے نئے میں، لفظ کے سوا کچھ نہیں بدلتا۔ اور نئے مسئلے کو زندہ رکھیں: ہم سیریلک سے کسی لفظ کا یو آر ایل فارمیٹ میں ذہانت سے کیسے ترجمہ کر سکتے ہیں؟ ٹرمینل کے لیے بھی کچھ خاص نہیں ہے۔ ٹھیک ہے، یہ ٹھیک ہے، ہم یہ کر سکتے ہیں، ٹھیک ہے؟ کر سکتے ہیں:

دیکھو میں کیا کر سکتا ہوں!

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 متن میں تبدیل کرتا ہے، ایک اور اسکرپٹ تیار کرتا ہے جو OpenSSL کے ذریعے سرور سے ہم آہنگی کے ساتھ سائٹ کے صفحے کی درخواست کرتا ہے۔ اور پھر ہم آخری اسکرپٹ کے آؤٹ پٹ کو ایک فائل میں ری ڈائریکٹ کرتے ہیں اور، پرانے انداز میں، اس سے گزرتے ہیں۔ "فلٹرز" اضافی مربع اور فائل میں لکھیں۔

بہت سے کا چوراہا. نیچے کی لکیر

دراصل، یہ بالکل وہی ہے جو کم سے کم مسائل کا سبب بنتا ہے. ہم دو الفاظ کے لیے مندرجہ بالا طریقہ کار کو انجام دیتے ہیں، پھر دو فہرستوں سے ہم ہر ایک لفظ کا ہر ایک کے ساتھ موازنہ کرتے ہیں اور اگر کوئی مماثلت پائی جاتی ہے تو ہم اسے آؤٹ پٹ کرتے ہیں۔ اب ہمارے پاس ایک اسکرپٹ ہے جو دو الفاظ کو ان پٹ کے طور پر لیتا ہے اور الفاظ کی ایک فہرست دکھاتا ہے جو دونوں کے ساتھ شاعری کرتے ہیں، اور یہاں تک کہ ہم آہنگی کو بھی مدنظر رکھتے ہوئے، اور یہ سب کچھ دستی طور پر چار ٹیبز کے درمیان سوئچ کیے بغیر اور الفاظ کو "آنکھ سے" یاد کیے بغیر - سب جمع، حساب کتاب کے لیے اور خود بخود رد کر دیا گیا۔ کمال ہے۔

اس اشاعت کا مقصد یہ ظاہر کرنا تھا کہ اگر کسی شخص کو کسی چیز کی ضرورت ہے تو وہ بہرحال کرے گا۔ بہت بے اثر، ٹیڑھا، ڈراونا، لیکن یہ کام کرے گا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں