我可以将 bash 个参数传递给 expect 环境吗?

Can I pass bash arguements to an expect environment?

我需要自动与需要我输入密码的服务器建立 openvpn 连接。

我可以用 expect 做到这一点,但我不想在脚本中以纯文本形式保留密码。

我发现 encpass 可以帮助加密密码,我只需要获取它并获取密码的加密版本。

当我尝试将未加密的密码传递给期望时,问题就来了。据我了解,expect 和 bash 是 2 个不同的环境,bash 不能 运行 expect。到目前为止我有以下内容:

#!/usr/bin/env bash

source encpass.sh

password=$(get_secret)

{
    /usr/bin/expect <<EOF
    spawn openvpn /home/pi/client.ovpn
    expect "Enter Private Key Password:"
    send $password
    interact
EOF
}

最终结果是 运行 这个,它启动了 VPN,脚本在提示中输入了密码。

如果有更简单的方法,请告诉我。

我尝试仅使用 openvpn 和 --auth-user-pass 开关将其自动化,该开关指向其中包含密码的文件,但我也无法正常工作。

两个想法spring要记住:

  1. 如果要将期望代码嵌入到 shell 脚本中,请使用环境 传递值,并使用引用的 heredoc 来避免引用地狱(不要忘记 为发送命令“按回车键”)

    #!/usr/bin/env bash
    source encpass.sh
    password=$(get_secret)
    export password
    
    /usr/bin/expect <<'EOF'
        spawn openvpn /home/pi/client.ovpn
        expect "Enter Private Key Password:"
        send "$env(password)\r"
        interact
    EOF
    
  2. 一切尽在期待

    #!/usr/bin/env expect
    set password [exec bash -c {source encpass.sh && get_secret}]
    spawn openvpn /home/pi/client.ovpn
    expect "Enter Private Key Password:"
    send "$password\r"
    interact