2011-01-06 117 views
3

我想實現「shell腳本調用期望腳本」,以便它不會提示用戶每次輸入ssh密碼。我從Using a variable's value as password for scp, ssh etc. instead of prompting for user input every time開始,瞭解到我應該有一個.sh文件和一個.exp文件。我在我的系統中安裝了expect(運行expect -v顯示爲expect version 5.43.0)。「命令未找到」期望腳本執行的錯誤shell腳本

在我upload-to-server.sh文件我有

cd $SOURCE_PATH/shell 
./password.exp $DESTINATION_PATH $SSH_CREDENTIALS $PROJECT_INSTALLATION_PATH $PASSWORD 
password.exp文件

而且我有

#!/usr/bin/expect -f 

set DESTINATION_PATH [lindex $argv 0]; 
set SSH_CREDENTIALS [lindex $argv 1]; 
set PROJECT_INSTALLATION_PATH [lindex $argv 2]; 
set PASSWORD [lindex $argv 3]; 

spawn scp $DESTINATION_PATH/exam.tar $SSH_CREDENTIALS':/'$PROJECT_INSTALLATION_PATH 
expect "password:" 
send $PASSWORD"\n"; 
interact 

在運行upload-to-server.sh文件我碰到下面的錯誤 -

./password.exp: line 9: spawn: command not found 
couldn't read file "password:": no such file or directory 
./password.exp: line 11: send: command not found 
./password.exp: line 12: interact: command not found 

我從多個來源(沒有。)到達上述代碼(在exp文件中)瞭解很多基礎知識)。在one source的代碼是這樣的

#!/usr/local/bin/expect 
spawn sftp -b cmdFile [email protected] 
expect "password:" 
send "shhh!\n"; 
interact 

而在another source這樣

#!/usr/local/bin/expect -f 
set TESTCASE_HOME [lindex $argv 0]; 
set TESTCASE_LIST [lindex $argv 1]; 
set PASSWORD [lindex $argv 3]; 

set timeout 200 
spawn $TESTCASE_HOME/dobrt -p $TESTCASE_HOME/$TESTCASE_LIST 
expect "*?assword:*" {send -- "$PASSWORD\r";} 
expect eof 

有一定的差異存在 -

  • 沒有在#!/usr/local/bin/expect行額外-f
  • 預計「assword:「{派 - 」$ PASSWORD \ r「;}從expect "password:" send "shhh!\n";

  • interactexpect eof更換不同。

這是我的第一個expect script所以沒有太多的想法編碼。任何指針?

感謝,
Sandeepan

+1

公鑰認證是一個選項嗎?如果是這樣,這將是更好(也是更容易)的方式。 – miku 2011-01-06 08:10:48

+0

請注意,將密碼作爲參數傳遞是不安全的。出於某種原因,您期望的腳本被解釋爲shell腳本。從你發佈的原因來看,這並不明顯。 – 2011-01-06 08:13:57

回答

1

不要做任何的這個!如上面的註釋所示,您應該使用公鑰驗證。你要走的方式讓密碼保持清晰並且脆弱。

公鑰驗證是設置比較容易的方式,例如:setup instructions

0

你確定你做

./script.exp 

而且不

. ./script.exp 

?後者會試圖解釋期望計劃。

完全同意ssh密鑰是正確的解決方案。