我想實現「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";
interact
與expect eof
更換不同。
這是我的第一個expect script
所以沒有太多的想法編碼。任何指針?
感謝,
Sandeepan
公鑰認證是一個選項嗎?如果是這樣,這將是更好(也是更容易)的方式。 – miku 2011-01-06 08:10:48
請注意,將密碼作爲參數傳遞是不安全的。出於某種原因,您期望的腳本被解釋爲shell腳本。從你發佈的原因來看,這並不明顯。 – 2011-01-06 08:13:57