此脚本旨在将我家里的服务器内容安装为 mac os 中的可读/可写驱动器。不幸的是,由于我家有一个动态公共 IP 地址,服务器的 IP 地址会不时更改。我的解决方案是通过从文件中读取 IP 地址来使脚本运行。当我仅使用 expect 脚本时,一切都正常工作,但我无法弄清楚如何从 expect 中的文件中读取变量,当我在 bash 中重写 expect 脚本时,它停止工作。这是我的代码:
#!/bin/bash
file=/Users/cm4nxd/Library/Scripts/current.ip
ipaddress=$(<"$file")
/usr/bin/expect <<EOD
spawn sudo sshfs -o StrictHostKeyChecking=accept-new cm4nxd@$ipaddress:/ /Volumes/ryzen-server -oallow_other -oauto_xattr -ovolname=ryzen-server
expect "*?assword:"
send "password\r"
expect eof
EOD
echo 'yes' >> /Users/cm4nxd/Library/Scripts/done.info
答案1
通过环境传递值:
ipaddress=$(<"$file") export ipaddress /usr/bin/expect <<'EOD' spawn sudo sshfs -o StrictHostKeyChecking=accept-new cm4nxd@$env(ipaddress):/ /Volumes/ryzen-server -oallow_other -oauto_xattr -ovolname=ryzen-server # ..........................................................^^^^^^^^^^^^^^^
(17 小时后编辑)——请注意
'EOD'
必须引用. 这实际上是对整个 heredoc 进行单引号处理,这样 shell 就不会扩展 Expect 的变量。不需要 shell:在 expect 中读取文件
#!/usr/bin/env expect set fh [open /Users/cm4nxd/Library/Scripts/current.ip r] gets $fh ipaddress close $fh spawn ... user@$ipaddress ...