我最近开始使用bash自动化chntpw
的Windows救援磁盘。我正在尝试设置程序以使用expect
命令来侦听某些chntpw
对话框问题,并在没有任何用户输入的情况下输入正确的答案。出于某种原因,在设置bash脚本以使用#!/usr/bin/expect
而不是#!/bin/bash
之后,不再理解许多标准终端命令。
我正在通过在终端输入脚本来运行脚本:
user@kali:~/Desktop/projects/breezee$ bash breezee1.sh
终端输出如下:
BREEZEE 1.0
Welcome to BREEZEE
breezee1.sh: line 9: fdisk: command not found
[Select] /dev/:
这是我的代码:
#!/usr/bin/expect
clear
echo "BREEZEE 1.0"
echo "Welcome to BREEZEE"
fdisk -l
#list partitions
echo -n "[Select] /dev/:"
#ask user to choose primary windows partition
read sda
clear
echo /dev/$sda selected
umount /dev/$sda
sudo ntfsfix /dev/$sda
sudo mount -t ntfs-3g -o remove_hiberfile /dev/$sda /mnt/
cd /mnt/Windows/System32/config
clear
chntpw -l SAM #list accounts on windows partition
chntpw -u Administrator SAM
#now supply chntpw with values to run the password clear (this answers the prompts)
expect '> '
send '1\r'
expect '> '
send '2\r'
expect '> '
send '3\r'
expect ': '
send 'y\r'
expect '> '
send 'q\r'
expect ': '
send 'y\r'
clear
echo "Operation Successfull!"
chntpw -l SAM #list accounts on windows partition
简而言之,我正在尝试使用标准bash / terminal命令以及expect
命令。我可能会说这一切都错了,所以请纠正我,因为我已经解决了这个问题大约三天并没有走远:(
答案 0 :(得分:3)
当您指定应运行脚本的应用程序时,您只能使用应用程序可以理解的脚本语言。
显然,Expect不是bash,也不理解bash命令。
我建议你将这两个脚本分开。写下!#/bin/bash
的第一部分,Expect的第二部分。使第一个脚本调用第二个脚本并将其重定向到chntpw。
答案 1 :(得分:2)
expect
使用tcl而非bash。因此,当您使用#!/usr/bin/expect
时,您可以在TCL中编写脚本。
例如,echo "BREEZEE 1.0"
应写为:
puts "BREEZEE 1.0"
您应该使用exp_send
代替send
。
exp_send 是发送的别名。如果您在Tk环境中使用Expectk或其他Expect变体,则Tk定义的发送用于完全不同的目的。提供 exp_send以实现环境之间的兼容性。其他Expect的其他发送命令也提供了类似的别名。