Apakah kemampuan otak pelajar yang belajar tentang dunia komputer?

Hari yang baik.

Setelah selesai menulis skrip lain dalam Bash, saya menyedari bahawa semuanya sepatutnya berbeza, tetapi semuanya berfungsi. Saya ingin menunjukkan kepada anda apa kelucahan dan tongkat yang saya tulis untuk menyelesaikan masalah, tetapi belum mempunyai gerabak ilmu. Dengan kata lain, karikatur pengaturcaraan.

Petugas


Sesuatu menjadi perlu untuk:

  • Memaparkan banyak rima untuk perkataan itu, kecuali petak
  • Melintasi banyak rima dua perkataan

Untuk apa? Nah, itu sahaja - dan itu sahaja.
Siapa yang tidak tahu, rima segi empat sama (dalam bahasa biasa - segi empat sama) ialah dua perkataan yang dua huruf terakhir dalam ejaannya bertepatan, yang (selalunya, ini adalah satu-satunya perkara) menjadikannya sajak. Sebagai contoh, mawar adalah sejuk; tayar - kereta. Penggunaan segi empat sama dalam versifikasi moden tidak begitu diluluskan oleh orang ramai, kerana sifat primitifnya.

keputusan


Saya nampaknya penyelesaian paling mudah ialah menulis skrip dalam Bash yang menggunakan penjana sajak yang sudah sedia ada - HOST, yang memilihnya mengikut konsonan, dan bukan dengan ejaan. HOST macam mana? Kerana jika anda menunjukkan nama sebenar tapak, mereka akan mengatakan bahawa ia adalah iklan. Mengapa tidak terus menggunakannya? Pertama, walaupun kelebihannya memilih rima berdasarkan konsonan, dia masih sering menghasilkan petak. Kedua, anda masih perlu berfikir dengan otak anda, meluangkan masa bertukar antara tab, dan tenaga menghafal perkataan berulang dalam senarai untuk mencari rima bagi dua perkataan.

Mendapatkan rima yang kuat

Apa yang saya tahu? Saya tahu tentang utiliti wget, yang memuat turun halaman pada URL yang ditentukan. Okay, mari kita laksanakan permintaan - kita mendapat halaman HTML dalam fail bernama dengan perkataan berirama. Sebagai contoh, mari cari perkataan "di sini":

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

Tetapi saya hanya memerlukan senarai perkataan, bagaimana saya boleh menyingkirkan semua yang lain? Kami melihat dan melihat bahawa senarai perkataan diformatkan, tidak kira betapa peliknya, dalam bentuk senarai, dan perkataan itu berada dalam teg . Nah, kami mempunyai utiliti yang hebat. sed - mari kita tulis seperti ini:

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

Mula-mula, kami memilih baris daripada fail perkataan yang mengandungi tag - kami mendapat sekumpulan tag kosong dan baris dengan perkataan. Kami mengalih keluar teg itu sendiri dan penutupnya - di sini simbol peratus digunakan dan bukannya garis miring kerana teg itu sendiri sudah mempunyai garis miring, itulah sebabnya sed tidak memahami anda sedikit. Dan semuanya baik-baik saja dengan minat. Kami mengalih keluar semua ruang daripada fail, mengalih keluar baris kosong. Voila - senarai perkataan siap sedia.

Untuk mengalih keluar perkataan yang berima menggunakan huruf terakhir, pilih dua huruf terakhir daripada perkataan asal dan kosongkan senarai:

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

Kami melihat, kami cuba - semuanya berfungsi... jadi, di manakah senarai untuk perkataan "bermain"? Dan untuk perkataan "Saya akan pergi"? Fail itu kosong! Dan ini semua kerana kata-kata ini adalah kata kerja, dan kita tahu apa yang mereka lakukan kepada mereka yang berima dengan kata kerja. Sajak kata kerja adalah lebih teruk daripada sajak segi empat sama, kerana bahasa Rusia mempunyai paling banyak kata kerja, dan kesemuanya mempunyai pengakhiran yang sama, itulah sebabnya mereka tidak berada dalam fail akhir selepas menyemak pengakhiran.

Walau bagaimanapun, kami tidak tergesa-gesa. Untuk setiap perkataan terdapat bukan sahaja rima, tetapi juga asonansi, yang kadang-kadang terdengar lebih baik daripada sajak - itulah sebabnya ia adalah asonansi (asonans Perancis, dari Latin assono - saya berbunyi selaras).

Kami mendapat asonansi

Di sinilah keseronokan bermula: asonansi muncul di URL yang berasingan, dan pada halaman yang sama, dengan melaksanakan skrip, menghantar permintaan HTTP dan menerima respons. Bagaimana saya boleh katakan wget‘Adakah anda menekan butang? Tetapi tidak mungkin. sedihnya.

Menyedari bahawa URL dalam baris itu entah bagaimana berubah, saya menyalin apa yang ada selepas bertukar kepada asonansi dan menampalnya dalam tab penyemak imbas baharu - rima yang kuat dibuka. Bukan itu.

Pada asasnya, saya fikir, tidak penting kepada pelayan sama ada skrip yang menghantar permintaan itu dilaksanakan atau sama ada orang itu menaipnya dengan tangan. Jadi? Siapa tahu, mari kita lihat.

nak hantar ke mana? Apa yang hendak dihantar? Permintaan HTTP ke IP pelayan, ada sesuatu seperti GET... kemudian ada sesuatu HTTP/1.1... Kita perlu melihat apa yang dihantar oleh pelayar dan ke mana. Pasang wireshark, lihat trafik:

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... apa? Oh ya, kami mempunyai HTTPS. Apa nak buat? Lancarkan serangan MITM ke atas diri anda? Sebaik-baiknya, mangsa sendiri akan membantu kita.

