学习计算机世界的学生的大脑有什么能力?

今天好。

用 Bash 写完另一个脚本后,我意识到一切都应该完全不同,但一切都有效。 我想向你们展示我为了解决问题而写的那些淫秽和拐杖,但还没有知识马车。 换句话说,这是编程的漫画。

任务


有必要做一些事情:

  • 显示了该单词的许多押韵(方块除外)
  • 跨越了两个词的许多押韵

为了什么? 嗯,就是这样 - 就是这样。
谁不知道,方韵(通常用语是方韵)是两个单词的拼写中最后两个字母重合,这(通常,这是唯一的事情)使它们成为押韵。 例如,玫瑰是冰霜的; 轮胎-汽车。 由于方格的原始性,现代韵律中方格的使用并没有得到人们的特别认可。


在我看来,最简单的解决方案是在 Bash 中编写一个脚本,该脚本使用现有的韵律生成器 - HOST,它主要通过辅音而不是拼写来选择它们。 什么样的主机? 因为如果你注明网站的真实名称,他们会说这是广告。 为什么不继续使用它呢? 首先,尽管他有根据协和韵选韵的优势,但他仍然经常产生方块。 其次,你仍然需要用大脑思考,花时间在选项卡之间切换,并花精力记住列表中重复的单词以找到两个单词的押韵。

获得强烈的押韵

我知道什么? 我知道这个实用程序 wget的,它会下载指定 URL 处的页面。 好的,让我们执行请求 - 我们在一个以押韵单词命名的文件中得到一个 HTML 页面。 例如,让我们搜索单词“here”:

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

首先,从word文件中,选择包含该标签的行- 我们得到一堆空标签和带有文字的行。 我们删除标签本身及其结束标签 - 这里使用百分比符号而不是斜杠,因为在标签本身中已经有斜线了,为什么? 口渴 有点不理解你。 只要有兴趣,一切都很好。 我们从文件中删除所有空格,删除空行。 瞧 - 一个现成的单词列表。

要删除使用最后一个字母押韵的单词,请从原始单词中选择最后两个字母并清除列表:

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

我们观察、尝试——一切都有效……那么,“玩”这个词的列表在哪里? 那么“我要去”这个词呢? 文件是空的! 这都是因为这些词是动词,我们知道它们对那些与动词押韵的人有什么作用。 动词押韵甚至比方韵还要差,因为俄语中动词最多,而且所有动词都有相同的词尾,这就是为什么在检查词尾后它们不在最终文件中。

不过,我们并不着急。 每个单词不仅有押韵,还有协和音,有时听起来比押韵好得多——这就是为什么它们是协和音(法语协和音,来自拉丁语 assono——我听起来很和谐)。

我们得到谐音

这就是有趣的地方:通过执行脚本、发送 HTTP 请求并接收响应,谐音出现在单独的 URL 和同一页面上。 我怎么能说 wget的'你按下按钮吗? 但没办法。 可悲的是。

注意到该行中的 URL 发生了某种变化,我复制了切换到谐音后的内容并将其粘贴到新的浏览器选项卡中 - 打开了强韵律。 不是那个。

从本质上讲,我认为,对于服务器来说,发送请求的脚本是否被执行,或者用户是否手动键入它,都无关紧要。 所以? 谁知道呢,我们去看看吧。

发送到哪里? 送什么? 对服务器IP的HTTP请求,有类似GET的东西...然后有HTTP/1.1的东西...我们需要看看浏览器发送了什么以及发送到哪里。 安装 Wireshark的,看流量:

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的 对于这样的事情。 好吧,我们已经知道该怎么做了,我们先删除 Referer 和 Cookie 字段 - 我认为它们不会对此事产生太大影响:

与终端对话

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,这意味着 cookie 和引荐来源网址不会影响任何内容。 压缩是gzip,但是复制的时候复制的是ASCII字符。 确切地说,您可以删除该行 接受编码。 一切都很好 - 我们得到了一个 HTML 文档,现在带有谐音。 但这里有两个问题:如何运行 OpenSSL 并使用脚本向其传输数据? 如果在收到响应后我们仍处于 OpenSSL“shell”中,如何读取输出? 如果你能在第二个方面想出一些东西,但在第一个方面......

有就好了 哈伯我在哪里读到有关该实用程序的信息 期望,它自动执行与期望人类交互的程序的交互过程。 拥有团队更有吸引力 自动预期,生成 期望 根据您的操作编写脚本。 好吧,我们启动它,完成所有这些,这是完成的脚本。 只有他非常巨大,而这一切都是因为 OpenSSL的 显示证书、密钥和 期望 等待这一切的输出。 我们需要这个吗? 不。 我们删除整个第一个提示符,只留下最后一个换行符“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 中的“here”。 该怎么办? 当然,朋友们,每次只需生成一个新脚本即可! 不再 自动预期'哦,在帮助下 回音, 因为在我们的新版本中,除了这个词之外没有任何改变。 新问题万岁:我们如何智能地将单词从西里尔字母翻译成 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 文本,生成另一个脚本,通过 OpenSSL 从服务器请求具有谐音的网站页面。 然后我们将最后一个脚本的输出重定向到一个文件,并以老式的方式将其传递给 “过滤器” 额外的方块并将它们写入文件。

许多的交集。 底线

事实上,这正是引起最少问题的原因。 我们对两个单词执行上述过程,然后从两个列表中将每个单词进行比较,如果找到匹配,则将其输出。 现在我们有一个脚本,它接受两个单词作为输入,并显示与这两个单词押韵的单词列表,甚至考虑到谐音,而所有这一切都无需在四个选项卡之间手动切换并“通过眼睛”记住单词 - 所有这些都收集、计算并自动丢弃。 精彩的。

这本出版物的目的是表明,如果一个人需要什么,他无论如何都会去做。 非常无效、扭曲、令人毛骨悚然,但它会起作用。

来源: habr.com

添加评论