2011-01-06 122 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密钥是正确的解决方案。