使用 Expect 脚本自动远程 SSH 控制计算机

如果您要进入自动化领域,Bash 脚本通常是您要走的路。但是,有一些限制,其中之一是登录到另一个设备(如Raspberry Pi)并自动运行脚本。为了在这些情况下提供帮助,我们将使用“expect”脚本自动传送 SSH 有效负载。

Bash 脚本更像是将事物捆绑在一起,因此它无法做所有事情,包括预测然后对某些变量做出反应。因此,我们将使用“expect”脚本登录到我们的 Raspberry Pi 并自动关闭它。我们还可以调整脚本以将几乎任何我们想要的有效负载传递给 Pi。

这是一个非常棒的期望脚本的用法,你可以用它做很多不同的事情,所以要知道我们的指南只是触及了如何使用期望脚本并使用它来实际做其他事情的表面将需要更多的用户交互。

接下来,您需要一台运行 Kali 或 Ubuntu 之类的 Linux 计算机——即使是 Mac 也能工作。此外,您还需要安装 arp-scan 和 expect 工具。在 Kali 上,您可以使用apt install arp-scan expect来做到这一点,您将被设置。

第一步
创建预期脚本
Expect 脚本通常与 Bash 脚本结合使用,以自动执行某些操作,例如扫描网络或传送有效负载。因为两者配合得很好,所以可以自动化各种有趣的事情。在这里,我们将使用默认凭据关闭网络上的任何Raspberry Pi。

Expect 是一种独特的脚本语言,它通过响应来自本地或远程系统的预期响应来模拟击键。将 Expect 视为一个自动化的、虚拟的你。

我们展示的expect.exp 脚本已合并到trigger.sh 脚本中,因此我们需要先创建它。如果需要,请启动一个新目录 ( mkdir ) 并将nano放入expect.exp以启动脚本草稿。然后,将下面看到的脚本复制并粘贴到其中,按Control-X退出,按Y将其添加到缓冲区,然后按 Enter保存文件。

#!/usr/bin/expect -f

set timeout 20

set ip [lindex $argv 0]

set user [lindex $argv 1]

set password [lindex $argv 2]

spawn ssh "$user\@ip" "reboot"

expect "assword:"

send "$password\r";

interact

第二步
创建触发器 Bash 脚本
在我们深入研究所有这些之前,让我们创建 trigger.sh,我们的 Bash 脚本。所以在同一个目录下,使用nano新建一个trigger.sh文件。在其中,复制并粘贴以下代码。按Control-X退出,按Y将其添加到缓冲区,然后按 Enter保存文件。

#! bin/bash
echo What is the passcode?
read loginpass
expect expect.exp $(arp-scan -l | grep Raspberry | awk '{print $1}') root $loginpass

