我意识到类似的问题已经被问过,我看着他们,尝试运用我所学到的并具有以下脚本:嵌入bash脚本内的期望
#!/bin/bash
if [ `hostname` = 'EXAMPLE' ]
then
/usr/bin/expect << EOD
spawn scp -rp host:~/outfiles/ /home/USERNAME/outfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact
spawn scp -rp host:~/errfiles/ /home/USERNAME/errfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact
expect eof
EOD
echo 'Successful download'
fi
不幸的是,似乎没有工作和我得到一个错误消息:
spawn scp -rp host:~/outfiles/ /home/USERNAME/outfiles/
Enter passphrase for key '/home/USERNAME/.ssh/id_rsa': interact: spawn id exp0 not open
while executing
"interact"
我不知道这是什么意思,为什么它不工作。但是,当我使用非嵌入期望脚本编写上述代码时:
#!/usr/bin/expect
spawn scp -rp host:~/outfiles/ /home/USERNAME/outfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact
spawn scp -rp host:~/errfiles/ /home/USERNAME/errfiles/
expect "id_rsa':"
send "PASSWORD\r"
interact
它的工作没有任何问题。那么我做错了什么?
注意:通常当有人发布关于使用expect
来使用scp
或ssh
的问题时,给出的答案是使用rsa密钥。我试过了,不幸的是,在我的一台电脑上有一些侏儒密钥环,这意味着我无法从rsa-key中删除我的密码,这正是我试图用if编写上述脚本的原因声明。所以请不要告诉我使用rsa密钥。
如果您希望完全**执行**定界符之间的文本(在解释之前没有变量或特殊字符扩展),则必须引用您的here-doc定界符,如下所示: '/ usr/bin/expect <<“EOD”... EOD“。 [这个问题](http://stackoverflow.com/questions/4937792/using-variables-inside-a-bash-heredoc)是相似的,它有相同的问题,但反过来。 – Aserre
我只是试过'/ usr/bin/expect <<“EOD”'但它仍然给出错误'spawn scp -rp host:〜/ outfiles // home/USERNAME/outfiles/ 输入密钥'/ home /USERNAME/.ssh/id_rsa':interact:spawn id exp0未打开 执行中 “interact” 成功下载 ' –