2014-01-21 56 views
0

我已經編寫了一個期望腳本,通過ssh登錄到遠程計算機並執行命令以獲取系統信息詳細信息。我可以登錄到遠程機器並運行命令並獲取輸出。我在解析輸出時遇到了一些麻煩。我收到一些不需要的文本,並將其作爲輸出的一部分執行,我需要您的幫助來消除這些文本,並獲取相關文本作爲輸出。無法正確解析預期腳本中的命令輸出

的期望腳本下面貼

#!/usr/bin/expect 

set timeout 10 

log_user 0 

set promptEn "(>|#|%|\\$)" 

set ip [lindex $argv 0] 

set user [lindex $argv 1] 

set password [lindex $argv 2] 

set query [lindex $argv 3] 

if {[llength $argv] == 0} { 
    send_user "Usage: scriptname Ip-address Username password query\n" 
    exit 1 
} 

spawn ssh -q -o StrictHostKeyChecking=no "$user\@$ip" 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure "; exit 1 } 
    "*assword" 
} 

send "$password\r" 

expect { 
    timeout { send_user "\nLogin failed. Password incorrect.\n"; exit 1} 
    #-re "$promptEn" 
    -re $promptEn 
} 

send_user "\nPassword is correct\n" 

#command to be executed 
send "sudo dmidecode -t system |grep -w \"$query:\"\r" 

expect { 
    timeout2 { send_user "\nFailed to get password prompt on remote machine \n"; exit 1 } 
    eof { send_user "\nSSH failure "; exit 1 } 
    "*assword" 
} 

send "$password\r" 

expect { 
    timeout 
    { 
    send_user "\n Command Failed \n"; exit 1 
    } 

    -re "$promptEn" 
} 

expect -re "$query:" 



puts "$expect_out(buffer)" 


send "exit\r" 

我運行的命令行參數的腳本如下

預計sshtest.exp 192.168.4.42 testaccount密碼@ 123廠商

和我得到解析的輸出爲

Password is correct 
sudo dmidecode -t system |grep -w "Manufacturer:" 
    Manufacturer: LENOVO 
[email protected]:~# 

我只想要l但只有一行製造商:LENOVO作爲輸出,但不是其他文本。

我可以調用腳本如下

expect sshtest.exp 192.168.4.42 testaccount [email protected] Manufacturer|tail -2 |head -1讓行,但我不想這樣做,因爲這樣我會錯過了錯誤信息,如果系統不能連接。

回答

1

後 「密碼正確」,增添:log_user 0

然後,更改

puts "$expect_out(buffer)" 

set lines [split $expect_out(buffer) \n] 
foreach line [lsearch -inline -glob $lines {*Manufacturer:*}] { 
    puts $line 
}