2016-09-26 57 views
1

我最近開始使用bash自動化與chntpw的Windows救援磁盤。我試圖設置程序以使用expect命令來偵聽某個chntpw對話框問題,並在沒有任何用戶輸入的情況下輸入正確的答案。出於某種原因,在設置bash腳本使用#!/usr/bin/expect而不是#!/bin/bash之後,很多標準終端命令不再被理解。簡單的命令未找到bash(#!/ usr/bin/expect)

[email protected]:~/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 /終端命令以及expect命令。我可能會說這一切都是錯誤的,所以請糾正我,因爲我一直在解決這個問題約三天,並沒有得到很遠:(

回答

3

當你指定應該運行你的腳本的應用程序,你可以只使用腳本語言,應用程序能理解。

顯然,期望是不是bash的,不明白的bash命令。

我建議你分開這兩個劇本,寫的第一部分爲!#/bin/bash,第二次爲期望使第一個腳本調用第二個腳本並將其重定向到chntpw。

+0

這實際上很有意義。作爲bash的新手,我只是假設'!/ usr/bin/expect'是一個可選的bash解釋器,包含預期的支持。很明顯,我錯了,這就是我的困惑所在。非常感謝! – pattyd

+1

等等,所以我只是將解釋器改爲'!#/ bin/bash',而我仍然得到'fdisk:command not found'問題? **更新:**添加'sudo'修復它。 – pattyd

+0

@pattyd:另外,用腳本運行腳本'bash breezee1.sh'會將它作爲bash腳本運行,無論shebang('#!')行如何表示。通常,您應該使腳本可執行(例如,'chmod + x breezee1.sh'),然後用'./breezee1.sh'(讓shebang控制它如何運行)等東西來運行它們。 –

2

expect使用不是bash。因此,當您使用#!/usr/bin/expect時,您可以在TCL中編寫腳本。

例如,echo "BREEZEE 1.0"應該寫成:

puts "BREEZEE 1.0" 

而且你應該使用exp_send而不是send

expect manual

exp_send是一個別名發送。如果您在Tk環境中使用Expectk或Expect的其他變體,則發送由Tk定義,用於完全不同的目的。 exp_send是爲環境之間的兼容性而提供的。爲其他Expect的其他發送命令提供了類似的別名。