“命令未找到”期望脚本执行的错误shell脚本
问题描述:
我想实现“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
答
你确定你做
./script.exp
而且不
. ./script.exp
?后者会试图解释期望计划。
完全同意ssh密钥是正确的解决方案。
公钥认证是一个选项吗?如果是这样,这将是更好(也是更容易)的方式。 – miku 2011-01-06 08:10:48
请注意,将密码作为参数传递是不安全的。出于某种原因,您期望的脚本被解释为shell脚本。从你发布的原因来看,这并不明显。 – 2011-01-06 08:13:57