使用 expect 尝试一系列密码

使用 expect 尝试一系列密码

我对使用“expect”完全陌生,显然对它一点也不了解。我的问题是,不久前我使用“encfs”保护了一些文件,虽然我给自己留下了一个文本文件,其中包含有关密码的模糊提示,但我记不住/猜不出来。所以,我很确定它是一系列大约一百种排列中的一种,我认为使用 expect 来尝试它们会很容易。到目前为止,也没有运气!

我认为 expect 有一种脚本语言,但是我不知道它在哪里定义(并且我希望不要为了这个而学习一整门编程语言!)

无论如何,我通过复制猜测和调整创建了这个脚本:

#!/usr/bin/expect
set password [lindex $argv 0]
spawn echo Trying $password
spawn /usr/bin/encfs /home/simon/.safe /home/simon/safe
expect "Password: "
send "$password\r";
interact

它测试单个密码,当我在新创建的 encfs 系统上使用它时似乎有效。但是,然后我尝试对所有排列运行它,这些排列是我在名为“tries”的文件中创建的。我使用另一个脚本执行此操作:

#!/bin/bash

while read line
do
  echo trying $line
#  ./breakone.sh "$line"
  echo Status is $?
done < tries

(第一个文件名为“breakone.sh”)如果我以所示形式运行脚本,它会遍历文件“tries”中的文本行。但是,如果我取消注释对 expect 脚本的调用,它会在第一次输入 expect 脚本后立即退出。而且,它会立即退出。通常,expect 会短暂暂停(大约 1/2 秒,可能)并报告密码错误。但是当从主脚本触发时,它会立即返回到调用脚本(我知道它会返回到调用者,因为它会打印状态,并且迭代会立即退出。

我猜这是因为 expect 已经“接管”了标准输入,以至于 while 循环不再从文件中读取,但我不知道下一步该去哪里。

欢迎提出任何建议!

(编辑,我尝试从读取文件更改为使用此文档,但这并没有改变任何东西)。

答案1

一个快速的解决方法是在 while read 循环中使用不同的文件描述符:

while read line <&3
do
  echo trying $line
  ./breakone.sh "$line"
  echo Status is $?
done 3< tries

这使得默认的标准输入保持不变

相关内容