我之前已经意识到类似的问题,我看着它们并尝试应用我学到的东西,并有以下脚本:
#!/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
Run Code Online (Sandbox Code Playgroud)
不幸的是它似乎不起作用,我收到一条错误消息:
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"
Run Code Online (Sandbox Code Playgroud)
我不知道它意味着什么,为什么它不起作用.但是,当我使用非嵌入式期望脚本编写上述代码时:
#!/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
Run Code Online (Sandbox Code Playgroud)
它没有任何问题.那么我做错了什么?
注:通常,当其他人发布的有关使用问题,expect使用scp或ssh给出的答案是使用RSA密钥.我试过,不幸的是,在我的一台计算机上,gnome密钥环有一些糟糕的错误,这意味着我无法从rsa-key中删除我的密码,这正是我试图用if编写上述脚本的原因声明.所以请不要告诉我使用rsa密钥.
你的bash脚本正在传递expect标准输入的命令expect.这就是here-document <<EOD所做的.但是,expect...期望-c根据手册页将其命令提供在文件中,或者作为a的参数提供.下面有三个选项.买者自负; 没有人经过测试.
使用here-document 替换进程:
expect <(cat <<'EOD'
spawn ... (your script here)
EOD
)
Run Code Online (Sandbox Code Playgroud)
的EOD结束这里的文档,然后整个事情被包裹在一个<( )进程替换块.结果是expect会看到一个临时文件名,包括here-document的内容.
正如@Aserre所指出的那样,引号<<'EOD'意味着你的here-document中的所有内容都将按字面意思处理.如果这是您想要的,请将它们关闭以扩展脚本中的bash变量等.
编辑变量+ here- document:
IFS= read -r -d '' expect_commands <<'EOD'
spawn ... (your script here)
interact
EOD
expect -c "${expect_commands//
/;}"
Run Code Online (Sandbox Code Playgroud)
是的,这是一个真正的新行//- 对我来说如何逃避它并不明显.这将换行符换成分号,手册页中说这是分号.
感谢这个答案为read+定界符组合.
壳变量
expect_commands='
spawn ... (your script here)
interact'
expect -c "${expect_commands//
/;}"
Run Code Online (Sandbox Code Playgroud)
请注意,需要替换'expect命令中的任何命令(例如,after id_rsa)'\''以保留单引号块,添加文字撇号,然后重新输入单引号块.后面的换行符//与上一个选项中的换行符相同.
| 归档时间: |
|
| 查看次数: |
6163 次 |
| 最近记录: |