我对使用“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
这使得默认的标准输入保持不变