shell脚本执行的expect脚本中出现“command not found”错误

时间:2011-01-06 08:04:27

标签: linux bash shell expect

我正在尝试实现“shell脚本调用expect脚本”,这样它就不会每次都提示用户输入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)。

在我的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 user@yourserver.com
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

那里有一些差异 -

  • -f
  • 中有一个额外的#!/usr/local/bin/expect
  • 期待“?assword:”{send - “$ PASSWORD \ r”;}与expect "password:" send "shhh!\n";不同

  • interact已替换为expect eof

这是我的第一个expect script所以不知道要编码什么。有什么指针吗?

谢谢,
Sandeepan

2 个答案:

答案 0 :(得分:1)

不要做任何这个!您应该使用公钥认证作为上面的评论建议。你的方式将密码保留在明文中并且很脆弱。

公钥认证更容易设置,例如:setup instructions

答案 1 :(得分:0)

你确定你在做什么

./script.exp

而不是

. ./script.exp

??后者会让shell尝试解释期望程序。

完全同意ssh密钥是正确的解决方案。