Secara umum, setelah memutuskan untuk melayari penyemak imbas, saya akhirnya menemui permintaan itu sendiri dan penerima. Pergi:

Dialog dengan 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.

Hey. Hehehe. Sesungguhnya, itulah yang saya jangkakan apabila menghantar permintaan HTTP kosong ke port HTTPS. Patutkah kita menyulitkan sekarang? Semua kekecohan ini dengan kunci RSA, kemudian dengan SHA256. Kenapa, ada OpenSSL untuk perkara sebegitu. Nah, kami sudah tahu apa yang perlu dilakukan, kami hanya akan mengalih keluar medan Perujuk dan Kuki dahulu - saya fikir ia tidak akan menjejaskan perkara ini:

Dialog dengan 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

Apakah kemampuan otak pelajar yang belajar tentang dunia komputer?

Apa ini, mengumpat di pelayan? Baiklah, sekurang-kurangnya mereka menjawab saya 200 OK, yang bermaksud bahawa kuki dan perujuk tidak menjejaskan apa-apa. Mampatan ialah gzip, tetapi apabila menyalin, aksara ASCII disalin. Betul, anda boleh mengalih keluar garisan Terima-pengekodan. Semuanya baik - kami mendapat dokumen HTML, kini dengan asonansi. Tetapi berikut adalah dua soalan: bagaimana untuk menjalankan OpenSSL dan memindahkan data kepadanya menggunakan skrip? Dan bagaimana untuk membaca output jika selepas menerima respons kita kekal, seolah-olah, dalam "shell" OpenSSL? Jika anda boleh membuat sesuatu dengan yang kedua, tetapi dengan yang pertama...

Baguslah kalau ada Habrdi mana saya membaca tentang utiliti mengharapkan, yang mengautomasikan proses berinteraksi dengan program yang mengharapkan interaksi manusia. Mempunyai pasukan adalah lebih menarik jangkaan automatik, menjana mengharapkan skrip berdasarkan tindakan anda. Baiklah, kami melancarkannya, lakukan semua ini dan inilah skrip yang telah siap. Hanya dia yang sangat besar, dan semuanya kerana OpenSSL memaparkan sijil, kunci dan mengharapkan menunggu output semua ini. Adakah kita memerlukan ini? Tidak. Kami mengalih keluar keseluruhan gesaan pertama, hanya meninggalkan pemisah baris terakhir 'r'. Kami juga mengalih keluar medan Ejen Pengguna dan Terima daripada permintaan kami - ia tidak menjejaskan apa-apa. Jadi, mari kita lancarkan. Skrip telah dilaksanakan, tetapi di manakah dokumen HTML yang berharga? Jangkakan memakannya. Untuk membuatnya meludah, anda perlu meletakkan:

set results $expect_out(buffer)

sebelum akhir skrip - ini adalah bagaimana output boleh laku akan ditulis mengharapkanarahan ‘om dan dipaparkan pada skrin. Secara ringkasnya, sesuatu seperti ini:

mengharapkan skrip

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

Tetapi bukan itu sahaja! Seperti yang anda lihat, dalam semua contoh URL permintaan adalah statik, tetapi URL yang bertanggungjawab untuk perkataan yang akan dikaitkan dengan asonans. Oleh itu, ternyata kami akan sentiasa mencari perkataan "%d0%b7%d0%b4%d0%b5%d1%81%d1%8c" dalam ASCII atau "di sini" dalam UTF-8. Apa nak buat? Sudah tentu, hanya menjana skrip baharu setiap kali, kawan-kawan! Tidak lagi jangkaan automatik'om, dan dengan bantuan echo, kerana Dalam baru kami, tiada apa yang berubah kecuali perkataan. Dan panjangkan masalah baharu: bagaimana kita boleh menterjemah perkataan daripada Cyrillic ke dalam format URL secara bijak? Tidak ada yang istimewa untuk terminal itu juga. Baiklah, tidak mengapa, kita boleh melakukannya, bukan? boleh:

Lihat apa yang saya boleh lakukan!

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

Secara keseluruhan, kami mempunyai skrip yang menukar perkataan kepada teks ASCII, menghasilkan skrip lain yang meminta halaman tapak dengan asonans daripada pelayan melalui OpenSSL. Dan kemudian kami mengubah hala output skrip terakhir ke fail dan, dengan cara lama, luluskannya "penapis" petak tambahan dan tuliskannya pada fail.

Persimpangan ramai. Pokoknya

Sebenarnya, inilah yang menyebabkan masalah paling sedikit. Kami menjalankan prosedur di atas untuk dua perkataan, kemudian daripada dua senarai kami membandingkan setiap perkataan dengan setiap perkataan dan jika padanan ditemui, kami mengeluarkannya. Kini kami mempunyai skrip yang mengambil dua perkataan sebagai input dan memaparkan senarai perkataan yang berima dengan kedua-duanya, dan juga mengambil kira asonansi, dan semua ini tanpa beralih secara manual antara empat tab dan mengingati perkataan "dengan mata" - semua dikumpulkan, diambil kira untuk dan dibuang secara automatik. Hebat.

Tujuan penerbitan ini adalah untuk menunjukkan bahawa jika seseorang memerlukan sesuatu, dia akan melakukannya juga. Sangat tidak berkesan, bengkok, menyeramkan, tetapi ia akan berfungsi.

Sumber: www.habr.com

Tambah komen