我正在尝试实现“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
答案 0 :(得分:1)
不要做任何这个!您应该使用公钥认证作为上面的评论建议。你的方式将密码保留在明文中并且很脆弱。
公钥认证更容易设置,例如:setup instructions
答案 1 :(得分:0)
你确定你在做什么
./script.exp
而不是
. ./script.exp
??后者会让shell尝试解释期望程序。
完全同意ssh密钥是正确的解决方案。