将 bash 变量传递给 expect 脚本或从 bash 内部编写 expect 脚本

将 bash 变量传递给 expect 脚本或从 bash 内部编写 expect 脚本

此脚本旨在将我家里的服务器内容安装为 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

  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 的变量。

  2. 不需要 shell:在 expect 中读取文件

    #!/usr/bin/env expect
    
    set fh [open /Users/cm4nxd/Library/Scripts/current.ip r]
    gets $fh ipaddress
    close $fh
    
    spawn ... user@$ipaddress ...
    

相关内容