2012-08-10 39 views
0

我從UNIX服務器執行follwing線:Unix的:使用期望不保留標準錯誤

expect -c 'spawn ssh otherHost chown -R user:group /usr ; expect password: ; send 123456\n ; interact ;' 

我得到的返回值0,一個空的標準錯誤,並且說/usr/... Not owner, /usr/... Not Owner ..一個標準輸出。

如果我執行命令行ssh otherHost chown -R user:group /usr單獨,然後被適當地與返回值返回該消息!錯誤流中= 0和錯誤消息。

我需要以編程方式知道是否有錯誤,並期望(我需要避免傳遞密碼)不允許我。 (一個好主意是使用expect創建sshkeys,然後通常ssh到服務器 - 但我需要服務器之間有密碼)。

無論如何,我如何才能找出使用期望時發生的錯誤?

回答

0

我習慣於在腳本中編寫所有Expect的東西。這有助於調試並增加更多的可讀性。

在期待,你可以隨時添加一個「超時」每個希望處理異常。當預期模式不匹配時,可以通過一些消息來通知情況。以SSH例如:

spawn ssh [email protected] 
expect { 
     "Password:"  {send "user123\n"; exp_continue} 
     timeout   {send_user "connection fail\n"; exit} 
     -ex "$" 
} 

在任何模式都不匹配,預計將運行timeout塊,並顯示「連接失敗」。

如果我是你,我會把複雜的ssh命令分成許多簡單的命令。即首先將ssh發送到服務器,處理登錄過程,然後執行chown內容。該腳本看起來像:

# login 
spawn ssh [email protected] 
expect { 
     -ex "(yes/no)?" {send "yes\n"; exp_continue} 
     "Password:"  {send "user123\n"; exp_continue} 
     timeout   {send_user "connection fail\n"; exit} 
     -ex "#" 
} 

# do chown 
send "chown -R user /usr\n" 
expect { 
     "No such file or directory" {send_user "No such file or directory\n"; exp_continue} 
     "Operation not permitted" {send_user "Operation not permitted\n"; exp_continue} 
     "invalid user" {send_user "Invalid user name\n"; exp_continue} 
     -ex "$" 
} 

記住,在大多數情況下,預計一無所知如果命令的成功與否。腳本必須通過預期輸出字符串來檢查自身,並處理每種情況。

對於你的情況,我覺得有一種簡單的方式通過$的值來檢查命令?如果你將原始命令分成小塊。

# after ssh login, do chown 
send "chown -R user /usr\n" 
expect -ex "$" 
send "echo rv: $?\n" 
expect { 
     "rv: 0" {send_user "command successed\n"} 
     timeout {send_user "command failed: $expect_out(buffer)\n"; exit} 
} 

希望這會有所幫助。