如何在Bash脚本中使用expect

9

请问为什么这个不起作用?

#!/bin/bash
cd /home
touch somefile
/usr/bin/expect<<FILETRANSFER
spawn scp -r -P remoteServerPort somefile remoteServerIP:/home
expect "assword:"
send "MyPassWord\r"
interact
FILETRANSFER
echo "It's done"

虽然没有出现任何错误,但是文件并没有被传输到远程服务器。我尝试了很多方法,但仍然找不到解决方案。


更好的方法是避免在 ssh(以及 scp)中输入或发送任何密码。阅读一些 ssh 教程并使用公钥。 - Basile Starynkevitch
/usr/bin/expect<<FILETRANSFER, here you are missing a space before << - Jahid
感谢您的回复。 @ Basile Starynkevitch,由于某些原因,我无法使用公共密钥。 @ Jahid,我已添加了空格,但仍无法正常工作。 - Hasan Rumman
使用 /usr/bin/expect -d 命令查看 expect 的操作。 - glenn jackman
这个脚本看起来有点“伪造”——你是在 expect 体内使用 shell 变量吗?通常我会使用 expect <<'FILETRANSFER',其中单引号有效地引用了整个 here-doc。 - glenn jackman
1个回答

15
你定义的Bash脚本正在将expect命令传递到expect的标准输入中。然而,expect命令要求其参数以文件形式或使用-c选项作为参数提供。
你有几个选项,但为了在你的脚本上添加较少的修改,你只需要使用进程替换来创建一个here-document(临时文件)来为expect命令提供参数。
#!/bin/bash 

  echo "[DEBUG] INIT BASH"

  cd /home
  touch somefile

  /usr/bin/expect <(cat << EOF
spawn scp -r -P remoteServerPort somefile remoteServerIP:/home
expect "Password:"
send "MyPassWord\r"
interact
EOF
)

  echo "[DEBUG] END BASH"

顺便说一下,我刚刚检查了一下,这里有一个包含所有可用选项的SO答案:https://dev59.com/np3ha4cB1Zd3GeqPTmIy - Cristian Ramon-Cortes
不,就像问题中发布的那样,使用stdin读取命令是完全可以的。 - glenn jackman
有没有办法用 Bourne Shell 实现这个? - Sridhar Sarnobat
1
实际上,由于没有任何依赖于Bash的内容,因此这个脚本应该可以在sh中运行。 - Cristian Ramon-Cortes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接