你可以看到它以标准的 shebang ( #! ) 和bin/bash开头;这只是强制 Bash 语言用于脚本的其余部分。

在第二行,我们使用echo向用户显示提示,“密码是什么?” 然后我们读取输入的任何内容并将其保存为loginpass变量。

最后,trigger.sh 打开我们的expect脚本,我们基本上向它传递三个变量。正如在之前的 Bash 课程中所讨论的,括号 () 表示在继续执行单行中的其余命令之前,其中的所有内容都将发生,而美元符号 ($) 表示一个变量。因此,无论括号内的内容的答案是什么,都将是一个变量。

因此,等式的第一部分是运行arp 扫描。这将向本地网络上的主机发送 ARP 数据包,然后显示其响应。然后,grep是一个用于搜索文本的命令行实用程序,它查看单词Raspberry的扫描结果以寻找 Raspberry Pi。接下来,awk,另一个用于搜索文本的工具,查找从 arp-scan 和 grep 中找到的微控制器的 IP 地址,并打印出最终结果。

完成所有这些之后,它将用户名root传递给 Pi,这是 Pis 上的默认设置。这有点受 Raspberry Hunter 或rpi-hunter 的启发,它使用网络上的默认凭据寻找 Pis,尝试登录它们,然后发送有效负载。

最后,它通过用户输入并存储为loginpass变量的密码将密码传递给 Pi 。
第三步:
运行触发器 Bash 脚本
现在,让我们运行脚本。开始后,你会被要求输入敌人的密码。让我们先看看当我们输入错误密码时会发生什么。

~$ bash trigger.sh

What is the enemy passcode?
kdsjsdgliyea

spawn ssh [email protected] reboot
The authenticity of host '192.168.1.183 (192.168.1.183)' can't be established.
ECDSA key fingerprint is SHA256:wG9YqeFrX90eEjV9+APhnxVkA3DduuZ+d9RbypwKFp4E.
Are you sure you want to continue connecting (yes/no)? yes

kdsjsdgliyea
yes
Please type 'yes' or 'no': yes

Warning: Permanently added '192.168.1.183' (ECDSA) to the list of known hosts.
Welcome to meye-16b312e&!
[email protected]'s password:

如您所见,它尝试生成一个 SSH 脚本将重启命令传递给Raspberry Pi。由于我们给它错误的密码,它不起作用,所以它问我们是否要继续,这是一个“是”。接下来,它询问我们是否要登录。我们说“是”,然后它尝试登录到 Raspberry Pi,但它无法登录,因为它的密码错误。

虽然它失败了,但它仍然可以在网络上找到一个 Raspberry Pi 并尝试通过 SSH 连接到它。现在,让我们看看当我们拥有真正的密码时会发生什么。需要注意的一件事是,如果您是第一次通过 SSH 登录某个东西,它会首先要求您确认,这可能会破坏 Bash 脚本。为确保它有效,请先登录。

~$ bash trigger.sh

What is the enemy passcode?
starstar

spawn ssh [email protected] reboot
[email protected]'s password:
Connection to 192.168.1.234 closed by remote host.

如您所见,它成功检测到网络上的 Raspberry Pi,产生了一个 SSH 会话,并给了它重启命令。然后,它将用户输入的密码作为变量输入。登录后,它关闭了主机,导致 Raspberry Pi 重新启动并将我们踢出去。

Expect 脚本的工作原理
我们详细介绍了 trigger.sh 文件和它的作用,但现在让我们看一下 expect.sh 代码,看看它对 Bash 脚本传递的所有信息做了什么。

首先,它从标准的shebang ( #! )、usr/bin/expect和tack f ( -f ) 开始;这只是强制将 Expect 解释器用于脚本的其余部分。

接下来,我们设置一个超时的20秒,这样脚本超时的时间量之后。然后,我们有set ip行,它接受传递给 expect.sh 的第一个参数,这将是 trigger.sh 中的 arp-scan 结果——树莓派的 IP 地址。该LINDEX $ argv的0只是告诉它来寻找传递的第一个参数,并将其与零,这是很重要的记忆开始。

然后我们有set user行,它查找传递的第二个参数,在本例中为root。之后,set password行查找传递的第三个参数,在本例中,是提供给 trigger.sh 的用户密码。

现在事情开始变得有趣了。Expect 脚本可以生成进程,这里我们生成了一个 SSH 进程 ( spawn ssh ) 并以与在 Bash 中几乎相同的方式使用变量。它获取 u s e r 变 量 r o o t , 然 后 将 @ 与 user变量 root,然后将@与 userroot@ip变量(Pi 的 IP 地址)一起添加。这就是它连接到 Pi 的方式。然后,一旦它登录,它就会发出重启命令。

然而,在这一切发生之前,我们需要使用脚本的expect部分,在那里我们正在寻找基本上来找我们的东西并输入字符串assword。这很有趣,但我们这样做是有原因的。如果它是大写的“P”或小写的“p”,则取决于它是什么服务器,这真的无关紧要。它总是会要求我们输入密码。因此,除非它全部大写,这不太可能,否则我们很可能会获得大多数要求我们输入密码的不同方式。

所以脚本正在做的是期待一个请求或一个文本字符串,说“密码”或“密码”。如果它得到了,那么它会继续发送结果,在我们的例子中,它是用户在我们的 Bash 脚本中输入的密码。该交互线把整个脚本发挥作用。

您可以使用 Expect 脚本做很多事情
Expect 脚本不具有交互性,因此我们必须使用 Bash 脚本来传递信息。例如,我们不能在这个期望脚本中直接有用户输入。我们不能这样做很烦人,因此,拥有一个 Bash 脚本可以很好地收集您需要的所有信息,将其传递给一个期望脚本,然后期望脚本将自动执行某些操作。

总体而言,expect 脚本对于创建聊天机器人或处理任何您有期望的输入和想要自动化的响应的事情都很方便。现在,结合 Bash 脚本,您可以自动化各种强大的工具,所以这只是一个开始,我希望您可以使用它来创建一些非常有趣的自动化。

Guess you like

Origin blog.csdn.net/qq_39162487/article/details/120405086